飞机躲避炮弹---java
最近闲来无事,花了一天多的时间写了一个小游戏,虽然说游戏本身很无聊吧,但是自己也从这个过程中学到了许多东西。。。分享一下。
代码内容自行理解吧。。。
层次结构:
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的更多相关文章
- 关于java飞机躲炮弹的一些对象说明(带源码)
1.飞机躲炮弹的各种实体类都需要一个画笔将他们画出来 (GameObject) import java.awt.*; public void drawSelf(Graphics g){ g.drawI ...
- 27.Java 飞机游戏小项目
开篇 游戏项目基本功能开发 飞机类设计 炮弹类设计 碰撞检测设计 爆炸效果的实现 其他功能 计时功能 游戏项目基本功能开发 这里将会一步步实现游戏项目的基本功能. 使用 AWT 技术画出游戏主窗口 A ...
- Java小游戏
这是一个飞机躲避子弹的小游戏,其中有许多干货 这是蒟蒻我第二次做,请各位大佬多多指教 目录 1.游戏主窗口的创建 2.图形绘制_文本绘制_颜色改变_图像对象的加载 3.线程内部类实现动画 4.游戏物体 ...
- java图形界面写个小桌面,内置简单小软件
一.做个这样的效果,双击图标打开相应的应用 二.主界面类,使用JavaSwing的JDesktopPane类创建这个桌面 package com.swing; import java.awt.Bord ...
- Java 游戏报错 看不懂求教
Java 飞机小游戏 报错 看不懂求救 at java.awt.Component.dispatchEvent(Unknown Source)at java.awt.EventQueue.dispat ...
- JAVA上百实例源码以及开源项目
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...
- 初窥Java之一
一.常用的dos命令 打开命令提示符窗口的方式: ① win + R --> 输入cmd --> 回车 ② 开始 --> 搜索程序和文件的框中输入 cmd --> 回车 ③ ...
- JAVA上百实例源码网站
JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...
- XPlane android 2D手游开发实战
android 飞行射击游戏类 采用 xamarin 跨平台开发技术 纯C#语言编写 操作简单 1.手指拖动飞机 躲避敌机 2.通过吃敌机爆炸后遗落的物品增加各种属性 3.双击战机放大技能 4.目前 ...
随机推荐
- Mysql中DDL, DML, DCL, 和TCL是什么?
在一些公司中提交给测试团队的SQL脚本会划分为DDL.DML等,但这些概念到底是如何定义的呢? SQL(Structure Query Language)是数据库操作的的核心语言,接下来我们通过一张图 ...
- 推荐一个好工具:P/Invoke Interop Assistant【转】
原文地址 :http://write.blog.csdn.net/postedit 在从托管代码里面调用非托管代码的时候,经常会翻阅MSDN找到需要调用的这个程序集里面的关于需要调用方法的签名,还要特 ...
- python写入excel(xlswriter)--生成图表
一.折线图: # -*- coding:utf-8 -*- import xlsxwriter # 创建一个excel workbook = xlsxwriter.Workbook("cha ...
- SpringBoot2.0微信小程序支付多次回调问题
SpringBoot2.0微信小程序支付多次回调问题 WxJava - 微信开发 Java SDK(开发工具包); 支持包括微信支付.开放平台.公众号.企业微信/企业号.小程序等微信功能的后端开发. ...
- Linux 端口转发一则
目前已知的,公司的网络只有 80.8008(后来又给关了 - -).443 端口的 TCP 可以出去,其它已知的所有端口都被封锁.所以,我的***工具就歇菜了. 最后尝试,通过配置端口转发,将ss主机 ...
- LeetCode: Gray Code [089]
[题目] The gray code is a binary numeral system where two successive values differ in only one bit. Gi ...
- (原)tensorflow使用eager在mnist上训练的简单例子
转载请注明出处: https://www.cnblogs.com/darkknightzh/p/9989586.html 代码网址: https://github.com/darkknightzh/t ...
- 您还差宝贝一张语文教学光盘!教你如何制作ISO文件
1 大家没有发现 宝宝初上小学无法专心地做作业.读书? 我家的宝贝就是这样 做作业时 总是东搞搞,西弄弄 完全无法专心 再不就是不耐心 读一遍课本就觉得累 读三两遍就说学习是个苦差事儿 2 一直以来 ...
- Quartz与Spring Boot集成使用
上次自己搭建Quartz已经是几年前的事了,这次项目中需要定时任务,需要支持集群部署,想到比较轻量级的定时任务框架就是Quartz,于是来一波. 版本说明 通过搜索引擎很容易找到其官网,来到Docum ...
- 10个基本的HTML5动画工具设计
HTML5已经成为最流行的编程语言在web开发者.强大的编程语言有很大的能力,生产更好的万维网内容.HTML5的兴起已经在过去三年增长迅速.介绍了HTML5的新技术是更好的.HTML5技术是由像Chr ...