Java小程序之山寨版超级玛丽_第1页
Java小程序之山寨版超级玛丽_第2页
Java小程序之山寨版超级玛丽_第3页
Java小程序之山寨版超级玛丽_第4页
Java小程序之山寨版超级玛丽_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Java小程序之山寨版超级玛丽一、游戏基本功能1、能够向左向右行走(键盘监听)2、能够跳跃3、能够发射子弹4、能够检测和障碍物之间的碰撞5、背景图片的移动二、游戏运行界面三、游戏大致实现思路:1.窗体2.自己角色的添加3.背景图片的添加4.背景图片的移动5.人物的移动和跳跃6.砖头、水管等等障碍物的添加7.任务和障碍物的碰撞难点分析:1.人物的多键控制1)给人物设定方向boolean变量:向左、向右、向上、向下2)通过键盘监听来修改方向的变量值 按下某个键的时候,我们把相应方向改为true,释放的时候改false2.地图配置自定义文件读取方式实现:文件流的使用和字符串String类的方法调用3

2、.碰撞检测封装一个Rectangle类的对象4.子弹添加1)先定义一个容器,这个用于封装所有的子弹对象2)按下某个键的时候,创建一个子弹对象(以角色的坐标为基准初始化)3)把子弹对象添加到容器当中4)在paint方法中,遍历容器,取出子弹对象并进行绘制5)检测子弹如果超出了窗体边界,则需要把当前子弹从容器当中移除掉四、程序源代码:代码结构图:分了三个包、敌人类包、游戏界面类包、游戏地图配置包com.huaxin.mario包:java view plain copy print?在CODE上查看代码片派生到我的代码片package com.huaxin.mario; import java.a

3、wt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.ArrayList; import javax.swing.ImageIcon; import javax.swing.JFrame; import com.huaxin.enery.Enery; import com.huaxin.enery.Pipe; import Util.Map; public class GameFrame extends JFrame public Mario mario; public

4、 Enery pipe,cion,brick; /背景图片 public BackgroundImage bg ; /容器装敌人 public ArrayList<Enery> eneryList = new ArrayList<Enery>(); /子弹容器 public ArrayList<Boom> boomList = new ArrayList<Boom>(); /子弹的速度 public int bspeed=0; /画地图,制定规则,是1画砖头,是2画金币,是3画水管 public int map =null; /构造函数里面初始化

5、背景图片和马里奥对象 public GameFrame() throws Exception mario = new Mario(this); mario.start(); Map mp= new Map(); bg = new BackgroundImage(); /窗体重绘线程 new Thread() public void run() while(true) /重绘窗体 repaint(); /检查子弹是否出界 checkBoom(); try Thread.sleep(10); catch (InterruptedException e) e.printStackTrace(); .

