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

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

层次结构:

 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. Chart:Grafana

    ylbtech-Chart:Grafana 1.返回顶部 1-1. 2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 0. https://grafana.com/ 1. http: ...

  2. 众里寻他千百度?No!这项技术只需走两步就能“看穿”你!

    电影<碟中谍5>中阿汤哥带上了面具,顺利通过指纹锁,三重物理等重重关卡,却最终仍旧功亏一篑,正是由于“ 火眼金睛 ”——步态识别 .   (图片来源:碟中谍) 中国科学院自动化所的专家日前 ...

  3. jQuery on()方法使用

    jQuery on()方法 基本语法: 语法结构一: $(selector).on(event,function) 语法结构二: $(selector).on(events,[selector],[d ...

  4. android编码学习

    虽然以下博客有点老,但很清晰,有不明白的基础知识,可以来这里找找. 2015年最新Android基础入门教程目录(完结版) 1. 环境配置 Android stodio gradle配置踩过的坑 An ...

  5. Docker入门 - 005 Docker 容器连接

    Docker 容器连接 前面我们实现了通过网络端口来访问运行在docker容器内的服务.下面我们来实现通过端口连接到一个docker容器 网络端口映射 我们创建了一个 python 应用的容器. do ...

  6. pandas DataFrame apply()函数(2)

    上一篇pandas DataFrame apply()函数(1)说了如何通过apply函数对DataFrame进行转换,得到一个新的DataFrame. 这篇介绍DataFrame apply()函数 ...

  7. jquery.cookie.js写入的值没有定义

    这个是插件的基本语法,你写的没错,错就错在你肯定是在本地测试的,cookie是基于域名来储存的.意思您要放到测试服务器上或者本地localhost服务器上才会生效.cookie具有不同域名下储存不可共 ...

  8. HTML中 javascript 相对根路径问题

    在HTML文档中,有很多引用的JS或者CSS文件,一般都是用相对路径来引用的,例如: ./../.. ,但是,有没有类似ASP.NET中的路径: ~/Scripts/myScript.js 但是有的: ...

  9. Variable number of arguments (Varargs)

    A parameter of a function (normally the last one) may be marked with vararg modifier: fun <T> ...

  10. csv.writer写入文件有多余的空行

    在用csv.writer写入文件的时候发现中间有多余的空行. 最早打开方式只是‘w’,会出现多余的空行,网上建议使用binary形式‘wb’打开可以解决问题: with open('egg2.csv' ...