文章目录

  • 前言
  • 文章主题
    • 窗口类
    • 飞机类
    • 炮弹类
    • 窗口大小类
    • 爆炸特效类
    • 物体父类
    • 工具类
  • 总结

前言

记录历时一周的飞机大战小成果


文章主题

窗口类

1 package PlayGame;2 3 import java.awt.Frame;4 import java.awt.*;5 import java.awt.event.KeyAdapter;6 import java.awt.event.KeyEvent;7 import java.awt.event.WindowAdapter;8 import java.awt.event.WindowEvent;9 import java.util.Date;10 11 public class MyGameFrame extends Frame {12     Image bg = GameUtil.getImage("images/背景.png");      //调取图片13     Image planeImage = GameUtil.getImage("images/飞机.png");14 15     Explode explode;    //调用 爆炸 类16     Shell[] shells = new Shell[50];     //(数组里放五十个炮弹)17     Plane plane = new Plane(planeImage,300,300);//新建对象 接下来plane 就代表了 Plane类18     Date starTime = new Date();//开始时间19     Date endTime;    //结束时间20     int time;       //游戏持续的时间21 22     //窗口绘制,自动被调用 不需要管他 ,g相当于一只画笔23     @Override24     public void paint(Graphics g) {25         Color aa=g.getColor();      //让画笔最终换回最初的颜色26         g.setColor(Color.WHITE);    //给画笔赋予颜色27         Font f = new Font("宋体",Font.HANGING_BASELINE,50);   //换字体、粗细、大小28         g.setFont(f);29 30         g.drawImage(bg,0,0,null);    //画背景31         plane.drawSelf(g);    //画飞机32 33         //循环画炮弹34         for(int a = 0;a<50;a++ ) {35             shells[a].drawSelf(g);36 37             //飞机和炮弹的碰撞检测38             boolean peng =shells[a].getRectangle().intersects(plane.getRectangle());39             if(peng){40                 plane.live = false;41                 explode = new Explode(plane.x, plane.y);42                 explode.draw(g);43                 //屏幕显示持续时间44                 endTime = new Date();45                 time = (int) ((endTime.getTime() - starTime.getTime())/1000) ;46             }47         }48         if (!plane.live)49             g.drawString("游戏时间:" + time, 150, 150);50 51         g.setColor(aa);//还回颜色52     }53 54     //内部类,多次重写窗口55     class PaintThread extends Thread{56         @Override57         public void run() {58             while(true) {59                 repaint();//重画窗口60                 try {61                     Thread.sleep(40);   //1s=1000ms(毫秒),每40毫秒重画一次,一秒重画25次62                 } catch (InterruptedException e) {63                     e.printStackTrace();64                 }65             }66         }67     }68 69     //初始化窗口70     public void launchFrame(){71 72         this.setTitle("飞机大战");73         //窗口可视化74         this.setVisible(true);75         //窗口大小76         this.setSize(Constant.GAME_WIDH,Constant.GAME_HIGHT);77         //窗口位置78         this.setLocation(250,300);79         //窗口监视(关闭窗口,停止运行)80         this.addWindowListener(new WindowAdapter() {81             @Override82             public void windowClosing(WindowEvent e) {83                 System.exit(0);84             }85         });86         addKeyListener(new KeyMonitor());//监听键盘87         new PaintThread().start();   //启动重画窗口的线程88         //在窗口刚建立的时候就出现飞机89         for(int a = 0; a < 50 ; a++){90             shells[a] = new Shell();91         }92     }93 94     //键盘监视,看按下、抬起哪个键95     class KeyMonitor extends KeyAdapter{96 97         //按下哪个键,增加该键98         @Override99         public void keyPressed(KeyEvent e) {100             plane.addDirection(e);
101         }
102         //抬起哪个键,就取消该键
103         @Override
104         public void keyReleased(KeyEvent e) {105             plane.minusDirection(e);
106         }
107     }
108
109     //双缓冲
110     private Image offScreenImage = null;
111
112     public void update(Graphics g) {113         if(offScreenImage == null)
114             offScreenImage = this.createImage(Constant.GAME_WIDH,Constant.GAME_HIGHT);//这是游戏窗口的宽度和高度
115
116         Graphics gOff = offScreenImage.getGraphics();
117         paint(gOff);
118         g.drawImage(offScreenImage, 0, 0, null);
119     }
120
121
122     public static void main(String[] args) {123         MyGameFrame mFame = new MyGameFrame();
124         mFame.launchFrame();
125     }
126 }

飞机类

