package com.bjsxt.plane;
/*
* 存放相关的常量
*/
public class Constant {
//游戏窗口的宽度
public static final int GAME_WIDTH = 500;
//游戏窗口的高度
public static final int GAME_HEIGHT = 500;
}
package com.bjsxt.plane;
import java.awt.Graphics;
import java.awt.Image;
/**
* 爆炸类
* @author 15154
*
*/
public class Explode {
double x,y;
int count;
static Image[] imgs = new Image[16];
static {
for(int i=0;i<16;i++) {
imgs[i] = GameUtil.getImage("");
imgs[i].getWidth(null); //解决懒加载问题
}
}
public void drawMySelf(Graphics g) {
if(count < 16) {
g.drawImage(imgs[count], (int)x, (int)y, null);
count++;
}
}
public Explode() {
// TODO Auto-generated constructor stub
}
public Explode(double x, double y) {
super();
this.x = x;
this.y = y;
}
}
package com.bjsxt.plane;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
/*
* 游戏物体的跟类
*/
public class GameObject {
Image plane;
double x,y;
int speed;
int width,height;
public GameObject(Image plane, double x, double y, int speed, int width, int height) {
super();
this.plane = plane;
this.x = x;
this.y = y;
this.speed = speed;
this.width = width;
this.height = height;
}
public GameObject(Image plane, double x, double y, int speed) {
super();
this.plane = plane;
this.x = x;
this.y = y;
this.speed = speed;
this.width = plane.getWidth(null);
this.height = plane.getHeight(null);
}
public void drawMyself(Graphics g) {
g.drawImage(plane,(int)x,(int)y,width,height,null);
}
public GameObject() {
super();
// TODO Auto-generated constructor stub
}
public Rectangle getRec() {
return new Rectangle((int)x,(int)y,width,height);
}
}
package com.bjsxt.plane;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
/**
* 游戏工具类
* @author 15154
*
*/
public class GameUtil {
public static Image getImage(String path) {
BufferedImage img = null;
URL u = GameUtil.class.getClassLoader().getResource(path);
try {
img = ImageIO.read(u);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return img;
}
public static void main(String[] args) {
Image img = GameUtil.getImage("images/plane.png");
Image backgroud = GameUtil.getImage("images/backgroud.png");
System.out.println(img);
System.out.println(backgroud);
}
}
package com.bjsxt.plane;
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;
/**
* 游戏主窗口0.2
* @author JioH
*
*/
public class MyGameFrame extends Frame{
Image planeImage = GameUtil.getImage("images/plane.png");
Image backgroud = GameUtil.getImage("images/backgroud.png");
static int count = 0;
// GameObject plane1 = new GameObject(planeImage, 100, 100, 2, 22, 33);
// GameObject plane2 = new GameObject(planeImage, 200, 100, 2, 22, 33);
Plane p1 = new Plane(planeImage, 100, 100, 2);
Plane p2 = new Plane(planeImage, 200, 100, 3);
shell[] shells = new shell[50];
Explode explode;
Date start = new Date();
Date end;
long period = 0;
@Override
public void paint(Graphics g) {
System.out.println("绘制窗口的次数:"+count);
count++;
//画背景
g.drawImage(backgroud,0,0,500,500,null);
// plane1.drawMyself(g);
// plane2.drawMyself(g);
//画飞机
p1.drawMyself(g);
p2.drawMyself(g);
//画炮弹
for(int i=0;i<shells.length;i++) {
shells[i].drawMyself(g);
//实现碰撞检测
boolean peng = shells[i].getRec().intersects(p1.getRec());
if(peng) {
p1.live = false;
if(explode==null) {
explode = new Explode(p1.x,p1.y);
}
explode.drawMySelf(g);
}
}
}
//画时间
public void drawTime(Graphics g) {
Color c = g.getColor();
Font f = g.getFont();
g.setColor(Color.green);
if(p1.live) {
period = (System.currentTimeMillis() - start.getTime())/1000;
g.drawString("坚持:"+period,30,30);
}else {
if(end == null) {
end = new Date();
period = (end.getTime()-start.getTime())/1000;
}
g.setFont(new Font("微软雅黑", Font.BOLD, 30)); //微软雅黑粗体30
g.drawString("最终时间:"+period, 200, 200);
}
g.setColor(c);
g.setFont(f);
}
//初始化窗口
public void launchFrame() {
this.setTitle("飞机大战");
setVisible(true);//窗口是否可见
setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);//窗口大小
setLocation(400,300);//窗口位置
//增加关闭窗口的动作
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
new PaintThread().start(); //启动线程重画
this.addKeyListener(new keyMonitor()); //启动键盘监听
//初始化创建50个炮弹
for(int i = 0;i < 50;i++) {
shells[i] = new shell();
}
}
//线程
class PaintThread extends Thread{
@Override
public void run() {
while(true) {
repaint();
try {
Thread.sleep(50); //1s画20次,1s=1000ms
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//内部类,实现键盘的监听处理
class keyMonitor extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub
super.keyPressed(e);
p1.addDirection(e);
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
super.keyReleased(e);
p1.minusDirection(e);
}
}
//添加双缓存技术
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 gameFrame = new MyGameFrame();
gameFrame.launchFrame();
}
}
package com.bjsxt.plane;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
public class Plane extends GameObject{
boolean left,right,up,down;
boolean live = true;
@Override
public void drawMyself(Graphics g) {
// TODO Auto-generated method stub
super.drawMyself(g);
//飞机飞行的算法可以自行设定
// x += speed;
if(live) {
if(left) {
x -= speed;
}
if(right) {
x += speed;
}
if(up) {
y += speed;
}
if(down) {
y -= speed;
}
}
}
public void addDirection(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_LEFT) {
left = true;
}
if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
right = true;
}
if(e.getKeyCode()==KeyEvent.VK_UP) {
up = true;
}
if(e.getKeyCode()==KeyEvent.VK_DOWN) {
down = true;
}
}
public void minusDirection(KeyEvent e) {
// if(e.getKeyCode()==KeyEvent.VK_LEFT) {
// left = false;
// }
// if(e.getKeyCode()==KeyEvent.VK_RIGHT) {
// right = false;
// }
// if(e.getKeyCode()==KeyEvent.VK_UP) {
// up = false;
// }
// if(e.getKeyCode()==KeyEvent.VK_DOWN) {
// down = false;
// }
switch(e.getKeyCode()) {
case KeyEvent.VK_LEFT:
left = false;
break;
case KeyEvent.VK_RIGHT:
right = false;
break;
case KeyEvent.VK_UP:
up = false;
break;
case KeyEvent.VK_DOWN:
down = false;
break;
}
}
public Plane(Image plane, double x, double y, int speed) {
super (plane,x,y,speed);
}
}
package com.bjsxt.plane;
import java.awt.Color;
import java.awt.Graphics;
public class shell extends GameObject{
double degree; //角度
public shell() {
x = 200;
y = 200;
degree = Math.random()*Math.PI*2;
width = 10;
height = 10;
speed = 7;
}
@Override
public void drawMyself(Graphics g) {
// TODO Auto-generated method stub
Color c = g.getColor();
g.setColor(Color.yellow);
g.fillOval((int)x, (int)y, width, height);
g.setColor(c);
//根据自己的算法指定移动的路径
x += speed*Math.cos(degree);
y += speed*Math.sin(degree);
}
}
总览