最近闲来无事复习下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复习 做一个简易的飞机游戏相关推荐

  1. JAVA飞机移动斜着走_通过键盘的能够使飞机上下左右八个方向移动,现在实现键盘监听时没有反应是怎么回事,哪里出错了?...

    通过键盘的能够使飞机上下左右八个方向移动,现在实现键盘监听时没有反应是怎么回事,哪里出错了? 关注:93  答案:2  mip版 解决时间 2021-01-30 07:58 提问者雨份凉伴 2021- ...

  2. java如何做网页_java怎么做一个简单网页?网页包括什么?

    学了java程序之后,大家就可以将这些运用到生活中去,比如做一个简单的网页.正好也可以检测自己学了怎么样,那么接下来,我们就来给大家讲解一下这方面的内容. 用Java语言编写实现一个简单的WEB浏览器 ...

  3. 手把手带你做一个Python打飞机游戏

    搭建界面 #coding=utf-8 import pygame'''1\. 搭建界面,主要完成窗口和背景图的显示 '''if __name__ == "__main__":#1\ ...

  4. 逐步实现一个简易的飞机大战(c++)

    用easy图形库做一个简单的c++小游戏-简单版飞机大战 某大一学生,无奈在家上网课,慌得无聊.无意间认识了easyx图形库,便有了新的想法,搞一个飞机大战.当时每天写一点,日积月累,也就完成了. 以 ...

  5. 用java做一个简单的打字游戏

    Java也是可以做桌面程序的.只不过需要运行在装有JDK的电脑环境上,所以应用不是很广泛,但是用来提高自身的代码逻辑还是可以的!偶有一天看到金山的打字通,就想起何不做个简单的打字游戏用来练练手.于是就 ...

  6. java if 没有_java – 如何做一个决定没有if语句

    我正在学习Java课程,我们还没有正式学习if语句.我在学习,看到这个问题: Write a method called pay that accepts two parameters: a real ...

  7. java对xml文件的读写_java 自己做的对XML文件的读写操作

    XML文件实例: WEB-INF/web.xml type="javax.sql.DataSource" /> type="javax.sql.DataSource ...

  8. java new date 减一天_java日期增加一个月或减少一天

    我们在java开发中,遇到一个Date类型的日期,希望在它基础上增加一个月,赋值给另外一个变量,这个时候该如何处理 /**** * 传入具体日期 ,返回具体日期增加一个月. * @param date ...

  9. java如何写电梯代码_JAVA编写的一个简易的电梯模型,完成电梯如何满足乘客上下楼需求(ElevatorTest)...

    [实例简介] [实例截图] [核心代码] package ele; import java.util.LinkedList; import java.util.Queue; public class ...

最新文章

  1. ibm服务器报错代码大全_微信认证订阅号开发者模式服务器配置自定义菜单PHP独立完整版...
  2. 美国辛辛那堤儿童医学中心招生物信息博士, 博士后和访问学者——单细胞转录组和表观方向...
  3. Android 应用防止被二次打包指南
  4. 用php实现动态产生xml文件以及从xml文件中抽取数据转化成html的
  5. (4)段描述符P,G位
  6. 如何利用python进行数据分析统计服_利用Python进行数据分析
  7. 谱聚类方法-MATLAB
  8. 错误代码0x800f0950怎么解决_解决win10安装net framework 3.5失败(错误代码 0x800F0950)...
  9. Mac OSX 下如何显示隐藏文件
  10. SQL高级---SQL NULL 值
  11. 企业微信API学习笔记
  12. 数据结构与算法分析(五)队列
  13. 威斯康星大学计算机科学教授,UW机器学习和数据科学活动吸引了国际知名的计算机科学家...
  14. Oracle (01)Oracle数据库的安装步骤.搭建上课所用的数据库环境.table (二维表).查看表结构.数据库中常用的数据类型
  15. Simon 5有哪些新功能? Simon 5 Mac版新功能介绍
  16. “竞速”智能网联汽车,领头雁为何是长沙?
  17. 计算机网络技术主要课程阐述,计算机网络技术专业实训课程体系研究
  18. springboot+quartz报错:Table ‘XXXX.QRTZ_TRIGGERS‘ doesn‘t exist
  19. 微信小程序元素显示隐藏方法总结(原生)
  20. 基于Netty的Android局域网IP电话

热门文章

  1. 多模态机器学习简述(Guide to Multimodal Machine Learning)
  2. 二叉树的深度 | 分治 +回溯 + 迭代
  3. sublimelinter_开发人员使用SublimeLinter指南
  4. C语言源代码系列-管理系统之单项选择题标准化考试系统设计
  5. GStreamer学习笔记
  6. 通过ASM1117实现5V转3.3V电路
  7. Java设计模式6,依赖倒置原则
  8. 空域图像增强-图像灰度变换
  9. Python-pydicom读取dcm文件报错-2021.6.5
  10. 轴功率测试软件,船用轴功率检测仪 在线轴功率测量装置