567881@ftJava小游戏开发

Java飞机小游戏制作简单实现小结

本人原来是个技术小白,寒假我跟着高淇老师的Java300集开始自学Java,跟着做了一个飞机大战小游戏,已经实现了飞机的自由移动,炮弹爆炸,飞机死亡,游戏计时等功能,里面应用了一些小游戏开发的常用技术,如:窗口的布局、GameUtil类的图片加载、多线程的内部类实现动画效果、双缓冲技术、键盘控制原理(键盘监听机制来控制运动方向)、利用数组产生大量炮弹、矩形检测、碰撞检测、计时功能等知识,下面我会在代码里面展示,而且注释也会比较详细,希望对有兴趣的朋友有些帮助。

游戏的主窗口

package cn.ft.game;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;//使用了双缓冲技术,页面不会闪烁
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.time.Period;
import java.util.Date;import javax.xml.crypto.Data;/*** 飞机小游戏开发* @author ft**/
public class mygameframe extends Frame {/*** 通过路径加载图片*/Image bg =GameUtil.getImage("images//bg.jpg");Image planeimg=GameUtil.getImage("images//plane.png");Plane plane=new Plane(planeimg,250,250);//创建plane的对象,可以调用plane里面的方法shell[] shells=new shell[60];//创建一个炮弹数组Expolde bao;//声明一个爆炸对象Date startTime=new Date();//声明游戏开始时间对象Date endTime;//声明游戏结束int Period;//引入游戏持续时间变量/*** paint方法的使用*/@Overridepublic void paint(Graphics g) {super.paint(g);//表示在原来图像的基础上,再画图g.drawImage(bg, 0, 0, null);plane.drawSelf(g);//调用plane里面画飞机的方法画飞机//画所有的炮弹,用数组遍历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 Expolde(plane.x,plane.y);//发生碰撞时创建一个爆炸对象endTime=new Date();//创建爆炸结束是的新对象Period=(int)((endTime.getTime()-startTime.getTime())/1000);//计算持续的时间,除以1000是缩小时间值,int为类型强制转换}bao.draw(g);//画出爆炸方法}/** 计时功能,给出提示*/if (!plane.live) {Color c=g.getColor();g.setColor(Color.GRAY);g.setFont(new Font("仿体", Font.LAYOUT_NO_LIMIT_CONTEXT, 35));g.drawString("你的游戏时间是: "+Period+" 秒" , 20,110);//画出游戏的时间g.setColor(Color.pink);g.setFont(new Font("宋体", Font.TRUETYPE_FONT, 20));g.drawString("不要灰心,再来一局" ,20,60);g.setColor(c);}}}//帮助我们反复画窗口,动漫效果class paintthread extends Thread{  //thread是线程@Overridepublic void run() {while(true) {repaint();//重画try {Thread.sleep(50);//反映时间} catch (InterruptedException e) {e.printStackTrace();}         }}}/*** 增加键盘的监听事件*/class KeyMonitor extends KeyAdapter{  //键盘监听室内部类@Overridepublic void keyPressed(KeyEvent e) { //可用系统覆盖方法“按下”plane.addDirection(e);  //按下方向键是改变运动方向,调用plan类里面的方法}@Overridepublic void keyReleased(KeyEvent e) {   //“抬起”plane.minusDirection(e);//抬起键盘是停止改变运动方向}}/** 双缓冲技术*/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 void launchframe() {this.setTitle("范腾的飞机小游戏");//窗口标题this.setVisible(true);//窗口可视this.setLocation(50,50);//窗口位置this.setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//窗口的大小this.addWindowFocusListener(new WindowAdapter() {//匿名内部类,用来结束程序public void colsing(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 mf=new mygameframe();mf.launchframe();
}
}

定义一个父类,方便继承和调用


package cn.ft.game;
/*** 游戏的父类,可以让其子类继承* @author 25330**/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是画笔g.drawImage(img, (int)x,(int) y, null);//x,y是double类型,此时是int需要强制准换
}
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() {  //空构造器}
/** 返回物体所在的矩形,矩形检测,可以用来碰撞检测*/
public Rectangle getRect() {return new Rectangle((int) x,(int) y,width,height);}}

飞机类

