JAVA飞机移动斜着走_java复习 做一个简易的飞机游戏
最近闲来无事复习下java基础,没有特别复杂的功能,一切从简,旨在回顾知识点!!!
游戏效果如下:
我们通过键盘控制飞机前后移动躲避炮弹,如果碰到炮弹则会爆炸,游戏结束并显示游戏坚持的时间
基本的功能实现
MyGameFrame类
package com.xiaodao.game;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Date;
/**
* 飞机游戏的主窗口
* @author 刘小叨
*
*/
public class MyGameFrame extends Frame {
Image plane = GameUtil.getImage("images/plane.png");
Image bg = GameUtil.getImage("images/bg.jpg");
Date startTime = new Date();//游戏起始时刻
Date endTime;
int gameTime;
Plane p = new Plane(plane,250,250);
Shell s = new Shell();
Shell[] shells = new Shell[50];
Explode bao;
@Override
public void paint(Graphics g) {//自动被调用 g 就是一支画笔
Color c = g.getColor();
g.drawImage(bg, 0, 0, null);
p.drawSelf(g);//画飞机
//画出所有炮弹
for(int i=0;i
GameUtil工具类
package com.xiaodao.game;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
public class GameUtil {
//工具类最好将构造器私有化
private GameUtil() {
}
/**
* 返回指定路径的图片对象
* @param path
* @return
*/
public static Image getImage(String path) {
BufferedImage bi = null;
try {
URL u = GameUtil.class.getClassLoader().getResource(path);
bi = ImageIO.read(u);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bi;
}
}
GameObject类
package com.xiaodao.game;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
/**
* 游戏物体的父类
* @author 刘小叨
*
*/
public class GameObject {
Image image;
double x,y;
int speed;
int width,height;
public void drawSelf(Graphics g) {
g.drawImage(image, (int)x, (int)y,null);
}
public GameObject(Image image, double x, double y, int speed, int width, int height) {
super();
this.image = image;
this.x = x;
this.y = y;
this.speed = speed;
this.width = width;
this.height = height;
}
public GameObject(Image image, double x, double y) {
super();
this.image = image;
this.x = x;
this.y = y;
}
public GameObject() {
}
/**
* 返回物体所在的矩形,便于后续的碰撞检测
* @return
*/
public Rectangle getRect() {
return new Rectangle((int)x, (int)y, width, height);
}
}
Plane类
package com.xiaodao.game;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
public class Plane extends GameObject {
boolean left,up,right,down;
boolean live = true;
public void drawSelf(Graphics g) {
if(live) {
g.drawImage(image, (int)x, (int)y,null);
if(x>0 && x40 && y40 && yConstant.GAME_WIDTH-width && y>40 && y0 && xConstant.GAME_HEIGHT-height) {
if(left) {
x -=speed;
}
if(right) {
x +=speed;
}
if(up) {
y -=speed;
}
}
else if(x>0 && xConstant.GAME_HEIGHT-height) {
if(right) {
x +=speed;
}
if(up) {
y -=speed;
}
}
else if(x>Constant.GAME_WIDTH-width && y>Constant.GAME_HEIGHT-height) {
if(up) {
y -=speed;
}
if(left) {
x -=speed;
}
}
else if(x>Constant.GAME_WIDTH-width && y<40) {
if(down) {
y +=speed;
}
if(left) {
x -=speed;
}
}
else if(x<0 && y<40) {
if(down) {
y +=speed;
}
if(right) {
x +=speed;
}
}else {
}
}
}
public Plane(Image image,double x, double y) {
this.image = image;
this.x = x;
this.y = y;
this.speed = 4;
this.width = image.getWidth(null);
this.height = image.getHeight(null);
}
//按下某个键增加相应的方向
public void addDirection(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT:
left = true;
break;
case KeyEvent.VK_UP:
up = true;
break;
case KeyEvent.VK_RIGHT:
right = true;
break;
case KeyEvent.VK_DOWN:
down = true;
break;
default:
break;
}
}
//按下某个键取消相应的方向
public void minusDirection(KeyEvent e) {
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT:
left = false;
break;
case KeyEvent.VK_UP:
up = false;
break;
case KeyEvent.VK_RIGHT:
right = false;
break;
case KeyEvent.VK_DOWN:
down = false;
break;
default:
break;
}
}
}
Shell类
package com.xiaodao.game;
import java.awt.Color;
import java.awt.Graphics;
/**
* 炮弹类
* @author 刘小叨
*
*/
public class Shell extends GameObject{
double degree;
public Shell() {
x = 200;
y = 200;
width = 10;
height = 10;
speed = 4;
degree = Math.random()*Math.PI*2;
}
public void draw(Graphics g) {
Color c = g.getColor();
g.setColor(c.YELLOW);
g.fillOval((int)x, (int)y, width, height);
//炮弹沿任意角度去飞
x += speed*Math.cos(degree);
y += speed*Math.sin(degree);
if(x<0||x>Constant.GAME_WIDTH-width) {
degree = Math.PI-degree;
}
if(y<40||y>Constant.GAME_HEIGHT-height) {
degree =-degree;
}
g.setColor(c);
}
}
Constant类
package com.xiaodao.game;
public class Constant {
public static final int GAME_WIDTH = 500;
public static final int GAME_HEIGHT = 500;
}
Explode类
package com.xiaodao.game;
import java.awt.Graphics;
import java.awt.Image;
/**
* 爆炸类
* @author 刘小叨
*
*/
public class Explode {
double x,y;
static Image[] imgs= new Image[16];
static {
for(int i=0;i<16;i++) {
imgs[i] =GameUtil.getImage("images/explode/e"+(i+1)+".gif");
imgs[i].getWidth(null);
}
}
int count;
public void draw(Graphics g) {
if(count<=15) {
g.drawImage(imgs[count], (int)x, (int)y, null);
count++;
}
}
public Explode(double x,double y) {
this.x = x;
this.y = y;
}
}
总结与思考
使用AWT和Swing GUI技术 画出窗口和图形加载,JFrame类java.swing中的主类,画的窗口必须继承JFrame,在继承java.swing.JFrame之后仍发现有轻微闪烁,只能使用继承java.awt.Frame类,并使用“双缓冲技术”来解决闪烁问题
用addWindowListener()来增加窗口监听事件,System.exit(0)表示应用正常结束,使用GameUtil工具类来加载图片代码,设计GameObject类,并且用它作为所有游戏体的父类,以便于Plane类和Shell类继承,Plane类需要键盘和程序交互,每次按下松开键都应该触发相应的键盘事件,通过上下左右来控制飞机,程序根据四个方向的状态进行移动,只需要对飞机的X,Y坐标进行加减法,并且需要注意飞机移动不应该越过边界,我们需要在Plane类中限制飞机活动的范围。
在MyGameFrame类中使用KeyMonitor内部类来实现键盘监听功能,Shell类在固定处生成炮弹,方向随机,并遇到边界会自动反弹,在MyGameFrame类中增加数组用来添加一定数量的炮弹,然后进行矩形检测来判断飞机和炮弹是否有过碰撞,当飞机和炮弹碰撞后会出现爆炸效果,而爆炸效果实际上是一系列爆炸的图片进行轮播。我们在初始化窗口时定义一个起始时间,当飞机与炮弹碰撞游戏结束时,保存一个结束时间,两者相减就是游戏存活的时间。
JAVA飞机移动斜着走_java复习 做一个简易的飞机游戏相关推荐
- JAVA飞机移动斜着走_通过键盘的能够使飞机上下左右八个方向移动,现在实现键盘监听时没有反应是怎么回事,哪里出错了?...
通过键盘的能够使飞机上下左右八个方向移动,现在实现键盘监听时没有反应是怎么回事,哪里出错了? 关注:93 答案:2 mip版 解决时间 2021-01-30 07:58 提问者雨份凉伴 2021- ...
- java如何做网页_java怎么做一个简单网页?网页包括什么?
学了java程序之后,大家就可以将这些运用到生活中去,比如做一个简单的网页.正好也可以检测自己学了怎么样,那么接下来,我们就来给大家讲解一下这方面的内容. 用Java语言编写实现一个简单的WEB浏览器 ...
- 手把手带你做一个Python打飞机游戏
搭建界面 #coding=utf-8 import pygame'''1\. 搭建界面,主要完成窗口和背景图的显示 '''if __name__ == "__main__":#1\ ...
- 逐步实现一个简易的飞机大战(c++)
用easy图形库做一个简单的c++小游戏-简单版飞机大战 某大一学生,无奈在家上网课,慌得无聊.无意间认识了easyx图形库,便有了新的想法,搞一个飞机大战.当时每天写一点,日积月累,也就完成了. 以 ...
- 用java做一个简单的打字游戏
Java也是可以做桌面程序的.只不过需要运行在装有JDK的电脑环境上,所以应用不是很广泛,但是用来提高自身的代码逻辑还是可以的!偶有一天看到金山的打字通,就想起何不做个简单的打字游戏用来练练手.于是就 ...
- java if 没有_java – 如何做一个决定没有if语句
我正在学习Java课程,我们还没有正式学习if语句.我在学习,看到这个问题: Write a method called pay that accepts two parameters: a real ...
- java对xml文件的读写_java 自己做的对XML文件的读写操作
XML文件实例: WEB-INF/web.xml type="javax.sql.DataSource" /> type="javax.sql.DataSource ...
- java new date 减一天_java日期增加一个月或减少一天
我们在java开发中,遇到一个Date类型的日期,希望在它基础上增加一个月,赋值给另外一个变量,这个时候该如何处理 /**** * 传入具体日期 ,返回具体日期增加一个月. * @param date ...
- java如何写电梯代码_JAVA编写的一个简易的电梯模型,完成电梯如何满足乘客上下楼需求(ElevatorTest)...
[实例简介] [实例截图] [核心代码] package ele; import java.util.LinkedList; import java.util.Queue; public class ...
最新文章
- ibm服务器报错代码大全_微信认证订阅号开发者模式服务器配置自定义菜单PHP独立完整版...
- 美国辛辛那堤儿童医学中心招生物信息博士, 博士后和访问学者——单细胞转录组和表观方向...
- Android 应用防止被二次打包指南
- 用php实现动态产生xml文件以及从xml文件中抽取数据转化成html的
- (4)段描述符P,G位
- 如何利用python进行数据分析统计服_利用Python进行数据分析
- 谱聚类方法-MATLAB
- 错误代码0x800f0950怎么解决_解决win10安装net framework 3.5失败(错误代码 0x800F0950)...
- Mac OSX 下如何显示隐藏文件
- SQL高级---SQL NULL 值
- 企业微信API学习笔记
- 数据结构与算法分析(五)队列
- 威斯康星大学计算机科学教授,UW机器学习和数据科学活动吸引了国际知名的计算机科学家...
- Oracle (01)Oracle数据库的安装步骤.搭建上课所用的数据库环境.table (二维表).查看表结构.数据库中常用的数据类型
- Simon 5有哪些新功能? Simon 5 Mac版新功能介绍
- “竞速”智能网联汽车,领头雁为何是长沙?
- 计算机网络技术主要课程阐述,计算机网络技术专业实训课程体系研究
- springboot+quartz报错:Table ‘XXXX.QRTZ_TRIGGERS‘ doesn‘t exist
- 微信小程序元素显示隐藏方法总结(原生)
- 基于Netty的Android局域网IP电话
热门文章
- 多模态机器学习简述(Guide to Multimodal Machine Learning)
- 二叉树的深度 | 分治 +回溯 + 迭代
- sublimelinter_开发人员使用SublimeLinter指南
- C语言源代码系列-管理系统之单项选择题标准化考试系统设计
- GStreamer学习笔记
- 通过ASM1117实现5V转3.3V电路
- Java设计模式6,依赖倒置原则
- 空域图像增强-图像灰度变换
- Python-pydicom读取dcm文件报错-2021.6.5
- 轴功率测试软件,船用轴功率检测仪 在线轴功率测量装置