在学习java基础知识后,根据网上飞机大战的内容和代码改变,设计出飞机大战的奖励篇小游戏,后期可将飞机大战和奖励篇等设计成一个完整游戏。

项目描述:
游戏开始,会出现若干蓝色空心圆形物体视为奖励道具会在界面中弹射,数量可以自行设定,控制飞机移动将奖励吃完,计算所用时间。
运行效果图:

游戏源码
游戏主窗口类:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;/*** 游戏主窗口*/
public class MyGameFrame extends JFrame {Image planeImg = GameUtil.getImage("images/plane.png");Image bg = GameUtil.getImage("images/bg.jpg");Plane p1 = new Plane(planeImg, 100, 100, 8);//飞机Bonus[] bonuses = new Bonus[10];//奖励道具Date start = new Date();//游戏开始的时间Date end;//游戏结束的时间:飞奖励吃完的那一刻long period = 0;//玩了多少秒@Overridepublic void paint(Graphics g) {//g当做是一致画笔//画背景g.drawImage(bg,0,0,500,500,null);//画时间drawTime(g);//画飞机p1.drawMyself(g);//画奖励道具for (int i = 0; i<bonuses.length;i++){if(bonuses[i]!=null){bonuses[i].drawMyself(g);//碰撞检测。将所有的bonus和飞机进行检测,看有没有碰撞boolean peng = bonuses[i].getRec().intersects(p1.getRec());if (peng){bonuses[i] = null;}}}}public void drawTime(Graphics g){//绘制时间的方法Color c = g.getColor();Font f = g.getFont();g.setColor(Color.green);if (!isNullOrEmptyArray(bonuses)){period = (System.currentTimeMillis()-start.getTime())/1000;g.drawString("游戏用时"+period+"秒",30,50);}else{if(end==null){end = new Date();period = (end.getTime()-start.getTime())/1000;}g.setColor(Color.red);g.setFont(new Font("微软雅黑", Font.BOLD, 30));g.drawString("游戏结束,最终所用时间:"+period+"秒", 45, 200);}g.setColor(c);g.setFont(f);}public static boolean isNullOrEmptyArray(Object[] array) {//判断奖励是否为空if(array == null) {return true;}if(array.length ==0) {return true;}boolean eachItemIsNull = true;for(Object item:array) {if(item != null) {eachItemIsNull = false;}}return eachItemIsNull;}//初始化窗口public void launchFrame(){this.setTitle("飞机大战-小夏沫");setVisible(true);//设置窗口是否可见setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//窗口大小setLocation(560,100);//窗口打开的位置//增加关闭窗口的动作this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);//正常退出程序}});new PaintThread().start();//启动窗画窗口的线程this.addKeyListener(new KeyMonitor());//启动键盘监听//初始化创建bonus对象for (int i =0;i<bonuses.length;i++){bonuses[i] = new Bonus();}}/*** 定义一个重画窗口的线程类* 定义成内部类是为了方便直接使用窗口类的相关方法*/class PaintThread extends 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) {p1.addDirection(e);}@Overridepublic void keyReleased(KeyEvent e) {//        p1.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 static void main(String[] args) {MyGameFrame gameFrame = new MyGameFrame();gameFrame.launchFrame();}
}

飞机类:

import java.awt.*;
import java.awt.event.KeyEvent;public class Plane extends GameObject{boolean left, right, up, down;//飞机的方向控制@Overridepublic void drawMyself(Graphics g) {super.drawMyself(g);//飞机飞行的算法,可以自行设定
//        x+=speed;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;}}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;}}public Plane(Image img, double x, double y, int speed) {super(img, x, y, speed);}
}

常数类:

public class Constant {//游戏窗口的宽度和高度public static final int GAME_WIDTH = 500;public static final int GAME_HEIGHT = 500;}

奖励类:

import java.awt.*;public class Bonus extends GameObject {double degree;//角度。炮弹沿着指定的角度飞行public Bonus(){x=200;y=300;degree = Math.random()*Math.PI*2;width = 10;height = 10;speed = 6;}@Overridepublic void drawMyself(Graphics g) {Color c= g.getColor();//保存原来的颜色g.setColor(Color.CYAN);//设置画笔为青色g.drawOval((int)x,(int)y,width,height);g.setColor(c);//还原为原来的颜色//根据自己的算法指定移动的路径x += speed*Math.cos(degree);y += speed*Math.sin(degree);//碰到边界改变方向if(y>Constant.GAME_HEIGHT-this.height-9||y<35){degree = -degree;}if(x<10||x>Constant.GAME_WIDTH-this.width-9){degree = Math.PI-degree;}}
}

游戏根类:

import java.awt.*;/*** 游戏物体的根类*/
public class GameObject {Image img;          //图片double x,y;         //物体的坐标int speed;          //物体移动的速度int width,height;   //物体的宽度和高度public GameObject(Image img, double x, double y, int speed) {this.img = img;this.x = x;this.y = y;this.speed = speed;this.width = img.getWidth(null);this.height = img.getHeight(null);}public GameObject(){}public void drawMyself(Graphics g){g.drawImage(img, (int)x, (int)y, width, height, null);}//所有的物体都是矩形。当你获得对应的矩形的时候,我们就可以做一些相关的判断操作!public Rectangle getRec(){return new Rectangle((int)x, (int)y, width, height);}
}

工具类(加载图片):

import javax.imageio.ImageIO;
import java.awt.*;
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 img = null;URL u = GameUtil.class.getClassLoader().getResource(path);try {img = ImageIO.read(u);} catch (IOException e) {e.printStackTrace();}return img;}
}

