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

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

层次结构:

 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;
}

常量类

看看效果图:

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

最新文章

  1. H5图片压缩与上传
  2. [摘录]第三部分 IBM文化(2)
  3. Linux常用命令学习2---(文件搜索命令locate find、命令搜索命令whereis which、字符串搜索命令grep、帮助命令man)
  4. chVsprintf
  5. discuz MVC结构分析
  6. Spring MVC 学习总结(六)——Spring+Spring MVC+MyBatis框架集成
  7. 【BZOJ 1031】【JSOI 2007】字符加密Cipher
  8. 微博转发关系采集,可拓展关键字采集,评论采集(Java版)
  9. document对象操作:浏览器页面文件
  10. android中Handle类的用法
  11. CentOS6 Squid代理服务器的安装与配置
  12. html5的自定义data-*属性和jquery的data()方法的使用示例
  13. 深入理解JAVA的多态性[转]
  14. (简单) POJ 3268 Silver Cow Party,Dijkstra。
  15. JBOSS EAP 6 系列三 Oracle、Mysql数据源的配置(驱动)—认识模块的使用
  16. 使用multidex解决64K方法引用的限制
  17. MySQL面试试题与答案
  18. 使用cross-env解决跨平台设置NODE_ENV的问题
  19. json 不能 dumps Decimal 解决办法
  20. PHPUnit单元测试的简单使用

热门文章

  1. requirejs amd module load example
  2. Win10系统的SurfacePro4无法修改启动顺序怎么办
  3. 一步步教你轻松学奇异值分解SVD降维算法
  4. C#模拟客户端发送数据示例
  5. MATLAB 统计元素出现的次数
  6. 【C++】C++中的基本内置类型
  7. Android Studio打包过程和应用安装过程
  8. 《Java 9 揭秘》全目录汇总
  9. IOS开发中一些受用的编码和调试方法积累
  10. [elk]bin/elasticsearch-sql-cli使用