6、start(); map=mp.readMap(); /读取地图,并配置地图 for (int i = 0; i < map.length; i+) for (int j = 0; j < map0.length; j+) /读取到的是1,画砖头 if(mapij=1) brick = new Pipe(j*30,i*30,30,30,new ImageIcon("image/brick.png").getImage(); eneryList.add(brick); /读到2画金币 if(mapij=2) cion = new Pipe(j*30,i*30,30

7、,30,new ImageIcon("image/coin_brick.png").getImage(); eneryList.add(cion); /读到3画水管 if(mapij=3) pipe = new Pipe(j*30,i*30,60,120,new ImageIcon("image/pipe.png").getImage(); eneryList.add(pipe); /设置背景音乐 com.huaxin.music.Util.startMusic("music/bg1.wav"); public void initFr

8、ame() /设置窗体相关属性 this.setSize(800,450); this.setTitle("山寨版超级玛丽"); this.setResizable(false); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(3); this.setVisible(true); /该窗体添加键盘监听 KeyListener kl = new KeyListener(this); this.addKeyListener(kl); public void paint(Graphics g) /利

9、用双缓冲画背景图片和马里奥 BufferedImage bi =(BufferedImage)this.createImage(this.getSize().width,this.getSize().height); Graphics big =bi.getGraphics(); big.drawImage(bg.img, bg.x, bg.y, null); for (int i = 0; i <eneryList.size(); i+) Enery e =eneryList.get(i); big.drawImage(e.img, e.x, e.y, e.width, e.heigh

10、t,null); /画子弹 for (int i = 0; i < boomList.size(); i+) Boom b =boomList.get(i); Color c =big.getColor(); big.setColor(Color.red); big.fillOval(b.x+=b.speed, b.y, b.width, b.width); big.setColor(c); /画人物 big.drawImage(mario.img, mario.x, mario.y, mario.width, mario.height,null); g.drawImage(bi,0,0

11、,null); /检查子弹是否出界,出界则从容器中移除,不移除的话,内存会泄漏 public void checkBoom() for (int i = 0; i < boomList.size(); i+) Boom b = boomList.get(i); if(b.x<0 | b.x>800) boomList.remove(i); java view plain copy print?在CODE上查看代码片派生到我的代码片package com.huaxin.mario; import java.awt.Image; import java.awt.Rectangle

12、; import javax.swing.ImageIcon; import com.huaxin.enery.Enery; /自己的角色类 public class Mario extends Thread public GameFrame gf; public boolean jumpFlag=true; /马里奥的坐标 public int x=0,y=358; /马里奥的速度 public int xspeed=5,yspeed=1; /马里奥的宽高 public int width=30,height=32; /马里奥的图片 public Image img = new ImageI

13、con("image/mari1.png").getImage(); public boolean left=false,right=false,down=false,up=false; public String Dir_Up="Up",Dir_Left="Left",Dir_Right="Right",Dir_Down="Down" public Mario (GameFrame gf) this.gf=gf; this.Gravity(); public void run() while(

14、true) /向左走 if(left) /碰撞到了 if(hit(Dir_Left) this.xspeed=0; if(this.x>=0) this.x-=this.xspeed; this.img=new ImageIcon("image/mari_left.gif").getImage(); this.xspeed=5; /向右走 if(right) if(hit(Dir_Right) this.xspeed=0; /任人物向右移动 if(this.x<400) this.x+=this.xspeed; this.img=new ImageIcon(&q

15、uot;image/mari_right.gif").getImage(); if(this.x>=400) /背景向左移动 gf.bg.x-=this.xspeed; /障碍物项左移动 for (int i = 0; i <gf.eneryList.size(); i+) Enery enery = gf.eneryList.get(i); enery.x-=this.xspeed; this.img=new ImageIcon("image/mari_right.gif").getImage(); this.xspeed=5; /向上跳 if(up

16、) if(jumpFlag && !isGravity) jumpFlag=false; new Thread() public void run() jump(); jumpFlag=true; .start(); try this.sleep(20); catch (InterruptedException e) e.printStackTrace(); /向上跳的函数 public void jump() int jumpHeigh=0; for (int i = 0; i < 150; i+) gf.mario.y-=this.yspeed; jumpHeigh+

17、; if(hit(Dir_Up) break; try Thread.sleep(5); catch (InterruptedException e) e.printStackTrace(); for (int i = 0; i <jumpHeigh; i+) gf.mario.y+=this.yspeed; if(hit(Dir_Down) this.yspeed=0; try Thread.sleep(5); catch (InterruptedException e) e.printStackTrace(); this.yspeed=1;/还原速度 /检测碰撞 public boo

18、lean hit(String dir) Rectangle myrect = new Rectangle(this.x,this.y,this.width,this.height); Rectangle rect =null; for (int i = 0; i < gf.eneryList.size(); i+) Enery enery = gf.eneryList.get(i); if(dir.equals("Left") rect = new Rectangle(enery.x+2,enery.y,enery.width,enery.height); else

19、 if(dir.equals("Right") rect = new Rectangle(enery.x-2,enery.y,enery.width,enery.height); else if(dir.equals("Up") rect = new Rectangle(enery.x,enery.y+1,enery.width,enery.height); else if(dir.equals("Dwn") rect = new Rectangle(enery.x,enery.y-2,enery.width,enery.height

20、); /碰撞检测 if(ersects(rect) return true; return false; /检查是否贴地 public boolean isGravity=false; public void Gravity() new Thread() public void run() while(true) try sleep(10); catch (InterruptedException e) e.printStackTrace(); if(!jumpFlag) while(true) if(!jumpFlag) break; if(hit(Dir_Down) b

21、reak; if(y>=358) isGravity=false; else isGravity=true; y+=yspeed; try sleep(10); catch (InterruptedException e) e.printStackTrace(); .start(); java view plain copy print?在CODE上查看代码片派生到我的代码片package com.huaxin.mario; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import javax.swi

22、ng.ImageIcon; /键盘按下监听类 public class KeyListener extends KeyAdapter public GameFrame gf; public boolean jumpFlag=true; public KeyListener(GameFrame gf) this.gf=gf; /键盘监听 public void keyPressed(KeyEvent e) int code = e.getKeyCode(); switch(code) /向右走 case 39: gf.mario.right=true; break; /向左走 case 37:

23、gf.mario.left=true; break; case 66: addBoom(); break; /向上跳 case 74: gf.mario.up=true; break; /添加子弹 public void addBoom() Boom b = new Boom(gf.mario.x,gf.mario.y+5,10); if(gf.mario.left) b.speed=-2; if(gf.mario.right) b.speed=2; gf.boomList.add(b); /键盘释放监听 public void keyReleased(KeyEvent e) int code

24、=e.getKeyCode(); if(code=39) gf.mario.right=false; gf.mario.img=new ImageIcon("image/mari1.png").getImage(); if(code=37) gf.mario.left=false; gf.mario.img=new ImageIcon("image/mari_left1.png").getImage(); if(code=74) gf.mario.up=false; java view plain copy print?在CODE上查看代码片派生到我的代

25、码片package com.huaxin.mario; import java.awt.Image; import javax.swing.ImageIcon; public class BackgroundImage public int x=0,y=0; public int ox=0,oy=0; public Image img=new ImageIcon("image/startBack.jpg").getImage(); java view plain copy print?在CODE上查看代码片派生到我的代码片package com.huaxin.mario;

26、/子弹类 public class Boom /子弹的坐标,大小,速度 int x,y; int width; int speed=1; public Boom(int x, int y, int width) super(); this.x = x; this.y = y; this.width = width; 主函数类,作为整个程序的入口java view plain copy print?在CODE上查看代码片派生到我的代码片package com.huaxin.mario; public class Test /主函数,程序入口 public static void main(Str

27、ing args) throws Exception GameFrame gf = new GameFrame(); gf.initFrame(); com.huaxin.enery包:java view plain copy print?在CODE上查看代码片派生到我的代码片<span style="color:#333333;">package com.huaxin.enery; import java.awt.Image; /障碍物的抽象父类 public abstract class Enery public int x,y; public int wi

28、dth,height; public Image img; public Enery(int x, int y, int width, int height,Image img) this.x = x; this.y = y; this.width = width; this.height = height; this.img=img; </span><span style="color:#ff0000;"> </span> java view plain copy print?在CODE上查看代码片派生到我的代码片package com

29、.huaxin.enery; import java.awt.Image; /金币类 public class Coin extends Enery public Coin(int x, int y, int width, int height, Image img) super(x, y, width, height, img); java view plain copy print?在CODE上查看代码片派生到我的代码片package com.huaxin.enery; import java.awt.Image; /砖头类 public class Brick extends Enery

30、 public Brick(int x, int y, int width, int height, Image img) super(x, y, h, height, img); java view plain copy print?在CODE上查看代码片派生到我的代码片package com.huaxin.enery; import java.awt.Image; /水管类 public class Pipe extends Enery public Pipe(int x, int y, int width, int height, Image img) super(x, y, width

31、, height, img); com.huaxin.util包:java view plain copy print?在CODE上查看代码片派生到我的代码片package Util; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.util.ArrayList; /地图配置类 public class Map /数据容器 public ArrayLi

32、st<String> list = new ArrayList<String>(); public int map=null; public int readMap() throws Exception / 构造文件输入流 FileInputStream fis = new FileInputStream("map.txt"); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); /直接读取一行数据 String value =br.readLine(); while(value!=null) /将读取到的一行数据加入到容器中 list.add(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论