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

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

层次结构:

 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. Mac下不用重复输入ssh-key的密码

    重装系统,复用以前的SSH key,发现每次调用这个Key都要输入Key的密码,很繁琐,以前不是这样的哦. 更新代码.SSH服务器总是提示: Enter passphrase for .../id_r ...

  2. SpringBoot无废话入门01:最简SpringBoot应用

    虽然本篇讲的是一个最简的SpringBoot应用,但是要说明的是:学习SpringBoot是有门槛的,这个门槛就是, 1:首先得有框架的基础,比如SSM: 2:MAVEN基础. 在学好上面两者的基础上 ...

  3. 异常 Exception 知识点总结 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  4. hadoop-网站收藏

    Ubuntu14.04安装配置Hadoop2.6.0(完全分布式)与 wordcount实例运行 http://www.linuxidc.com/Linux/2015-01/112029p2.htm ...

  5. [Python设计模式] 第20章 挨个买票——迭代器模式

    github地址:https://github.com/cheesezh/python_design_patterns 迭代器模式 迭代器模式,提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该 ...

  6. Python 3安装MySQLdb

    Python 2安装的是mysql-python,Python 3安装mysql-python以后,仍然不能import MySQLdb,原来Python 3应该安装mysqlclient,就可以im ...

  7. python pip 安装包报 编码问题

    好久不玩 TF 了, 今天尝试了一个案例,发现要安装module , 就搞了一下, 发现要先安装 base , 安装过程有遇到好多问题, 就写写, 将其中解决过程记录下来. 1. 保存,编码问题 Un ...

  8. 【C#】C#线程_基元线程的同步构造

    目录结构: contents structure [+] 简介 为什么需要使用线程同步 线程同步的缺点 基元线程同步 什么是基元线程 基元用户模式构造和内核模式构造的比较 用户模式构造 易变构造(Vo ...

  9. Delphi XE以后的版本 程序如何瘦身

    第一步:关闭debug infomation. 打开工程后,依次点击project--option--delphi compiler--linking 将右边Debug information改为Fa ...

  10. 音视频编解码: YUV存储格式中的YUV420P,YUV420SP,NV12, NV21理解(转)

    概述  之前介绍了YUV码流的采样格式,下面分析下YUV码流的存储格式,YUV码流的存储格式与采样格式息息相关.总的来讲,YUV存储格式主要分为两种: planar 平面格式 指先连续存储所有像素点的 ...