最近闲来无事,花了一天多的时间写了一个小游戏,虽然说游戏本身很无聊吧,但是自己也从这个过程中学到了许多东西。。。分享一下。

代码内容自行理解吧。。。

层次结构:

 package cn.sxt.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; import javax.swing.JFrame; /*
* 飞机游戏的主窗口
* @author Brave_WTZ
*/
public class MyGameFrame extends Frame{ Image bgImg = GameUtil.getImage("images/bg.jpg");
Image planeImg = GameUtil.getImage("images/plane.png"); Plane plane = new Plane(planeImg,250,250);
Shell[] shells = new Shell[20];//声明50个炮弹 Explode bao; Date startTime = new Date();
Date endTime;
int period;//游戏持续的时间 @Override
public void paint(Graphics g) {//自动被调用
Color c = g.getColor(); g.drawImage(bgImg,0,0,null); plane.drawSelf(g);//画飞机 /*画出所有的炮弹*/
for( int i=0; i<shells.length; i++ ) {
shells[i].draw(g);//画炮弹 /*飞机和炮弹的碰撞检测!!!*/
boolean peng = shells[i].getRect().intersects(plane.getRect());
if(peng) {
plane.live = false;
if(bao==null) {
bao = new Explode(plane.x,plane.y); endTime = new Date();
period = (int)((endTime.getTime()-startTime.getTime())/1000);
}
bao.draw(g);
}
if(!plane.live) {
g.setColor(Color.white);
Font f = new Font("宋体",Font.BOLD,50);
g.setFont(f);
g.drawString("时间:"+period+"秒", (int)plane.x, (int)plane.y);
}
} g.setColor(c);
} /*定义内部类,方便实用外部类的属性*/
class PaintThread extends Thread{
@Override
public void run() {
while(true) {//帮助我们反复重画窗口
repaint();//重画 try {
Thread.sleep(40);/*动态视觉效果是由一帧帧照片连续而成*/
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} /*
* 定义键盘监听的内部类
*/
class KeyMonitor extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
plane.addDirection(e);
}
@Override
public void keyReleased(KeyEvent e) {
plane.minusDirection(e);
}
} /*
* 初始化窗口
*/
public void launchFrame() {
this.setTitle("Brave_WZT");
this.setVisible(true);
this.setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);
this.setLocation(300,300);
//正常情况下推出虚拟机操作
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}); new PaintThread().start();//启动线程
addKeyListener(new KeyMonitor());//启动键盘监听 //初始化50个炮弹
for( int i=0; i<shells.length; i++ ) {
shells[i] = new Shell();
}
} /*
* 双缓冲技术,解决Frame中画面闪烁问题
*/
private Image offScreenImage = null; public void update(Graphics g) {
if(offScreenImage == null)
offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//这是游戏窗口的宽度和高度 Graphics gOff = offScreenImage.getGraphics();
paint(gOff);
g.drawImage(offScreenImage, 0, 0, null);
} public static void main(String[] args) {
MyGameFrame f = new MyGameFrame();
f.launchFrame(); }
}

飞机游戏的主窗口

 package cn.sxt.game;

 import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent; /*
* 飞机类
* @author Brave_WTZ
*/ public class Plane extends GameObject{ boolean left,up,right,down; boolean live = true; public Plane(Image img,double x,double y) {
this.img=img;
this.x=x;
this.y=y;
this.speed=6;
this.width=100;
this.height=100;
} public void drawSelf(Graphics g) {
if(live) {
g.drawImage(img,(int)x,(int)y,null);
if(left) {
x-=speed;
}
if(right) {
x+=speed;
}
if(up) {
y-=speed;
}
if(down) {
y+=speed;
}
}else { }
} //按下某个键,启动这个方向
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;
}
}
//松开某个键,取消相应的方向
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;
}
}
}

飞机类

 package cn.sxt.game;

 import java.awt.Color;
import java.awt.Graphics; /*
* 炮弹类
* @author Brave_WTZ
*/ public class Shell extends GameObject{ double degree;
public Shell(){
x=200;
y=200;
width=7;
height=7;
speed=3; degree=Math.random()*Math.PI*2;//定义炮弹类方向
} public void draw(Graphics g) {
Color c = g.getColor();//tip:预先将原Graphics颜色加以保留
g.setColor(Color.pink); g.fillOval((int)x,(int)y, width, height);/*填充pink色炮弹*/ /*炮弹沿任意角度去飞*/
x+=speed*Math.cos(degree);
y+=speed*Math.sin(degree); if(x<0||x>Constant.GAME_WIDTH-width) {
degree = Math.PI-degree;
// System.out.println("嘤嘤嘤");
}
if(y<30||y>Constant.GAME_HEIGHT-height) {
degree = -degree;
// System.out.println("嘤嘤嘤");
} g.setColor(c);
}
}

炮弹类

 package cn.sxt.game;

 import java.awt.Graphics;
import java.awt.Image; /*
* 爆炸类
* @author Brave_WTZ
*/
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;
}
}

爆炸类

 package cn.sxt.game;

 import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle; /*
* 游戏物体的父类
* @author Brave_WTZ
*/
public class GameObject {
Image img;
double x,y;
int speed;
int width,height; public void drawSelf(Graphics g) {
g.drawImage(img,(int)x,(int)y,null);
} public GameObject(Image img, double x, double y, int speed, int width, int height) {
super();
this.img = img;
this.x = x;
this.y = y;
this.speed = speed;
this.width = width;
this.height = height;
} public GameObject(double x, double y) {
super();
this.x = x;
this.y = y;
} public GameObject() { }
/*
* 返回物体所在矩形,便于碰撞检测
*/
public Rectangle getRect() {
return new Rectangle((int)x,(int)y,width,height);
} }

