关于飞机大战的非最终版源码
文章目录
- 前言
- 文章主题
- 窗口类
- 飞机类
- 炮弹类
- 窗口大小类
- 爆炸特效类
- 物体父类
- 工具类
- 总结
前言
记录历时一周的飞机大战小成果
文章主题
窗口类
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 }
总结
暂无
关于飞机大战的非最终版源码相关推荐
- 【180629】大鱼吃小鱼游戏VC++最终版源码
基于VC++平台编写的大鱼吃小鱼Game游戏最终版,运行后 会出现带背景的 类似大鱼吃小鱼的游戏,当然不能喝真的相比,只是一个课程设计,可以设置关卡. 界面方面运用了SkinPlusPlusDLL.d ...
- 飞机大战--python基础项目(附源码和原理讲解)
声明 此项目是对python基础语法和高级语法的结合,学完python基础和高级可以拿此项目练手,说的比较细,涵盖了pygame一些知识点的讲解. 项目展示 安装准备 这里我们要用到pygame模块, ...
- 前端技术搭建飞机大战小游戏(内含源码)
The sand accumulates to form a pagoda ✨ 写在前面 ✨ 功能介绍 ✨ 页面搭建 ✨ 样式设置 ✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了弹珠游戏,当 ...
- 雷霆战机9.5全新上线,Python+Pygame开发飞机大战完整游戏项目(附源码)
项目名称:太空大战 开发环境:Python3.6.4 第三方库:Pygame1.9.6 代码编辑器:Sublime Text 先来看一下游戏画面吧! 游戏画面动态且丰富哦! 需求分析 利用Pyt ...
- python小游戏——飞机大战小游戏(附源码)
写在前面的一些P话: 大家之前用python编写过飞机大战的部分代码, 只能够展示英雄飞机,背景,敌机和发射子弹, 今天把背景音乐,击毁敌机,爆炸特效,得分等等相关功能一并加入进来, 代码有点长,三百 ...
- 关于Python初级阶段模仿飞机大战的小游戏制作源码
# main.py import pygame import sys import traceback import king import face import bb import supply ...
- python入门笔记——飞机大战(极简版、未进行继承优化)
python入门笔记--飞机大战(极简版.未进行继承优化) import random import pygame# 引用pygame里的模块 from pygame.locals import *# ...
- 《飞机大战》安卓游戏开发源码(三)
为什么80%的码农都做不了架构师?>>> 本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处:http://www.pm-road.com/index.php/2014/1 ...
- 编程语言用 Java 开发一个打飞机小游戏(附完整源码)
编程语言用 Java 开发一个打飞机小游戏(附完整源码) 上图 写在前面 技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习.java确实不适合写桌面应用,这里只是通过 ...
最新文章
- java里的局部变量为什么不能加static?
- MyEclipse 2014中 Window--customize perspective 功能 打不开的解决办法
- 分布式文件系统—HDFS—基本介绍
- Hive2.1.1的安装教程(元数据放在本地Mysql)
- python 句子中没有中文_人生感悟经典句子,生活中可以没有诗歌,但不能没有诗意...
- Javascript 仿Flash 图片切换 及 Flash 图片切换
- 吴恩达《机器学习》--- Logistic分类
- DevOps实践教程 华为云 系列教程2021 合集
- lnmp一键安装远程连接mysql_阿里云 lnmp一键安装包远程访问Mysql
- win7计算机怎么录屏,win7电脑怎么录屏?这个实用工具给你答案!
- 微信小程序——案例:收货信息表单
- 【SQL】使用SQL求1-100的质数
- 小数除法竖式计算过程
- 幼儿学习品质提升的培养策略问卷
- python中的美元符号_类似美元$这个符号pyCharm2.0里怎么输入不好用呢,美元pycharm2.0,如题,键盘没任何问题,就...
- 计算机专业买什么u盘好,大容量u盘要格式化要选择哪种格式比较好用?-win7之家...
- 前端FormData详解
- SqlMDF数据提取工具
- IDL是什么呢???
- 论信息系统项目的整体管理
热门文章
- java编写的打印标签图片文档的软件
- Boosting Monocular Depth Estimation Models to High-Resolution via Content-Adaptive Multi-Resolution
- 使用scrapy爬取京东的手机数据
- 【独行秀才】macOS Big Sur 11.5.2 正式版(20G95)原版镜像
- 24点休闲益智小游戏
- C++中的模板(templates)
- 【问题思考总结】什么是行通选,列通选?他们又和片选线是什么关系?
- 哈工大李治军老师的操作系统学习笔记
- 【米家】Charles 抓包调试
- 笔记本电脑如何查看已经连的无线网络WIFI密码