本篇博客是对飞机大战游戏使用代码的展示

重难点:

首先需要鼠标能够控制战机,使鼠标在窗口内时始终能够使战机的位置与鼠标相同,实现鼠标控制战斗机移动。
其次需要能够以一定的速度产生子弹和敌机,并且以一定的速度移动,为了实现这部分的功能,我们需要使用线程来完成。(Timer也可以实现这块功能,但过多使用Timer会使程序变得不稳定,会经常报错)JAVA 线程的介绍与使用
再然后就是判断子弹与敌机相撞,战机与敌机相撞,这就需要用到遍历,需要遍历的是场上的子弹与敌机,这就需要我们使用ArrayList来存储场上的敌机与子弹,当敌机与子弹离开画面使,便从ArrayList中移除,这样便可以保证遍历的是场上的敌机与子弹。

鼠标控制战机

class mouse1 extends MouseMotionAdapter{@Overridepublic void mouseMoved(MouseEvent e) {X=e.getX();//得到鼠标X坐标Y=e.getY();//得到鼠标Y坐标jl2.setLocation(X-30, Y-35);//战机根据鼠标设置位置//通过监听器,只要鼠标移动就执行,//图片根据显示效果更改坐标值}}

子弹与敌机的产生

//敌机生成(线程代码)
class enemyCreate extends Thread{public void run() {while(true) {try {this.sleep(1000);//1000毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}ImageIcon image_enemy=new ImageIcon("game_image/enemy.png");//敌机图片路径enemy[enemy_num]=new JLabel(image_enemy);Random random=new Random();enemy[enemy_num].setBounds(random.nextInt(image1.getIconWidth()), 0, image_enemy.getIconWidth(), image_enemy.getIconHeight());//设置敌机生成位置和大小(位置横坐标通过Random随机生成)layeredPane.add(enemy[enemy_num], JLayeredPane.MODAL_LAYER);a1.add(enemy[enemy_num]);//将每一个生成的敌机存放到ArrayList中enemy_num++;}}}
//子弹生成(线程代码)
class ammoCreate extends Thread{public void run() {while(true) {try {this.sleep(1000);//1000毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}ImageIcon image_ammo=new ImageIcon("game_image/ammo.png");//子弹图片路径ammo[ammo_num]=new JLabel(image_ammo);ammo[ammo_num].setBounds(X, Y-40, image_ammo.getIconWidth(), image_ammo.getIconHeight());//子弹位置和大小(X,Y为鼠标的X,Y坐标)layeredPane.add(ammo[ammo_num], JLayeredPane.MODAL_LAYER);a2.add(ammo[ammo_num]);//将每一个生成的子弹存放到ArrayList中ammo_num++;}}
}

敌机与子弹的移动

//敌机移动(线程代码)class enemyMove extends Thread{public void run() {while(true) {try {this.sleep(100);//100毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}for(int i=0;i<a1.size();i++) {//遍历敌机对应的ArrayLista1.get(i).setLocation(a1.get(i).getX(), a1.get(i).getY()+10);//敌机移动,在原基础向下移动10if(a1.get(i).getY()>=image1.getIconHeight()) {//敌机移动到窗口外,变得不可见,然后从对应的ArrayList中移除a1.get(i).setVisible(false);a1.remove(i);}}}}}//子弹移动(线程代码)class ammoMove extends Thread{public void run() {while(true) {for(int i=0;i<a2.size();i++) {//遍历子弹的ArrayLista2.get(i).setLocation(a2.get(i).getX(),a2.get(i).getY()-10);//位置移动,在原基础向上移动10if(a2.get(i).getY()<=-30) {//子弹移动到窗口外,变得不可见,然后从对应的ArrayList中移除a2.get(i).setVisible(false);a2.remove(i);}}try {this.sleep(100);//100毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}

相撞判断

//战机与敌机相撞(线程代码)class playerBoom extends Thread{public void run() {while(true) {try {this.sleep(100);//100毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}for(int i=0;i<a1.size();i++) {//遍历敌机对应的ArrayListif(a1.get(i).isVisible()) {//当敌机可视if(jl2.getY()-a1.get(i).getY()<=a1.get(i).getHeight()&&jl2.getY()-a1.get(i).getY()>=-jl2.getHeight()) {//敌机与战机相遇if(jl2.getX()-a1.get(i).getX()>=-jl2.getWidth()&&jl2.getX()-a1.get(i).getX()<=a1.get(i).getWidth()) {a1.get(i).setVisible(false);//敌机不可视//游戏结束new game_plane_3();dispose();return;//结束该线程}}}}}}}//子弹与敌机相撞(线程代码)class ammoBoom extends Thread{public void run() {while(true) {try {this.sleep(100);//100毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}for(int i=0;i<a1.size();i++) {//遍历敌机对应的ArrayListfor(int j=0;j<a2.size();j++) {//遍历子弹对应的ArrayListif(a1.get(i).isVisible()&&a2.get(j).isVisible()) {//当子弹与敌机都可视if(a2.get(j).getY()-a1.get(i).getY()<=a1.get(i).getHeight()&&a2.get(j).getY()-a1.get(i).getY()>=-10) {//子弹与敌机相遇if(a2.get(j).getX()-a1.get(i).getX()>=-a2.get(j).getWidth()&&a2.get(j).getX()-a1.get(i).getX()<=a1.get(i).getWidth()) {a1.get(i).setVisible(false);//对应的敌机不可视a2.get(j).setVisible(false);//对应的子弹不可视}}}}}}}}

完整代码

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.*;
public class game_plane_2 extends JFrame{ImageIcon image1=new ImageIcon("game_image/background.png");//背景图片路径ImageIcon image2=new ImageIcon("game_image/player1.png");//战机图片路径JLabel[] enemy=new JLabel[50000];ArrayList<JLabel> a1=new ArrayList<JLabel>();//存放敌机JLabel[] ammo=new JLabel[50000];ArrayList<JLabel> a2=new ArrayList<JLabel>();//存放子弹JLabel jl1=new JLabel(image1);JLabel jl2=new JLabel(image2);JLayeredPane layeredPane=new JLayeredPane(); int X=200,Y=500;//记录鼠标位置X,Yint enemy_num=0,ammo_num=0;public game_plane_2() {jl1.addMouseMotionListener(new mouse1());//添加监听器jl2.setBounds(X, Y, image2.getIconWidth(), image2.getIconHeight());//战机位置和大小jl1.setBounds(0, 0, image1.getIconWidth(), image1.getIconHeight());//背景位置和大小layeredPane.add(jl1, JLayeredPane.DEFAULT_LAYER);layeredPane.add(jl2, JLayeredPane.MODAL_LAYER);new enemyCreate().start();//敌机生成的线程启动new ammoCreate().start();//子弹生成的线程启动new enemyMove().start();//敌机移动的线程启动new ammoMove().start();//子弹移动的线程启动new ammoBoom().start();//子弹与敌机相撞的线程启动new playerBoom().start();//战机与敌机相撞的线程启动this.setLayeredPane(layeredPane);this.setTitle("飞机大战");//窗体标题this.setResizable(false);//窗体不可最大化this.setSize(image1.getIconWidth(),image1.getIconHeight());//设置大小this.setLocationRelativeTo(null);//窗体位置this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);//窗体关闭this.setVisible(true);//窗体可视}class mouse1 extends MouseMotionAdapter{@Overridepublic void mouseMoved(MouseEvent e) {X=e.getX();//得到鼠标X坐标Y=e.getY();//得到鼠标Y坐标jl2.setLocation(X-30, Y-35);//战机根据鼠标设置位置//通过监听器,只要鼠标移动就执行,//图片根据显示效果更改坐标值}}//战机与敌机相撞(线程代码)class playerBoom extends Thread{public void run() {while(true) {try {this.sleep(100);//100毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}for(int i=0;i<a1.size();i++) {//遍历敌机对应的ArrayListif(a1.get(i).isVisible()) {//当敌机可视if(jl2.getY()-a1.get(i).getY()<=a1.get(i).getHeight()&&jl2.getY()-a1.get(i).getY()>=-jl2.getHeight()) {//敌机与战机相遇if(jl2.getX()-a1.get(i).getX()>=-jl2.getWidth()&&jl2.getX()-a1.get(i).getX()<=a1.get(i).getWidth()) {a1.get(i).setVisible(false);//敌机不可视//游戏结束new game_plane_3();dispose();return;//结束该线程}}}}}}}//子弹与敌机相撞(线程代码)class ammoBoom extends Thread{public void run() {while(true) {try {this.sleep(100);//100毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}for(int i=0;i<a1.size();i++) {//遍历敌机对应的ArrayListfor(int j=0;j<a2.size();j++) {//遍历子弹对应的ArrayListif(a1.get(i).isVisible()&&a2.get(j).isVisible()) {//当子弹与敌机都可视if(a2.get(j).getY()-a1.get(i).getY()<=a1.get(i).getHeight()&&a2.get(j).getY()-a1.get(i).getY()>=-10) {//子弹与敌机相遇if(a2.get(j).getX()-a1.get(i).getX()>=-a2.get(j).getWidth()&&a2.get(j).getX()-a1.get(i).getX()<=a1.get(i).getWidth()) {a1.get(i).setVisible(false);//对应的敌机不可视a2.get(j).setVisible(false);//对应的子弹不可视}}}}}}}}//敌机移动(线程代码)class enemyMove extends Thread{public void run() {while(true) {try {this.sleep(100);//100毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}for(int i=0;i<a1.size();i++) {//遍历敌机对应的ArrayLista1.get(i).setLocation(a1.get(i).getX(), a1.get(i).getY()+10);//敌机移动,在原基础向下移动10if(a1.get(i).getY()>=image1.getIconHeight()) {//敌机移动到窗口外,变得不可见,然后从对应的ArrayList中移除a1.get(i).setVisible(false);a1.remove(i);}}}}}//子弹移动(线程代码)class ammoMove extends Thread{public void run() {while(true) {for(int i=0;i<a2.size();i++) {//遍历子弹的ArrayLista2.get(i).setLocation(a2.get(i).getX(),a2.get(i).getY()-10);//位置移动,在原基础向上移动10if(a2.get(i).getY()<=-30) {//子弹移动到窗口外,变得不可见,然后从对应的ArrayList中移除a2.get(i).setVisible(false);a2.remove(i);}}try {this.sleep(100);//100毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}//敌机生成(线程代码)class enemyCreate extends Thread{public void run() {while(true) {try {this.sleep(1000);//1000毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}ImageIcon image_enemy=new ImageIcon("game_image/enemy.png");//敌机图片路径enemy[enemy_num]=new JLabel(image_enemy);Random random=new Random();enemy[enemy_num].setBounds(random.nextInt(image1.getIconWidth()), 0, image_enemy.getIconWidth(), image_enemy.getIconHeight());//设置敌机生成位置和大小(位置横坐标通过Random随机生成)layeredPane.add(enemy[enemy_num], JLayeredPane.MODAL_LAYER);a1.add(enemy[enemy_num]);//将每一个生成的敌机存放到ArrayList中enemy_num++;}}}//子弹生成(线程代码)class ammoCreate extends Thread{public void run() {while(true) {try {this.sleep(1000);//1000毫秒执行一次} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}ImageIcon image_ammo=new ImageIcon("game_image/ammo.png");//子弹图片路径ammo[ammo_num]=new JLabel(image_ammo);ammo[ammo_num].setBounds(X, Y-40, image_ammo.getIconWidth(), image_ammo.getIconHeight());//子弹位置和大小(X,Y为鼠标的X,Y坐标)layeredPane.add(ammo[ammo_num], JLayeredPane.MODAL_LAYER);a2.add(ammo[ammo_num]);//将每一个生成的子弹存放到ArrayList中ammo_num++;}}}
}
如有错误
欢迎指出

下一篇:用JAVA制作小游戏——飞机大战(三)

用JAVA制作小游戏——飞机大战(二)相关推荐

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

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

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

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

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

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