eg:仅为练习代码,游戏过程中可能会出现bug,代码有待完善。

设计自己的小游戏-飞机大战奖励篇相关推荐

  1. 【游戏开发实战】使用Unity 2019制作仿微信小游戏飞机大战(七):主角飞机碰撞与爆炸

    文章目录 零.教程目录 一.前言 二.本篇目标 三.飞机机碰撞组件:BoxCollider2D.Rigidbody2D 四.添加Tag:Enemy 五.主角飞机碰撞处理:OnTriggerEnter2 ...

  2. 用JAVA制作小游戏——飞机大战(三)

    本篇博客是对飞机大战游戏项目完整代码的展示 详细代码讲解: 用JAVA制作小游戏--飞机大战(一) 用JAVA制作小游戏--飞机大战(二) 最下方附整个程序的文件下载链接 代码展示 主界面 impor ...

  3. 用JAVA制作小游戏——飞机大战(二)

    本篇博客是对飞机大战游戏使用代码的展示 重难点: 首先需要鼠标能够控制战机,使鼠标在窗口内时始终能够使战机的位置与鼠标相同,实现鼠标控制战斗机移动. 其次需要能够以一定的速度产生子弹和敌机,并且以一定 ...

  4. java小游戏-java小游戏-飞机大战

    java小游戏-java小游戏-飞机大战 1 窗口创建 2 背景图片添加 3 启动页面制作 4 启动页面点击事件 5 游戏物体父类的编写 6 背景的移动 7 双缓存的添加 8 背景图片的循环出现 9 ...

  5. c 语言500行小游戏代码,500行代码使用python写个微信小游戏飞机大战游戏.pdf

    500行行代代码码使使用用python写写个个微微信信小小游游戏戏飞飞机机大大战战游游戏戏 这篇文章主要介绍了500行代码使用python写个微信小游戏飞机大战游戏,本文通过实例代码给大家介绍的非常详 ...

  6. c语言小游戏-飞机大战

    今天我们来尝试用easyx图形库实现c语言小游戏-飞机大战(源代码和图片已经在结尾给出) 先引用头文件 #include<stdio.h> #include<time.h>// ...

  7. 【Python】Python小游戏--飞机大战

    一.前言 今天已经初四,舒服的在家躺尸的春节也算过去了,又要开始辛勤的(苦逼的)学习和工作了.说点题外话,今年春节的病毒疫情真的弄的人心惶惶,我也在这为国家和武汉加油,也向一线工作人员致敬,希望早日结 ...

  8. cocos2d-x小游戏——飞机大战

    上周,我做了一个基于 cocos2d-x 的飞机大战的游戏,因为我刚学cocos2d-x没多久,所以这个飞机大战很多都是看着别人的教程,再加上自己的一些想法,来做的. 下面我想说一说我的思路. 飞机大 ...

  9. 小游戏——飞机大战(2)

    飞机大战 前言,在完成了飞机大战(1)的基本准备类以后,我们动手来实现真正的飞机大战游戏 ShootGame类 首先我们的界面类继承Jpanel,我们在开始先把我们的图片都定义成static静态资源, ...

最新文章

  1. 2022-2028年中国交通建设PPP模式深度分析及发展战略研究报告(全卷)
  2. vue 文字无缝滚动_手把手教你搭建 Vue 聊天室
  3. 【MM模块】Source Lists 货源清单
  4. 手机的次世代竞争年代
  5. Centos6.5搭建bugzilla
  6. 云信“欢乐颂活动”中奖名单
  7. android 获取控件在屏幕中的坐标
  8. C语言 FileStreaming(文件流)
  9. win7更新_Win7最新更新!由微软亲自集成的安装包来袭!
  10. 美制电线标准AWG与公制、英制单位对照 AWG线规对照表
  11. C#简单银行管理系统
  12. [全网最新最全]2020年国内和国外安卓应用上线上架应用市场渠道集合(关键词:apk,发布,Google Play,Android,详细步骤介绍流程)
  13. Enterprise Library
  14. Squid代理服务器基础_wuli大世界_新浪博客
  15. vue.js动态计时器_基于Vue.js的Pomodoro技术计时器
  16. 自定义 VSCode 背景图片
  17. Hive 如何设置ReduceTask的数量
  18. Github的远程项目如何下载到本地
  19. leetcode(575)分糖果
  20. 会python_会Python的人,一毕业即高薪?

热门文章

  1. c语言求素数500-1999,初等数论练习题
  2. Apollo与ROS
  3. BUUCTF刷题记录 Pokémon
  4. lbe+android6.0+免root,lbe安全大师免root版下载-LBE安全大师 安卓版v6.1.2563-PC6安卓网...
  5. 11g v$active_session_history的列说明
  6. centos8.1安装amd显卡驱动操作记录
  7. 计算机二级宝典几个人用,计算机二级宝典
  8. 怎么写好你的求职信!
  9. Android新功能用户指引UserGuide
  10. 微型计算机原理_课后答案,微机原理课后习题标准答案