一、项目简介

        通过JAVA语言中的JFrame类中的方法实现简易的雷霆战机小游戏,功能包括飞机移动,发射子弹,生成敌机以及摧毁敌机等.


二、项目分析

        模块一:玩家飞机模块

               要实现这个简易的小游戏,玩家飞机必不可少,我们只需创建一个MainPlane类,在其中定义飞机的初始坐标,飞机的宽度高度以及飞机的默认速度,再通过多线程的方式来设置飞机的移动刷新,当飞机移动时,根据移动方向来改变坐标,如向左移动,就令x坐标减少相应的初始速度值,这样即可实现该功能模块.


模块二:敌机模块

                此模块与玩家飞机模块类似,也需创建一个敌机的实体类并定义初始坐标,默认宽度与高度以及敌机的默认速度,并且除了通过多线程来控制敌机的刷新之外,还要通过Rectangle这个类来进行子弹碰撞检测,通过给定敌机和子弹的长宽以及坐标,我们可以通过子弹图片的大小以及敌机图片的大小来判断,判断两个图片是否冲突,若检测到碰撞,即显示飞机爆炸的图片,并把敌机移除,除此之外,当飞机飞出窗口的时候,也要移除飞机,这样即可实现这个模块.


模块三:玩家移动与子弹模块

为了完整的游玩游戏,我们需添加一个子弹模块,与之前的两个模块功能类似,设置子弹的初始属性,而玩家移动模块则需要通过继承keyAdapter类来添加键盘事件监听,只需重写键盘按下以及松开事件监听即可,我们知道上下左右以及w、a、s、d键的键值为多少,即可通过这两个方法判断按下的键是否为这几个键,定义一个boolean类型的值,若按下了这几个键,这个值即为true,再传到玩家飞机模块实现飞机移动即可.


模块四:游戏主界面以及功能实现模块                

                这是最后一个模块,这个模块用来实现此前定义的所有功能,通过构造函数设置一个游玩窗口,并通过多线程来实例化进行玩家飞机、敌机以及子弹的分别创建与刷新,只需通过重写paint方法并通过BufferedImage类来画出玩家飞机以及敌机和子弹,再通过repaint和线程来实现画面的刷新;为了创造出多个敌机以及多个子弹的效果,我们可以定义两个集合来存储敌机和子弹,为了保证线程的安全性,我们可以运用Vector集合来存储这两个数据,并实现相应功能.


三、项目演示


 四、代码

玩家飞机模块:

