第十三章 J20飞机游戏项目

DAY10-DAY11

通过键盘控制飞机前后移动,躲避炮弹,看谁坚持的时间长。如果碰到炮弹,则发生爆炸,游戏结束,并显示本次生存的时间。

图片资源

images包下存放:beijing.jpg(背景图)、feiji.png(飞机图)、explode文件夹(包含16张爆炸效果图,按顺序命名为bz1.gif - bz16.gif)

cn.sxt.game包下存放代码

  • 飞机游戏的主窗口
package cn.sxt.game;import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;
import javax.swing.JFrame;public class MyGameFrame extends Frame{Image beijing = GameUtil.getImage("images/beijing.jpg");Image feiji = GameUtil.getImage("images/feiji.png");Plane plane = new Plane(feiji,250,250);//创建飞机对象Shell[] shells = new Shell[50];//创建炮弹对象Explode bao;//创建爆炸对象Date startTime = new Date();//游戏开始时间Date endTime;//游戏结束时间int period;@Overridepublic void paint(Graphics g) {  //自动被调用,g相当于一个画笔// TODO Auto-generated method stubsuper.paint(g); //不能省略Color c = g.getColor();g.drawImage(beijing, 0, 0, null);//画背景plane.drawSelf(g); //画飞机//shell.draw(g); //画炮弹//画出所有的炮弹for (int i = 0; i < shells.length; i++) {shells[i].draw(g);//飞机和炮弹的碰撞检测boolean peng = shells[i].getRect().intersects(plane.getRect());if (peng) {plane.live = false;//飞机死了if(bao==null){bao = new Explode(plane.x,plane.y);endTime = new Date();period = (int)((endTime.getTime() - startTime.getTime())/1000);}bao.draw(g);}//计时功能,给出提示if(!plane.live) {    g.setColor(Color.red);Font f = new Font("宋体",Font.BOLD,50);g.setFont(f);g.drawString("时间:"+period+"秒",(int)plane.x,(int)plane.y);}}g.setColor(c);}//帮助我们反复重画窗口class PaintThread extends Thread{@Overridepublic void run() {//super.run();while(true) {//System.out.println("窗口画一次!");repaint();//重画try {Thread.sleep(40); //1s=1000ms,停顿40毫秒,相当于1s25张左右的图片} catch (InterruptedException e) {e.printStackTrace();}}}}//定义键盘监听内部类class KeyMonitor extends KeyAdapter {@Overridepublic void keyPressed(KeyEvent e) {plane.addDirection(e);}@Overridepublic void keyReleased(KeyEvent e) {plane.minusDirection(e);}}/*** 初始化窗口*/public void launchFrame() {this.setTitle("尚学堂JAVA300集实战小项目");this.setVisible(true);this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);this.setLocation(300, 300);this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});new PaintThread().start();//启动重画窗口的线程addKeyListener(new KeyMonitor());//给窗口增加键盘监听//初始化50个炮弹for (int i = 0; i < shells.length; i++) {shells[i] = new Shell();}}public static void main(String[] args) {MyGameFrame f = new MyGameFrame();f.launchFrame();}//添加双缓冲技术,解决闪屏问题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);}  }
  • Constant类:存放项目用到的常量,方便修改
package cn.sxt.game;public class Constant {public static final int GAME_WIDTH = 500;public static final int GAME_HEIGHT = 500;
}
  • GameUtil类:加载图片代码
package cn.sxt.game;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() {} 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;}
}
  • GameObject类:游戏物体的父类,方便创建游戏物体类
package cn.sxt.game;import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;public class GameObject {Image img;double x,y;int speed;int width,height;public void drawSelf(Graphics g) {g.drawImage(img, (int)x, (int)y, null);}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(Image img, double x, double y) {super();this.img = img;this.x = x;this.y = y;}public GameObject() {super();}//返回物体所在的矩形,便于后续的碰撞检测public Rectangle getRect() {return new Rectangle((int)x,(int)y,width,height);}}
  • Plane类:飞机
package cn.sxt.game;import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;public class Plane extends GameObject{boolean left,up,right,down;boolean live = true;public void drawSelf(Graphics g) {if (live) {g.drawImage(img, (int)x, (int)y, null);if(left) {x -= speed;}if(right) {x += speed;}if(up) {y -= speed;}if(down) {y += speed;}}else {System.out.println("diy");}}public Plane (Image img,double x,double y) {this.img = img;this.x = x;this.y = y;this.speed = 3;this.width = img.getWidth(null);this.height = img.getHeight(null);}//按下某个键,增加相应方向public void addDirection(KeyEvent e) {switch (e.getKeyCode()) {case KeyEvent.VK_LEFT:left = true;break;case KeyEvent.VK_UP:up = true;break;case KeyEvent.VK_RIGHT:right = 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_UP:up = false;break;case KeyEvent.VK_RIGHT:right = false;break;case KeyEvent.VK_DOWN:down = false;break;default:break;}}
}
  • Shell类:炮弹
package cn.sxt.game;import java.awt.Color;
import java.awt.Graphics;public class Shell extends GameObject{double degree;public Shell() {x = 200;y = 200;width = 10;height = 10;speed = 3;degree = Math.random()*Math.PI*2;}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(x<0||x>Constant.GAME_WIDTH-width) {degree = Math.PI - degree;}if(y<30||y>Constant.GAME_HEIGHT-height) {degree = - degree;}g.setColor(c);}
}
  • Explode类:爆炸
