飞机躲子弹游戏

  • cn.bjst.plane
    • Bullet.java
    • Explode.java
    • GameObject.java
    • Plane.java
    • PlaneGameFrame.java
  • cn.bjst.util
    • Constant.java
    • GameUtil.java
    • GameUtil1.java
    • MyFrame.java

cn.bjst.plane

Bullet.java

Bullet类设置子弹的坐标,速度,角度,宽度和高度

package cn.bjst.plane;import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import cn.bjst.util.Constant;public class Bullet extends GameObject{int speed=5;double degree;public Bullet() {degree= Math.random()*Math.PI*2;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);g.setColor(c);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;}}}

Explode.java

Explode爆炸效果类:快速读取图片轮播形成动态的爆炸效果。

package cn.bjst.plane;import java.awt.Graphics;
import java.awt.Image;
import cn.bjst.util.GameUtil;
/** * 爆炸类*/
public class Explode {double x,y;static Image[] imgs=new Image[16];int count;static {for(int i=0;i<16;i++) {imgs[i] =GameUtil.getImage("images/explode/e"+(i+1)+".gif");imgs[i].getWidth(null);}}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.java

package cn.bjst.plane;import java.awt.Image;
import java.awt.Rectangle;public class GameObject {Image img;double x,y;int speed =10;int width,height;public Rectangle getRect() {return new Rectangle((int)x,(int)y,width,height);}public GameObject(Image img, double x, double y, int speed, int width, int height) {super();this.img = img;this.x = x;this.y = y;this.speed = speed;this.width = width;this.height = height;}public GameObject() {}
}

Plane.java

Plane类:设置飞机的图片,坐标,移动方向,移动速度,是否存活。

package cn.bjst.plane;import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import cn.bjst.util.GameUtil;
import cn.bjst.util.GameUtil1;public class Plane extends GameObject{private boolean left,up,right,down;boolean live =true;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 addDirection(KeyEvent e) { switch (e.getKeyCode()) {case KeyEvent.VK_LEFT:   left=true;break;case KeyEvent.VK_RIGHT:    right=true;break;case KeyEvent.VK_UP:up=true;break;case KeyEvent.VK_DOWN:down=true;break;default:break;}}public void minusDirection(KeyEvent e) { switch (e.getKeyCode()) {case KeyEvent.VK_LEFT:    left=false;break;case KeyEvent.VK_RIGHT:   right=false;break;case KeyEvent.VK_UP:up=false;break;case KeyEvent.VK_DOWN:down=false;break;default:break;}}public Plane(String imgpath,double x,double y)  {this.img= GameUtil.getImage(imgpath);this.width = img.getWidth(null);   this.height = img.getHeight(null); this.x=x;this.y=y;}public Plane() {}public boolean isLive() {return live;}public void setLive(boolean live) {this.live = live;}}

PlaneGameFrame.java

于该类运行程序

package cn.bjst.plane;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.lang.invoke.SwitchPoint;
import java.util.ArrayList;
import java.util.Date;
import cn.bjst.util.Constant;
import cn.bjst.util.GameUtil;
import cn.bjst.util.MyFrame;public class PlaneGameFrame extends MyFrame{Image bg=GameUtil.getImage("images/bg.jpg");   Plane p =new Plane("images/plane.png",50,50);ArrayList bulletList = new ArrayList();//泛型暂时未学,学后强烈建议加上Explode bao ;Date startTime;Date endTime;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()) {printInfo(g,"Game Over",50,100,200,Color.WHITE);int period =(int )(endTime.getTime()-startTime.getTime())/1000;printInfo(g, "时间:"+period+"秒", 20, 120,260, Color.yellow);switch (period/10) {case 0:printInfo(g, "等级-兵", 30, 110,230, Color.WHITE);break;case 1:printInfo(g, "等级-排", 30, 110,230, Color.GREEN);break;case 2:printInfo(g, "等级-连", 30, 110,230, Color.BLUE);break;case 3:printInfo(g, "等级-营", 30, 110,230, Color.PINK);break;default:break;}}}/**在窗口上打印信息*/public void printInfo(Graphics g,String str,int size,int x,int y,Color color) {Color c =g.getColor();g.setColor(color);Font   f =new Font("宋体",Font.BOLD,size);g.setFont(f);g.drawString(str,x,y);   g.setColor(c);}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);}public static void main(String[] args) {new PlaneGameFrame().launchFrame();}public void launchFrame() {super.launchFrame();//增加键盘的监听addKeyListener(new KeyMonitor());//生成一堆子弹for(int i=0;i<3;i++) {Bullet b=new Bullet();bulletList.add(b);}startTime = new Date();}//定义内部类,可以方便的使用外部类的普通属性class KeyMonitor extends KeyAdapter{@Overridepublic void keyPressed(KeyEvent e) {System.out.println("按下"+e.getKeyCode());p.addDirection(e);}@Overridepublic void keyReleased(KeyEvent e) {System.out.println("释放"+e.getKeyCode());p.minusDirection(e);}}}

cn.bjst.util

定义工具类在cn.bjst.util包下面

1.Constant 用来存放常量的类 :窗体的宽度、高度、坐标x,y。

2.GameUtil是一个通用的读取图片的类,它的构造器私有化,即不能被实例化,但是提供了一个静态方法。
3.本文中原GameUtil1代码有问题已更改使用GameUtil,有兴趣的小伙伴可以尝试一下原GameUtil1感受一下问题所在,下面有解析。

Constant.java

package cn.bjst.util;public class Constant {public static final int GAME_WIDTH = 500;public static final int GAME_HEIGHT = 900;
}

GameUtil.java

package cn.bjst.util;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;public class GameUtil {// 工具类最好将构造器私有化。private GameUtil() {} /*** 返回指定路径文件的图片对象* @param path* @return*/public static Image getImage(String path) {BufferedImage bi = null;try {URL u = GameUtil.class.getClassLoader().getResource(path);bi = ImageIO.read(u);} catch (IOException e) {e.printStackTrace();}return bi;}
}

GameUtil1.java

package cn.bjst.util;import java.awt.Image;
import java.awt.Toolkit;public class GameUtil1{private GameUtil1(){}public static Image getImage(String path) {return Toolkit.getDefaultToolkit().getImage(GameUtil1.class.getClassLoader().getResource(path));}}

MyFrame.java

Myframe extends Frame 是一个通用的窗体类

package cn.bjst.util;import java.awt.Frame;
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() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}class PaintThread extends Thread{public void run() {while(true) {repaint();try {Thread.sleep(40); //1s=1000ms                 }catch(InterruptedException e ) {e.printStackTrace();}}}    }
}

代码源出处尚学堂300集,上文代码是经过更改后的,因源代码中GameUtil1.java中存在一些问题,所以这里面我把源代码更改为用GameUtil.java中使用,因为对这块不太了解咨询了大佬。


该文为自己练习使用,仅供参考若需要飞机、爆炸图片可评论留下QQ邮箱!

Java-实现飞机躲子弹游戏相关推荐

  1. Java窗体实现飞机躲子弹游戏

    前几天做了Java窗体实现飞机躲子弹游戏,我觉得很有必要做个笔记方便以后自己和他人查阅. 主要功能是:在一个窗体里面,用方向键盘控制飞机图片移动来躲避满屏的子弹. 由于篇幅的关系,这里主要做一个整体的 ...

  2. Java窗体实现飞机躲子弹游戏,java awt swing 飞机躲子弹

    [实例简介] [实例截图] [核心代码] package com.plane.game; import javax.swing.JComboBox; import javax.swing.JFrame ...

  3. python打飞机躲子弹

    打飞机躲子弹游戏极为简约,就是漫画式的竖版弹幕作品,游戏也不分什么模式,就是不停的打飞机,看谁的分数高,有两种增益状态随机出现,蓝色的是可以限时增强飞机子弹威力的道具,红色的则是全屏清敌的炸弹.敌机也 ...

  4. 【Java】Java基础飞机大战小游戏完整代码

    Java基础飞机大战小游戏完整代码 先来展示一下代码实现结果图 主函数ShootGame 初始化游戏原始背景图片,游戏人物图片,游戏开始结束图片:构建产生敌人算法:产生英雄机算法:发射子弹算法:判断是 ...

  5. 基于Java的飞机雷电射击游戏的设计实现(Eclipse开发)

    资源下载地址:https://download.csdn.net/download/sheziqiong/86937281 资源下载地址:https://download.csdn.net/downl ...

  6. java.swing 飞机大战小游戏

    上午没事刷到网上最近炒热了一些简单的小游戏和爱心代码,单身8个月了,对爱心代码不是很感冒,所以想蹭个热度,写一个飞机大站来玩玩. 首先,分析小游戏需要那些技术与怎么设计: 窗体,因为是java小游戏, ...

  7. 飞机躲子弹小游戏案例

    如今的网络世界,各种各样的小游戏层出不穷,但随着游戏行业的发展,有的小游戏淡出了玩家们的视野,有的小游戏则被程序员们按照现在玩家的喜好更改为其他的形式,继续陪伴着玩家.虽然我对这些小游戏关注少了,但我 ...

  8. C语言关于飞机躲子弹的游戏,团队项目(2.1) -- 飞机躲避小游戏

    这个项目开始于2019年下半年,也就是大二上长学期的时候,当时申报了一个校级srtp项目,自拟题为"基于瞳孔检测的注意力检测方法研究",而这一部分是作为最后眼控展示的一个小平台.有 ...

  9. java实现飞机大战小游戏——————【附素材、源码、逐行注释讲解】

    java飞机小游戏,实现了以下功能: 1.我方小飞机可以通过鼠标移动来控制. 2.蜜蜂(必须打死而不是碰到,并且碰到蜜蜂会失去生命值)分为两种奖励 获得生命值或者子弹翻3倍. 3.当鼠标移动到界面外可 ...

最新文章

  1. Python脚本语言写法
  2. 字节跳动AI Lab社招以及实习生内推
  3. POJ - 3436 ACM Computer Factory(最大流+输出残余网络)
  4. 转:springboot servlet使用配置
  5. 小程序居然可以用WXS模拟实现过滤器!
  6. java see 方法_Java 反射常用方法
  7. 计算机研究所专业课,【择校必看】十三所计算机专业课只考数据结构的985院校!...
  8. html鼠标响应事件吗,学习JavaScript鼠标响应事件
  9. fedora16设置root登录
  10. python自动化测试框架哪个好_Python 自动化测试框架unittest与pytest的区别
  11. 【SpringMVC学习11】SpringMVC中的拦截器
  12. Android零基础入门第85节:Fragment使用起来非常简单
  13. 20181027 考试记录
  14. Mendix App推送服务之实践分享
  15. zuc算法代码详解_ZUC算法原理及实现过程[共3页]
  16. HTML页面跳转及表单详解
  17. c语言中求圆台体积公式,圆台体积公式_圆台体积计算公式(附计算器)
  18. 【笔记】2022.06.20 python数据分析三大神器numpy、pandas、matplotlib
  19. 哈哈哈哈,IT总监VS美发总监
  20. 啥是CTF?新手如何入门CTF?

热门文章

  1. 使用python进行分布分析(算数平均、几何平均、偏度、峰度,绘制直方图),以2022年上半年沪深300指数为例
  2. 奇兔recovery卡刷教程_奇兔Recovery(安卓手机刷机助手)V8.2.1.4 最新版
  3. 如何去掉德国Kilu免费空间的广告
  4. 字母频率统计 c语言,C语言统计字母使用频率
  5. 这里是Python爬虫的起点,抢占资源啦(Python学习教程)
  6. DBeaver 工具的使用
  7. Delivering Smiles:亚马逊的温暖进行时
  8. Unity官方图形教程 学习笔记(三) -- 线性工作流
  9. 【IoT】创业:如何设计强有力的价值主张?
  10. Sailfish OS