游戏物体的父类

 package cn.sxt.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() { }
/*
* 返回指定路径文件的图片对象
*
*/
public static Image getImage(String path) {
BufferedImage bi = null;
try {
URL u = GameUtil.class.getClassLoader().getResource(path);
bi = ImageIO.read(u);
} catch (IOException e) {
e.printStackTrace();
}
return bi;
}
}

工具类

 package cn.sxt.game;

 public class Constant {

     public static final int GAME_WIDTH = 1024;
public static final int GAME_HEIGHT = 700;
}

常量类

看看效果图:

下面是游戏代码用到的游戏素材:

飞机躲避炮弹---java的更多相关文章

  1. 关于java飞机躲炮弹的一些对象说明(带源码)

    1.飞机躲炮弹的各种实体类都需要一个画笔将他们画出来 (GameObject) import java.awt.*; public void drawSelf(Graphics g){ g.drawI ...

  2. 27.Java 飞机游戏小项目

    开篇 游戏项目基本功能开发 飞机类设计 炮弹类设计 碰撞检测设计 爆炸效果的实现 其他功能 计时功能 游戏项目基本功能开发 这里将会一步步实现游戏项目的基本功能. 使用 AWT 技术画出游戏主窗口 A ...

  3. Java小游戏

    这是一个飞机躲避子弹的小游戏,其中有许多干货 这是蒟蒻我第二次做,请各位大佬多多指教 目录 1.游戏主窗口的创建 2.图形绘制_文本绘制_颜色改变_图像对象的加载 3.线程内部类实现动画 4.游戏物体 ...

  4. java图形界面写个小桌面,内置简单小软件

    一.做个这样的效果,双击图标打开相应的应用 二.主界面类,使用JavaSwing的JDesktopPane类创建这个桌面 package com.swing; import java.awt.Bord ...

  5. Java 游戏报错 看不懂求教

    Java 飞机小游戏 报错 看不懂求救 at java.awt.Component.dispatchEvent(Unknown Source)at java.awt.EventQueue.dispat ...

  6. JAVA上百实例源码以及开源项目

    简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...

  7. 初窥Java之一

    一.常用的dos命令 打开命令提示符窗口的方式: ① win + R --> 输入cmd --> 回车 ② 开始 --> 搜索程序和文件的框中输入  cmd  --> 回车 ③ ...

  8. JAVA上百实例源码网站

    JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...

  9. XPlane android 2D手游开发实战

    android 飞行射击游戏类 采用 xamarin 跨平台开发技术  纯C#语言编写 操作简单 1.手指拖动飞机 躲避敌机 2.通过吃敌机爆炸后遗落的物品增加各种属性 3.双击战机放大技能 4.目前 ...

随机推荐

  1. IIS安装、配置 发布网站 报错解决方案

    错误一:   HTTP 错误 500.19- Internal Server Error法请求该页面配置,因为页面的相关配置数据无效####   HTTP 错误 500.21 - Internal S ...

  2. php 通过 create user 和grant 命令无法创建数据库用户和授权的解决办法

    php 通过 create user 和grant 命令无法创建数据库用户和授权的解决办法 解决办法, 通过 insert 命令的方式进行创建. 创建数据库用户: $sql= "insert ...

  3. mysql sql执行慢 分析过程

    摘自: https://blog.csdn.net/zhuzaijava/article/details/77935200 为了验证select 1 与 select 1 from tableName ...

  4. Android ListView滚动到指定的位置

    这篇文章主要给大家介绍了Android中的ListView如何滚动到指定的位置,文章给出了两种解决的方法,并给出详细的示例代码,相信会对大家的理解和学习很有帮助,有需要的朋友们下面来一起看看吧. 本文 ...

  5. URL参数编码

    简单明了区分escape.encodeURI和encodeURIComponent 一.前言讲这3个方法区别的文章太多了,但是大部分写的都很绕.本文试图从实践角度去讲这3个方法. 二.escape和它 ...

  6. spring mvc 实战化项目之三板斧

    laravel实战化项目之三板斧 spring mvc 实战化项目之三板斧 asp.net mvc 实战化项目之三板斧 接上文希望从一张表(tb_role_info 用户角色表)的CRUD展开spri ...

  7. Java中Lambda表达式的使用(转)

    https://www.cnblogs.com/franson-2016/p/5593080.html 简介(译者注:虽然看着很先进,其实Lambda表达式的本质只是一个"语法糖" ...

  8. Unitek的USB3.0 TF卡读卡器

    淘宝买了个Unitek的usb3.0读卡器, 用来换掉之前用了很久sks的sub2读卡器, 收到之后在Ubuntu下先测了一下, 发现识别出来的是usb2.1 lsusb -D /dev/bus/us ...

  9. Android获取通讯录并上传(包含通讯录加密)

    好久没更新文章了,近期在做通讯录上传,把它分享出来,送给需要的朋友. 写了一个通讯录工具类,直接放代码吧,关键位置通过注释来解释. 这个工具类包含通讯录获取,加密,然后上传操作.看不懂的可以留言 im ...

  10. 【C++】C++中的基本内置类型

    基本数据类型 下面这张表是C++支持的基本数据类型 类型 含义 最小尺寸 bool 布尔 未定义 char 字符 8位 wchar_t 宽字符 16位 char16_t Unicode字符 16位 c ...