Java编写飞行游戏
2017-07-18 18:23
459 查看
一丶窗口,常量,Image构造器
二丶游戏主窗口
三丶飞机
四丶子弹
五丶爆炸效果
六丶GameObject
七丶运行游戏
package tk.javazhangwei.util; import java.awt.Frame; import java.awt.Graphics; import java.awt.Image; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class MyFrame extends Frame { /** * 加载窗口 */ public void launchFrame(){ setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT); setLocation(100, 100); setVisible(true); new PaintThread().start(); //启动重画线程 addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); } /*** * * 双缓冲技术 */ private Image offScreenImage = null; public void update(Graphics g) { if(offScreenImage == null) offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT); Graphics gOff = offScreenImage.getGraphics(); paint(gOff); g.drawImage(offScreenImage, 0, 0, null); } /** * 定义一个重画窗口的线程类,是一个内部类 * @author dell * */ class PaintThread extends Thread { public void run(){ while(true){ repaint(); try { Thread.sleep(40); //1s = 1000ms } catch (InterruptedException e) { e.printStackTrace(); } } } } }
package tk.javazhangwei.util; /** * 游戏项目中用到的常量 * @author dell * */ public class Constant { public static final int GAME_WIDTH = 500; public static final int GAME_HEIGHT = 500; }
package tk.javazhangwei.util; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; public class GameUtil { private GameUtil(){} //工具类最好将构造器私有了。 public static Image getImage(String path){ BufferedImage bi=null; try { URL u = GameUtil.class.getClassLoader().getResource(path); bi = javax.imageio.ImageIO.read(u); } catch (IOException e) { e.printStackTrace(); } return bi; } }
二丶游戏主窗口
package tk.zhangwei.games; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Date; import tk.javazhangwei.util.Constant; import tk.javazhangwei.util.GameUtil; import tk.javazhangwei.util.MyFrame; /*** * 飞行游戏主窗口 * @author zw * */ public class PlaneGameFrame extends MyFrame { Image bg = GameUtil.getImage("images/bg.jpg"); Plane p = new Plane("images/plane.png", 230, 400); ArrayList bulletList = new ArrayList();//以后加上泛型 Date startTime; Date endTime; Explode bao; int bulletNumber = 18;//子弹数目设定 public void paint(Graphics g){ g.drawImage(bg, 0, 0, null); p.draw(g); //遍历子弹 for(int i=0;i<bulletList.size();i++){ Bullet b = (Bullet)bulletList.get(i); b.draw(g); //检测跟飞机的碰撞 boolean peng = b.getRect().intersects(p.getRect()); if(peng){ p.setLive(false);//飞机死掉 if(bao==null){ endTime = new Date(); bao = new Explode(p.x,p.y); } bao.draw(g); break; } } if(!p.isLive()){ printGG(g, "GAME OVER!", 50, 110, 200, Color.red); int gameTime = (int)((endTime.getTime() - startTime.getTime())/1000);//40行结束时间减去游戏开始 printGG(g, "生存时间:"+gameTime+"秒", 20, 150, 250, Color.blue); switch (gameTime/10) { case 0: case 1: printGG(g, "游戏评分:★ ", 30, 140, 300, Color.blue); break; case 2: printGG(g, "游戏评分:★ ★", 30, 140, 300, Color.blue); break; case 3: case 4: printGG(g, "游戏评分:★ ★★", 30, 140, 300, Color.blue); break; case 5: printGG(g, "游戏评分:★ ★★★", 30, 140, 300, Color.blue); break; default: printGG(g, "游戏评分:★ ★★★★", 30, 140, 300, Color.blue); break; } } } /*** * 封装飞机死后,打印窗口提示信息 * @param g * @param str * @param size */ public void printGG(Graphics g,String str,int size,int x,int y,Color color){ Color c = g.getColor(); Font f = new Font("宋体", Font.BOLD, size); g.setFont(f); g.setColor(color); g.drawString(str, x, y); g.setColor(c); } public static void main(String[] args){ new PlaneGameFrame().launchFrame(); } public void launchFrame(){ super.launchFrame();//继续使用父类,如果不使用,只会操作键盘监听 //增加键盘监听 addKeyListener(new KeyMonitor()); //生成一堆子弹 for(int i =0;i<bulletNumber;i++){ //生成子弹数目 Bullet b = new Bullet(); bulletList.add(b); } startTime = new Date(); } //定义一个内部类,方便使用外部类的普通属性 class KeyMonitor extends KeyAdapter{ @Override public void keyPressed(KeyEvent e) { System.out.println("按下"+e.getKeyCode()); p.add(e);//调用键盘按下事件 } @Override public void keyReleased(KeyEvent e) { System.out.println("释放"+e.getKeyCode()); p.reduce(e);//如果不调用这个方法,当你弹起这个按键,飞机一直会往那个方向飞,不会停止 } } }
三丶飞机
package tk.zhangwei.games; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.lang.invoke.SwitchPoint; import tk.javazhangwei.util.GameUtil; /*** * 构造飞机方法 * @author zw * */ public class Plane extends GameObject { Image img; int speed = 6; private boolean live = true;//默认为true boolean left,up,right,down; public void draw(Graphics g){ if(live){ g.drawImage(img, (int)x, (int)y, null); move(); } } /* * 八个方向的算法 */ public void move(){ //给飞机增加移动属性 if(left){ x -=speed; } if(right){ x +=speed; } if(up){ y -=speed; } if(down){ y +=speed; } } public void add(KeyEvent e){//键盘按下的操作 switch (e.getKeyCode()) { case 37: left = true; break; case 38: up = true; break; case 39: right = true; break; case 40: down = true; break; default: break; } } public void reduce(KeyEvent e){//键盘谈起,禁止移动 switch (e.getKeyCode()) { case 37: left = false; break; case 38: up = false; break; case 39: right = false; break; case 40: down = false; break; default: break; } } public Plane(String imgpath, double x, double y) {//传入参数,增加图片初始化 this.img = GameUtil.getImage(imgpath); this.x = x; this.y = y; this.width = img.getWidth(null); this.height = img.getHeight(null); } public Plane(){ } public boolean isLive() { return live; } public void setLive(boolean live) { this.live = live; } }
四丶子弹
package tk.zhangwei.games; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import tk.javazhangwei.util.Constant; /** * 设置子弹 * @author zw * */ public class Bullet extends GameObject{ double degree; public Bullet(){ degree = Math.random()*Math.PI*2;//设置随机角度,在0到360度之间 x = Constant.GAME_WIDTH/2; y = Constant.GAME_HEIGHT/2; width = 10; height = 10; } public void draw(Graphics g){ Color c = g.getColor(); g.setColor(Color.yellow); g.fillOval((int)x, (int)y, width, height); x += speed*Math.cos(degree); y += speed*Math.sin(degree); if(y>Constant.GAME_HEIGHT-height||y<30){ degree = -degree; } if(x<0||x>Constant.GAME_WIDTH-width){ degree = Math.PI-degree; } g.setColor(c); } }
五丶爆炸效果
package tk.zhangwei.games; import java.awt.Graphics; import java.awt.Image; import tk.javazhangwei.util.GameUtil; /*** * 爆炸 * @author zw * */ public class Explode { double x,y; static Image[] imgs = new Image[16]; static{ for(int i=0;i<=15;i++ ){ imgs[i] = GameUtil.getImage("explode/e"+(i+1)+".gif"); imgs[i].getWidth(null); } } int count; public void draw(Graphics g){ if(count<=15){ g.drawImage(imgs[count], (int)x, (int)y, null); count++; } } public Explode(double x,double y){ this.x = x; this.y = y; } }
六丶GameObject
package tk.zhangwei.games; import java.awt.Rectangle; public class GameObject { double x,y;//子弹初始位置 double degree; int speed = 3; int width ; int height ; //获取子弹矩形 public Rectangle getRect(){ Rectangle r = new Rectangle((int)x, (int)y, width, height); return r; } public GameObject(double x, double y, double degree, int speed, int width, int height) { super(); this.x = x; this.y = y; this.degree = degree; this.speed = speed; this.width = width; this.height = height; } public GameObject(){ } }
七丶运行游戏
相关文章推荐
- java编写的简陋的三子棋游戏
- 用Java编写扫雷游戏--算法思考
- Java 游戏 连连看 语言编写 多媒体
- java编写的简单图片匹配游戏
- IT第十一天、第十二天、第十三天 - 数组的应用、飞行棋游戏的编写和总结
- Java编写网络打字游戏
- java编写简单五子棋游戏感悟
- 用Java编写的一个抽奖游戏
- Java 小例子:编写石头剪刀布游戏
- JAVA编写扫雷游戏布雷图
- C#学习编写的飞行棋游戏
- C#编写飞行棋游戏
- Java编写的五子棋游戏
- java吃豆豆游戏-1控制按钮编写
- 用java编写的一个简单的猜字母游戏
- 利用java编写的精灵吃豆的游戏
- java编写的猜数字游戏
- java编写游戏的几本参考书
- MyGame--java语言编写的打飞机游戏(附源码下载)
- Java编写掷骰子游戏