package cn.ft.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;     //如果按下向左的键,按speed的速度向左方向运动(x、y轴的方向为第四象限)}if(up){y-=speed;    //如果按下向上的键,按speed的速度向上方向运动}if(down) {y+=speed;     //如果按下向下的键,按speed的速度向下方向运动}if(right){x+=speed;    //如果按下向右的键,按speed的速度向右方向运动}}else {     //如果死了,不执行//System.out.println("你被炮弹击中,已经死亡");}}public Plane(Image img,double x ,double y) {this.img=img;this.x=x;this.y=y;this.speed=5;//得设置一定的速度不然物体运动显示效果一般this.width=img.getHeight(null);//获得图片的高度,调控这个的大小可以控制碰撞的概率this.height=img.getWidth(null);
}public void addDirection(KeyEvent e) {  //游戏方向的改变,按下某个键增加相应的方向switch (e.getKeyCode()) {     //用switch语句进行判定键盘的输入方式case KeyEvent.VK_LEFT:left=true;           //左break;case KeyEvent.VK_UP:up=true;               //上break;case KeyEvent.VK_DOWN:down=true;               //下break;case KeyEvent.VK_RIGHT:right=true;                //右break;default:break;}}public void minusDirection(KeyEvent e) {  //游戏方向的改变,按下某个方向键减少相应的方向switch (e.getKeyCode()) {     //用switch语句进行判定键盘的输入方式case KeyEvent.VK_LEFT:left=false;              //左break;case KeyEvent.VK_UP:up=false;              //上break;case KeyEvent.VK_DOWN:down=false;              //下break;case KeyEvent.VK_RIGHT:right=false;               //右break;default:break;}
}}

定义炸弹,并让炸弹随机运动

package cn.ft.game;import java.awt.Color;
import java.awt.Graphics;import javax.annotation.Generated;/*** 增加炮弹及任意角度运动* @author ft***/
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;  //炮弹的活动范围随机(0,2Π)}public  void draw(Graphics g) {    //画炮弹Color c=g.getColor();  //保存原颜色g.setColor(Color.RED);g.fillOval((int)x, (int)y, width, height);//填充炮弹x+=speed*Math.cos(degree);   //利用三角函数确定炮弹运动的坐标y+=speed*Math.sin(degree);if (x<15||x>(Constant.GAME_WIDTH-width-15)) {  //定义球在窗口的活动边界,框的边界在constant里面已经定义了大小degree=Math.PI-degree;  //角度反转}if (y<30||y>(Constant.GAME_HEIGHT-height-15)) {  //为了让球显示出来,要主要球的半径和框的的厚度degree=-degree;}g.setColor(c);}}

炸弹爆炸的效果,图片连载

package cn.ft.game;import java.awt.Graphics;
import java.awt.Image;/*** 炸弹爆炸类* @author ft**/
public class Expolde {double x, y;  //爆炸的位置static Image[] imgs = new Image[16];//私有变量,本游戏只要初始化一次,用数组定义照片static {     //静态初始化括,可以通过for循环进行加载for (int i = 0; i < 16; i++) {imgs[i] = GameUtil.getImage("images/explode/e" + (i + 1) + ".gif");//“  ”里面是挨个加载里面的照片地址imgs[i].getWidth(null);}}int count;  //计算public void draw(Graphics g) {if (count <= 15) {   //用count计数,然后进行轮播画图片g.drawImage(imgs[count], (int) x, (int) y, null);count++;}}public Expolde(double x, double y) {this.x = x;this.y = y;}}

通过路径获得图片

package cn.ft.game;import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;import javax.imageio.ImageIO;
/*** 通过路径获得图片* @author 范腾**/
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;}}

定义一个常量类,用来保存常量,我用来开发时便于修改窗口的大小

package cn.ft.game;
/*** 常量类,用来保存常量,便于系统修改* @author ft**/
public class Constant {public static final int GAME_WIDTH=850;  //定义窗口的宽度
public static final int GAME_HEIGHT=600;//定义窗口的高度
}

游戏效果图


文件目录

总体来说这个游戏只要细心的做还是不难的,里面我有比较详细的注释,希望对大家有帮助,需要游戏图片的可以留言,我也是受朋友启发写的第一篇博客,希望以后能够坚持下去。