  4. 用JAVA制作小游戏——推箱子(二)

    本篇博客主要是推箱子游戏界面功能的代码讲解. 首先先给出这段代码的部分运行截图: 重难点: 游戏界面主要有五个重难点: 固定好地图的位置 地图的显示 构建菜单栏 读取地图数据 玩家操作功能实现 地图的 ...

  5. 用JAVA制作小游戏——推箱子(一)

    本篇博客是对推箱子游戏首页代码的展示 效果图: 难点: 在背景图上添加按钮. 由于直接使用add方法,会变成图片一块区域,按钮一块区域,彼此互不重叠,形成的界面效果不太好,因此用了JLayeredPa ...

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

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

  7. 用JAVA制作小游戏——推箱子(三)

    本篇博客主要是对推箱子地图编辑器功能的代码讲解. 首先给出这段代码的部分运行截图: 重难点: 地图编辑器主要有三个重难点: 需要有一个绘制地图的界面 能够实现地图绘制的功能 地图绘制完成后需要将地图内 ...

  8. 用java制作小游戏:小恐龙跑酷

    用java制作小游戏:小恐龙跑酷 插入链接与图片 运行图片:( 第一次做游戏,画风比较丑哈!最左边的就是主角小恐龙了,中间的是障碍物仙人掌,右边的小狗也是障碍物,右上角的是分数条) 图片: 以下是Ja ...

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

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

最新文章