1 package PlayGame;2 3 import java.awt.*;4 import java.awt.event.KeyEvent;5 6 public class Plane extends GameObject {7     int speed = 5;8     boolean live = true;9
10     boolean left,right,up,down;//飞机方向
11
12     public void drawSelf(Graphics g) {13
14
15         //通过判断上下左右键的真假值,来使得飞机移动
16         if(live) {17
18             g.drawImage(img, (int) x, (int) y, null);
19             if (left) {             //如果 left 是真,坐标x-speed(x = 50 ,speed = 1,就是说明按一下left键 ,就成了49)
20                 x -= speed;
21             }
22             if (right) {23                 x += speed;
24             }
25             if (up) {26                 y -= speed;
27             }
28             if (down) {29                 y += speed;
30             }
31         }
32     }
33
34     //被调用对象,传送图片,坐标
35     public Plane(Image img, double x, double y) {36         this.img = img;
37         this.x = x;
38         this.y = y;
39         this.height = img.getWidth(null);
40         this.width = img.getWidth(null);
41
42     }
43
44     //按下某个键,增加相应的方向
45     public void addDirection(KeyEvent e){46         switch (e.getKeyCode()){47             case KeyEvent.VK_LEFT:  //KeyEvent.VK_left :告诉left对应的数字是多少
48                 left = true;
49                 break;
50             case KeyEvent.VK_UP:
51                 up = true;
52                 break;
53             case KeyEvent.VK_RIGHT:
54                 right = true;
55                 break;
56             case KeyEvent.VK_DOWN:
57                 down = true;
58                 break;
59             case KeyEvent.VK_Q:
60                 live = true;
61                 break;
62         }
63     }
64
65     //按下某个键,取消相应的方向 ,如果不取消 就会一直向这个方向移动
66     public void minusDirection(KeyEvent e){67         switch (e.getKeyCode()){68             case KeyEvent.VK_LEFT:  //KeyEvent.VK_left :告诉left对应的数字是多少
69                 left = false;
70                 break;
71             case KeyEvent.VK_UP:
72                 up = false;
73                 break;
74             case KeyEvent.VK_RIGHT:
75                 right = false;
76                 break;
77             case KeyEvent.VK_DOWN:
78                 down = false;
79                 break;
80
81         }
82     }
83
84 }

炮弹类

1 package PlayGame;2 3 import java.awt.*;4 5 public class Shell extends GameObject{6 7     double degree;      //角度8     Image img = GameUtil.getImage("images/炮弹.png");9
10     public Shell(){11         degree = Math.random()*Math.PI*2; // random()是0-1之间的随即数,2Π就是360度
12         x = 200;
13         y = 200;
14         width = 10;
15         height = 20;
16         speed = 3;
17     }
18
19     public void drawSelf(Graphics g){20         //传进来一直画笔,作为连接两个类的点
21         g.drawImage(img,(int)x,(int)y,width,height,null);
22         //炮弹沿着任意角度飞行
23         x += speed*Math.cos(degree);
24         y += speed*Math.sin(degree);
25
26         //设立边界
27         if(x<0||x>Constant.GAME_WIDH-height){28             degree = Math.PI - degree;
29         }
30         if(y<20||y>Constant.GAME_HIGHT-width){31             degree = -degree;
32         }
33
34     }
35
36
37
38
39 }

窗口大小类

1 package PlayGame;
2
3 public class Constant {4     public static final int GAME_WIDH = 500;
5     public static final int GAME_HIGHT = 500;
6
7 }

爆炸特效类

1 package PlayGame;2 3 import java.awt.*;4 5 public class Explode extends GameObject{6     double x,y;7     static Image[] imgs = new Image[16];8     static {9         for(int i=0;i<6;i++){10             imgs[i] = GameUtil.getImage("images/"+(i+1)+".png");
11             imgs[i].getWidth(null);
12         }
13     }
14
15     int count;
16
17     public void draw(Graphics g){18         if(count<=15){19             g.drawImage(imgs[count], (int)x, (int)y, null);
20             count++;
21         }
22     }
23     //x,y是飞机的坐标
24     public Explode(double x,double y){25         this.x = x;
26         this.y = y;
27     }
28 }

物体父类

1 package PlayGame;2 3 //游戏物体的父类4 5 import java.awt.*;6 7 public class GameObject {8     Image img;          //图片9     double x, y;         //坐标
10     int speed;          //速度
11     int width, height;   //宽和高
12
13     //画图
14     public void drawSelf(Graphics g) {15         g.drawImage(img, (int) x, (int) y, null);
16     }
17
18     public GameObject(Image img, double x, double y, int speed, int width, int height) {19         this.img = img;
20         this.x = x;
21         this.y = y;
22         this.speed = speed;
23         this.width = width;
24         this.height = height;
25     }
26
27     public GameObject(Image img, double x, double y) {28         this.img = img;
29         this.x = x;
30         this.y = y;
31     }
32
33     //返回当前物体所在的矩形,便于以后设置碰撞检测
34     public Rectangle getRectangle (){35         return new Rectangle((int) x,(int) y,width,height);
36     }
37
38
39     public GameObject(){40     }
41
42 }

工具类