Java飞机小游戏制作简单实现详细小结相关推荐

  1. java飞机游戏开发_java飞机小游戏制作

    学习了Java的基础的知识后,我们可以做一个小的飞机游戏来锻炼一下自己的编程,并且,通过这个小游戏可以让我们更好的理解我们之前所学过的对象,类,封装,多态,和继承等的实际含义,当然,一个程序并不能让我 ...

  2. 用c++做一个简单的打飞机小游戏(详细说明与注释)

    用c++做一个简单的打飞机小游戏(详细说明与注释) 说明: 代码长度5k多,行数200多行. 不仅没有压行,反而为了条理清晰一点所以很多中间加空换行,把很多可以写在一起的分割成了几个函数. 为了不会忘 ...

  3. 用JAVA写个飞机小游戏玩玩吧

    闲来无事写了个飞机小游戏. 设定很简单,子弹打到飞机就结束游戏. 实现步骤如下,有问题可以评论区讨论: 首先建立一个PlayGame项目和它之下的包: MyGameFrame(游戏实现)类: pack ...

  4. Qt学习总结——飞机大战小游戏制作

    Qt学习总结--飞机大战小游戏制作 1. 需求分析 这篇文章写于2020年暑假,完成学校实训项目之后,对自己的项目实践做了一个总结,回顾整个项目的制作过程,同时也复习一下Qt的相关知识,总结项目制作过 ...

  5. 【抖音小游戏】 Unity制作抖音小游戏方案 最新完整详细教程来袭【持续更新】

    前言 [抖音小游戏] Unity制作抖音小游戏方案 最新完整详细教程来袭[持续更新] 一.相关准备工作 1.1 用到的相关网址 1.2 注册字节开发者后台账号 二.相关集成工作 2.1 下载需要的集成 ...

  6. 编程语言用 Java 开发一个打飞机小游戏(附完整源码)

    编程语言用 Java 开发一个打飞机小游戏(附完整源码) 上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过 ...

  7. Java版打飞机小游戏

    放假写的一个Java端打飞机小游戏. 复习到的知识点有:java图形界面,多线程,集合框架等. 主要的收获是知道了处理图层的方式,即JLayeredPane层次面板,主要思路 如下: 1.       ...

  8. 简单的java猜拳小游戏

    简单的java猜拳小游戏 /*** 猜拳小游戏* @ author lyle*/import java.util.Scanner;public class 猜拳小游戏 {public static v ...

  9. java打飞机小游戏(跟着网上视频写到)

    package 飞机小游戏; //如果觉得好的话,给一点积分哦,太痛苦了,平时下一点资料都得需要 import java.awt.Color; import java.awt.Font; import ...

最新文章

  1. Android app 启动页尺寸大小 忘记了怎么办
  2. Java8 Optional,可以这样用啊
  3. 2011 ScrumGathering敏捷个人.pptx
  4. 如何当好PM?请求大家积极讨论
  5. Windows下FFTW的安装_史上最全
  6. java常见的报错_Java中常见的错误有哪些?
  7. 图像定位的优化、评价和应用简介
  8. 8个按键控制8个继电器c语言程序,单片机C语言程序的设计实训100例.doc
  9. 计算机组成原理 - 基本概念
  10. MathorCup数模竞赛,为你的保研之路添砖加瓦~
  11. 100 个 Python 小例子(练习题)
  12. 计算机组成原理累加器实验,计算机组成原理实验教学的探讨.doc
  13. 【总结】计算机网络常用协议总结------结合cpri
  14. SharePoint 网站登录不上,3次输入用户名/密码白页
  15. 三星 OMNIA7/I8700 刷机 ROM集合
  16. 小程序 用户反馈_用户反馈如何提高我的应用程序的安全性
  17. (整理)吊炸天的CNNs,这是我见过最详尽的图解!(下)
  18. 用计算机弹起风了歌词,起风了歌词(买辣椒也用券演唱)
  19. 大华java面试经验_大华面试(Java 基础)
  20. 20162330 第六周 蓝墨云班课 队列课下作业

热门文章

  1. jqueryMobile 过度
  2. PHP解密微信手机号数据
  3. 日清纺微电子推出高性能音频运放NJM8830
  4. 陌陌、YY,中国互联网的以色列
  5. 使用HTML5定位的经纬度来实现ArcGIS API for js 中的定位
  6. ocr的场景应用--发票识别
  7. 抽象代数之pq阶群的结构其中q能整除p-1
  8. 分享一个日记软件ediary
  9. es5 js日期格式化
  10. 分页实现-----首页、上一页、下一页、最后一页