  1. LeetCode简单题之有效的字母异位词
  2. ora-12545连接错误解决一例
  3. prima evb_用Priam设置Cassandra
  4. 为您的下一个基于Spring的应用程序考虑使用spring-boot的原因!
  5. centos7重装python_CentOS7重装yum和python
  6. android可以定义函数吗,Android自定义view 你所需要知道的基本函数总结
  7. js时间搓化为今天明天_来揭秘化妆品为啥会搓泥?
  8. sql server 事务与try catch
  9. 继续!从顶会论文看对比学习的应用!
  10. C语言冒泡排序算法详解
  11. 1976国际标准大气模型_Matlab
  12. 2021-05-17
  13. 全球对冲基金精英榜【转载】
  14. phpcms 下载数统计
  15. 【Word】去掉“项目符号/编号”之后的制表符
  16. 北航os实验lab2笔记
  17. PS问题汇总2017
  18. 群体遗传,进化分析利器Popgene分享给大家
  19. crontab指定时间
  20. 使用python批量下载需要的分子的SDF文件

热门文章

  1. Extjs DateField onchange
  2. Windows Phone 8初学者开发—第6部分:设置应用程序的样式
  3. 我看到东边的阳光就这样照进车窗
  4. linux 系统让服务后台运行
  5. Java集合系列:Vector解析
  6. akka balance router的实现
  7. Java生产环境下性能监控与调优详解 大纲 学习感悟
  8. linux rpm安装软件笔记
  9. 从源码分析RocketMQ系列-Producer的SendResult来自哪里?
  10. 基于Libevent最小根堆定时器的C++定时器实现