import javax.swing.*;
import java.awt.*;public class MainPlane extends Thread{//飞机的坐标int x = 210,y = 720;//飞机的宽高int width = 50,height = 50;//飞机移动的速度int speed = 10;//上下左右boolean up,down,left,right;//飞机图片Image image = new ImageIcon("./image/10011.png").getImage();public MainPlane() {}public MainPlane(int x, int y, int width, int height, Image image) {this.x = x;this.y = y;this.width = width;this.height = height;this.image = image;}@Overridepublic void run() {while (true) {if (up) {y -= speed;;} else if (down) {y += speed;} else if (left) {x -= speed;} else if (right) {x += speed;}try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}

敌机模块:

import javax.swing.*;
import java.awt.*;public class EnemyPlane extends Thread{public GameJFrame gameJFrame;//子弹坐标大小以及速度public int x,y;public int width = 50,height = 50;public int speed = 2;//敌机的图片public Image image = new ImageIcon("./image/10021.png").getImage();public EnemyPlane(GameJFrame gameJFrame, int x, int y) {this.gameJFrame = gameJFrame;this.x = x;this.y = y;}public EnemyPlane(GameJFrame gameJFrame, int x, int y, int width, int height) {this.gameJFrame = gameJFrame;this.x = x;this.y = y;this.width = width;this.height = height;}public void run(){while (true){//碰撞到了if (hit()){this.speed = 0;this.image = new ImageIcon("./image/300350.png").getImage();try {this.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}gameJFrame.enemy.remove(this);break;}if (this.y >= 760){break;}try {this.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}//碰撞检测public boolean hit(){Rectangle myrec = new Rectangle(this.x,this.y,this.width,this.height);Rectangle rec = null;for (int i = 0; i < gameJFrame.bullets.size(); i++) {Bullet bullet = gameJFrame.bullets.get(i);rec = new Rectangle(bullet.x,bullet.y-1,bullet.width,bullet.height);//碰撞检测if (myrec.intersects(rec)){return true;}}return false;}
}

子弹模块:

public class Bullet {//子弹坐标int x,y;//子弹宽高int width = 20,height = 20;//子弹速度int speed = 10;Image image = new ImageIcon("./image/bullet.png").getImage();public Bullet(int x, int y) {this.x = x;this.y = y;}public Bullet(int x, int y, int width, int height, int speed, Image image) {this.x = x;this.y = y;this.width = width;this.height = height;this.speed = speed;this.image = image;}
}

玩家移动模块:

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;public class Player extends KeyAdapter {GameJFrame gameJFrame;public Player(GameJFrame gameJFrame) {this.gameJFrame = gameJFrame;}//重写方法,添加键盘监听事件@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();//判断键盘按下的是哪个键,实现左右上下移动if (keyCode == 37 || keyCode == 65){System.out.println("向左移动");gameJFrame.mainPlane.left = true;}else if(keyCode == 38 || keyCode == 87){System.out.println("向上移动");gameJFrame.mainPlane.up = true;}else if(keyCode == 39 || keyCode == 68) {System.out.println("向右移动");gameJFrame.mainPlane.right = true;}else if(keyCode == 40 || keyCode == 83) {System.out.println("向下移动");gameJFrame.mainPlane.down = true;}else if(keyCode == 66){addBullet();}}@Overridepublic void keyReleased(KeyEvent e) {int keyCode = e.getKeyCode();//判断键盘按下的是哪个键,实现左右上下移动if (keyCode == 37 || keyCode == 65){System.out.println("向左移动");gameJFrame.mainPlane.left = false;}else if(keyCode == 38 || keyCode == 87){System.out.println("向上移动");gameJFrame.mainPlane.up = false;}else if(keyCode == 39 || keyCode == 68) {System.out.println("向右移动");gameJFrame.mainPlane.right = false;}else if(keyCode == 40 || keyCode == 83) {System.out.println("向下移动");gameJFrame.mainPlane.down = false;}}//装弹public void addBullet(){gameJFrame.bullets.add(new Bullet(gameJFrame.mainPlane.x+5,gameJFrame.mainPlane.y-20));}
}

主界面以及功能实现模块:

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.Vector;public class GameJFrame extends JFrame {MainPlane mainPlane;GameJFrame gameJFrame;//子弹集合Vector<Bullet> bullets = new Vector<>();//敌机集合Vector<EnemyPlane> enemy = new Vector<>();public GameJFrame(){gameJFrame = this;//创建玩家飞机mainPlane = new MainPlane();//启动线程mainPlane.start();//设置游戏名字this.setTitle("雷霆战机");//设置窗口大小this.setSize(480,900);//设置点击x关闭this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//设置此窗口是否可由用户调整大小this.setResizable(false);//设置窗口相对位置水平居中this.setLocationRelativeTo(null);//设置窗口可视化this.setVisible(true);//设置一个除主线程main之外的线程,让它持续调用paint方法new Thread(new Runnable() {@Overridepublic void run() {while(true){try {repaint();Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();//产生敌机new Thread(new Runnable() {@Overridepublic void run() {Random r = new Random();while (true) {EnemyPlane enemyPlane = new EnemyPlane(gameJFrame, r.nextInt(500), 0);enemyPlane.start();enemy.add(enemyPlane);try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}}).start();}/** 在窗口上画内容,paint方法在窗口初始化的时候默认执行* 本质上就是获取一个画笔,在窗口上画出内容,BufferedImage就是获取缓冲流的画笔,效率较高* */public void paint(Graphics gra){
//        System.out.println("绘制画板");//画出背景BufferedImage image = (BufferedImage) this.createImage(this.getWidth(),this.getHeight());//高效缓存的画笔Graphics bi = image.getGraphics();//画出背景图bi.drawImage(new ImageIcon("./image/MAP02_02.png").getImage(),0,0,null);//画出玩家飞机bi.drawImage(mainPlane.image,mainPlane.x, mainPlane.y, mainPlane.width,mainPlane.height,null);//画出子弹效果for (int i = 0; i < bullets.size(); i++) {Bullet bullet = bullets.get(i);if (bullet.y > 0)bi.drawImage(bullet.image,bullet.x,bullet.y -= bullet.speed,bullet.width,bullet.height,null);elsebullets.remove(bullet);}//画出敌机for (int i = 0; i < enemy.size(); i++) {EnemyPlane enemyPlane = enemy.get(i);if (enemyPlane.y < 760)bi.drawImage(enemyPlane.image,enemyPlane.x,enemyPlane.y += enemyPlane.speed,enemyPlane.width,enemyPlane.height,null);elsebullets.remove(enemyPlane);}//生效gra.drawImage(image,0,0,null);}}

JFrame实现简易雷霆战机相关推荐

  1. android 仿雷霆战机、打飞机等简易u小游戏

    时间不多,不做细说,先上效果图 直接上源码 码云中国 git 下载地址: 仿雷霆战机.打飞机小游戏

  2. java 雷霆战机游戏 飞机大战 全过程教学+免费素材(附全部源代码)

    这个游戏已是我第二次编写了,之前写过一个简易版的飞机大战类似demo.这次在上一次基础上添加了许多元素,增添了可玩性. 游戏效果图如下: ps :完整源码+视频教程+论文文档 :java雷霆战机完整资 ...

  3. JavaSwing多线程小游戏雷霆战机

    在做完连连看以后,想到要做一个多线程游戏,本来是做的一个跳伞的小游戏的.但是做到一半的时候,觉得可玩性太低了.后面想来想去还是打算做一个以前玩过的雷霆战机小游戏,也就是飞机大战. 1.效果展示 2.绘 ...

  4. 基于Java swing开发的雷霆战机

    游戏截图 飞机项目的所有类的截图 主窗体类 package com.tarena.shout; import java.awt.Graphics; import java.awt.Image; imp ...

  5. 雷霆战机源代码c语言,C++实现雷霆战机可视化小游戏

    用C++和easyx实现简单的雷霆战机小游戏 之前在网上看了许多关于c++或者是其他语言实现雷霆战机的帖子,大多不完整,或者是要付费才能阅读,现将源码展示如下,仅作学习交流之用. 基本原理 基本思路 ...

  6. Unity 3D学习之雷霆战机(一)

    雷霆战机(一) 注:本文包括雷霆战机的第一部分,在没书的情况下,慢慢摸索自己真的了解到许多知识,现于初学者分享并求指教,因为自己是初学者中间可能会有许多不成熟的地方或者错误的地方,望指教.再次重申本人 ...

  7. python 0基础如何做出雷霆战机?【源码送上】

    嗨害大家好鸭!我是小熊猫~ 大家都玩过雷霆战机吧? 这样的 我的qun友 才学三周就做出了雷霆战机这种游戏, 看起来确实不错啊~ 今天就实现一下雷霆战机的运作,开始整活! 一.准备工作 使用的软件版本 ...

  8. java 雷霆战机 教程,java swing实现简单的雷霆战机小游戏项目源码附带视频指导修改教程...

    <p> <span style="font-family:微软雅黑;font-size:19px;color:#666666;background-color:#FFFFF ...

  9. 纯c语言打造的雷霆战机,飞机大战。可吃道具加强。

    纯c语言编写的雷霆战机,简单容易上手 本博客将持续更新带给大家日常生活中的简单经典的C语言小项目和生活中的电子DIY.以后会陆续推出讲解视频发布在b站上.所有程序和日常学习资料全都可以在 群文件中免费 ...

最新文章

  1. 搭建java_搭建java开发环境
  2. android groovy 注解,Groovy 注释
  3. 智能车竞赛云上比赛第二天
  4. iOS 9音频应用播放音频之iOS 9音频播放进度
  5. Java设计模式(1)——创建型模式之简单工厂模式(Simple Factory)
  6. Windows phone 8 学习笔记(7) 设备(转)
  7. mysql 排序取前4,mysql分组取每组前几条记录(排序)
  8. 【Java】访问控制
  9. 李开复看衰语音识别 这些国内外巨头却有话要说!
  10. 常用JS验证函数总结
  11. 整理1985-2020年《中国城市统计年鉴》主要数据
  12. Ochestrator企业数据总线
  13. DeFi 可以从金融危机中学到三件事
  14. 若依管理系统漏洞利用
  15. 5G NGC — NRF 网络注册功能
  16. 今日头条精准引流技巧,今日头条超简单的引流技巧
  17. 浅入浅出linux中断子系统
  18. 把maven的setting配置文件改为需要jdk版本
  19. vb.net利用listbox控件与excel文件相结合统计数据
  20. 对植物大战僵尸的数据修改

热门文章

  1. 软件测试基础知识整理(详细版)收藏这篇足矣
  2. Python3 Image图片webp格式转换,URL Image Byte字节流操作
  3. DatePicker和TimePicker
  4. 原理+代码|手把手教你使用Python实战反欺诈模型
  5. 西工大java实验报告给,春风又绿西工大,软酷实践让我忙
  6. JavaScript时间戳
  7. 抖音小店无货源不吃香了?这个项目的红利期结束了?
  8. Java生鲜电商平台-优惠券设计与架构
  9. DaleCloud(原NFine)介绍:使用easyui实现主从表提交(单据业务)
  10. 拼多多员工淘宝账号遭阿里封禁,凸显出后者感受到巨大威胁