package cn.sxt.game;import java.awt.Graphics;
import java.awt.Image;public class Explode {double x,y;static Image[] imgs = new Image[16];static {for(int i=0;i<16;i++){imgs[i] = GameUtil.getImage("images/explode/bz"+(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;}public Explode() {}
}

第十三章 J20飞机游戏项目完整代码(尚学堂java300集笔记)相关推荐

  1. 飞机游戏项目完整代码(详解JAVA300集)

    一:简介 这是一个可以通过键盘移动飞机位置 然后可以躲避 炮弹的打击 ,游戏结束为 当炮弹与飞机发生碰撞 则 最后显示出飞机存活的时长 代表游戏结束 二:上码 1:运行游戏的类 package src ...

  2. 作业答案解析:尚学堂Java300集 第一章

    写在前面:大家好,我是草莓橙须圆.毕业之前在CSDN和微信公众号活跃 欢迎关注我的公众号:草莓橙须圆 , 微信号(cmcxy8w) 微信公众号主要就是更新一些日常和有用的小工具 CSDN主要就是学习J ...

  3. 笔记:尚学堂Java300集 第一章

    写在前面:大家好,我是草莓橙须圆.毕业之前在CSDN和微信公众号活跃 欢迎关注我的公众号:草莓橙须圆 , 微信号(cmcxy8w) 微信公众号主要就是更新一些日常和有用的小工具 CSDN主要就是学习J ...

  4. 尚学堂java300集飞机小游戏实战

    /*"##########"为不同类的分界*/ package game.plane04; import java.awt.Color; import java.awt.Frame ...

  5. python制作飞机大战代码_python实现飞机大战完整代码,可运行

    我发现很多python代码飞机大战在互联网上,但几乎没有一个是完整的.所以我做了一个完整的人.python代码分为两个文件,工具类和主类.python版本,pygame模块需要安装.完整的代码如下.1 ...

  6. java基础学习——j20飞机游戏项目

    //发现还不能学这一块儿,估计是视频错乱,一下子跳到了这一章,先放一放. 13.1 简介和项目目标

  7. 尚学堂Java300答案解析 第三章

    一.选择题 1.分析如下Java代码,编译运行的输出结果是( ).(选择一项) public static void main(String[ ] args) {boolean a=true;bool ...

  8. 速学堂Java300集第五章作业

    一.选择题 1.B 2.A 3.B 4.B 5.AC 二.简答题 1.private.默认.protected.public四个权限修饰符的作用. private:被private修饰的方法或者属性只 ...

  9. 2020-10-19。小白自学:飞机大战源码改造。(新手入门,学习总结。从零开始,步步为营。不同版本,独立运行。完整代码,感谢原著。)

    #简介: #小白自学:飞机大战源码改造.(新手入门,学习总结.) #从零开始:完全重写代码框架.(步步为营,完整代码.) #简单就好:删除各种自定函数.(讨厌函数跳转,喜欢层次分明.) #文本归一:方 ...

最新文章

  1. Python3 调用ffmpeg
  2. 在矩阵上跑最小生成树
  3. strcpy函数的实现
  4. 用 CSS 实现元素垂直居中,有哪些好的方案?
  5. greenDao 3.0基础
  6. 单独招生计算机笔试是考什么,单招考试一般考什么内容
  7. win32获取当前运行程序的内存地址_一个lock锁,就可以分出程序员对问题处置方式水平的高中低...
  8. 狗换了新主人会想旧主人吗?
  9. chrome颜色拾取器
  10. 八爪鱼采集ajax表格,如何快速统计简书数据——八爪鱼采集器(二)
  11. win10浏览器html设置字体大小设置,Win10网页字体变小了如何变大?网页字体变小了调节方法...
  12. 为什么说php开发成本低,PHP、JSP和.NET三种语言的对比中开发成本最低的是?
  13. 【阅读笔记】使用决策树预测泰坦尼克号幸存者实例 - scikit-learn机器学习
  14. 【python】【爬虫】爬取Fate Grand Order wiki所有英灵礼装图鉴
  15. 网上商城建设:微信小程序直播申请开通流程及开通方法
  16. html文档半结构化数据,什么是半结构化数据(semi-structured data)?
  17. 达里奥:我阅人无数,没有一个成功人士天赋异禀 |【经纬低调分享】
  18. 基于C++和OpenGL (GLUT) 实现太阳系行星系统
  19. 超融合究竟带来了什么 超融合方案有哪些优势 企业超融合方案怎么做?
  20. 51单片机之看门狗定时器ing STC12C5A60S2

热门文章

  1. 百度地图获取行政范围边界-区县级及以上范围
  2. 国科大学习资料--模式识别--模式识别重点
  3. 初识Struts2框架
  4. Thread 类的基本用法(附详细代码),通俗易懂。
  5. WIFI码生成附近门店团长分销CPS优惠券流量主小程序开发
  6. oracle获取100条之后的数据,oracle获取前50条数据
  7. 电脑桌面云便签怎么在分类标签中清除内容?
  8. Rails:通过IP地址确定城市
  9. 未来天择计算机,三体吧关于计算机智能进化的讨论,拿来大家考虑一下
  10. 轴承故障诊断之快速谱峭度法 Matlab 代码说明