1 package PlayGame;2 3 import java.awt.Image;4 import java.awt.image.BufferedImage;5 import java.io.IOException;6 import java.net.URL;7 import javax.imageio.ImageIO;8 9 public class GameUtil {10     // 工具类最好将构造器私有化。这样除了包里面的人外都不能使用。
11     private GameUtil() {12
13     }
14     //指定图片路径,返回对象
15     public static Image getImage(String path) {16         BufferedImage bi = null;
17         try {18             URL u = GameUtil.class.getClassLoader().getResource(path);
19             bi = ImageIO.read(u);
20         } catch (IOException e) {21             e.printStackTrace();
22         }
23         return bi;
24     }
25 }

总结

暂无

关于飞机大战的非最终版源码相关推荐

  1. 【180629】大鱼吃小鱼游戏VC++最终版源码

    基于VC++平台编写的大鱼吃小鱼Game游戏最终版,运行后 会出现带背景的 类似大鱼吃小鱼的游戏,当然不能喝真的相比,只是一个课程设计,可以设置关卡. 界面方面运用了SkinPlusPlusDLL.d ...

  2. 飞机大战--python基础项目(附源码和原理讲解)

    声明 此项目是对python基础语法和高级语法的结合,学完python基础和高级可以拿此项目练手,说的比较细,涵盖了pygame一些知识点的讲解. 项目展示 安装准备 这里我们要用到pygame模块, ...

  3. 前端技术搭建飞机大战小游戏(内含源码)

    The sand accumulates to form a pagoda ✨ 写在前面 ✨ 功能介绍 ✨ 页面搭建 ✨ 样式设置 ✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了弹珠游戏,当 ...

  4. 雷霆战机9.5全新上线,Python+Pygame开发飞机大战完整游戏项目(附源码)

    项目名称:太空大战 开发环境:Python3.6.4 第三方库:Pygame1.9.6 代码编辑器:Sublime Text 先来看一下游戏画面吧!  游戏画面动态且丰富哦!   需求分析 利用Pyt ...

  5. python小游戏——飞机大战小游戏(附源码)

    写在前面的一些P话: 大家之前用python编写过飞机大战的部分代码, 只能够展示英雄飞机,背景,敌机和发射子弹, 今天把背景音乐,击毁敌机,爆炸特效,得分等等相关功能一并加入进来, 代码有点长,三百 ...

  6. 关于Python初级阶段模仿飞机大战的小游戏制作源码

    # main.py import pygame import sys import traceback import king import face import bb import supply ...

  7. python入门笔记——飞机大战(极简版、未进行继承优化)

    python入门笔记--飞机大战(极简版.未进行继承优化) import random import pygame# 引用pygame里的模块 from pygame.locals import *# ...

  8. 《飞机大战》安卓游戏开发源码(三)

    为什么80%的码农都做不了架构师?>>>    本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处:http://www.pm-road.com/index.php/2014/1 ...

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

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

最新文章

  1. java里的局部变量为什么不能加static?
  2. MyEclipse 2014中 Window--customize perspective 功能 打不开的解决办法
  3. 分布式文件系统—HDFS—基本介绍
  4. Hive2.1.1的安装教程(元数据放在本地Mysql)
  5. python 句子中没有中文_人生感悟经典句子,生活中可以没有诗歌,但不能没有诗意...
  6. Javascript 仿Flash 图片切换 及 Flash 图片切换
  7. 吴恩达《机器学习》--- Logistic分类
  8. DevOps实践教程 华为云 系列教程2021 合集
  9. lnmp一键安装远程连接mysql_阿里云 lnmp一键安装包远程访问Mysql
  10. win7计算机怎么录屏,win7电脑怎么录屏?这个实用工具给你答案!
  11. 微信小程序——案例:收货信息表单
  12. 【SQL】使用SQL求1-100的质数
  13. 小数除法竖式计算过程
  14. 幼儿学习品质提升的培养策略问卷
  15. python中的美元符号_类似美元$这个符号pyCharm2.0里怎么输入不好用呢,美元pycharm2.0,如题,键盘没任何问题,就...
  16. 计算机专业买什么u盘好,大容量u盘要格式化要选择哪种格式比较好用?-win7之家...
  17. 前端FormData详解
  18. SqlMDF数据提取工具
  19. IDL是什么呢???
  20. 论信息系统项目的整体管理

热门文章

  1. java编写的打印标签图片文档的软件
  2. Boosting Monocular Depth Estimation Models to High-Resolution via Content-Adaptive Multi-Resolution
  3. 使用scrapy爬取京东的手机数据
  4. 【独行秀才】macOS Big Sur 11.5.2 正式版(20G95)原版镜像
  5. 24点休闲益智小游戏
  6. C++中的模板(templates)
  7. 【问题思考总结】什么是行通选,列通选?他们又和片选线是什么关系?
  8. 哈工大李治军老师的操作系统学习笔记
  9. 【米家】Charles 抓包调试
  10. 笔记本电脑如何查看已经连的无线网络WIFI密码