Java编写飞行游戏
来源:互联网 发布:js添加节点并添加内容 编辑:程序博客网 时间:2024/05/16 06:10
一丶窗口,常量,Image构造器
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(){ }}
七丶运行游戏
阅读全文
0 0
- Java编写飞行游戏
- C#编写飞行棋游戏
- java编写飞行棋
- C#学习编写的飞行棋游戏
- 飞行游戏A计划
- 手势控制飞行游戏
- 飞行游戏demo
- 骑士飞行棋游戏
- JAVA编写的猜拳游戏
- Java编写的五子棋游戏
- 用Java编写扫雷游戏
- java编写简易扑克牌游戏
- java编写猜数字游戏
- Java编写网络打字游戏
- Flash飞行游戏物理引擎
- 飞行射击类游戏,Helloworldgame
- c#飞行棋游戏头
- 自制游戏(一) 飞行射击游戏
- KMP+dp NOI2014 动物园(PS:不是官方做法)
- MiniGUI 体系结构之二
- Leetcode 305. Number of Islands II
- 八大排序法之直接插入排序法
- 使用SVN将项目导入服务器:
- Java编写飞行游戏
- tensorflow学习——ProgressBar输出进度条
- mybatis @Alias注解在类上的使用方式
- 第二届高校大数据比赛之鼠标轨迹识别
- 两个有序数组合并为一个有序数组
- Laravel实现简单的API认证
- Bootstrap附加导航插件
- T4代碼生成器(1)
- RxJava原理分析