您的位置:首页 > 编程语言 > Java开发

Java编写飞行游戏

2017-07-18 18:23 459 查看
一丶窗口,常量,Image构造器

package tk.javazhangwei.util;

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyFrame  extends Frame {

/**
* 加载窗口
*/
public void launchFrame(){
setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);
setLocation(100, 100);
setVisible(true);

new PaintThread().start();  //启动重画线程

addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});

}

/***
*
* 双缓冲技术
*/
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);
}

/**
* 定义一个重画窗口的线程类,是一个内部类
* @author dell
*
*/
class PaintThread extends Thread {

public void run(){
while(true){
repaint();
try {
Thread.sleep(40); //1s = 1000ms
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

}
}


package tk.javazhangwei.util;

/**
* 游戏项目中用到的常量
* @author dell
*
*/
public class Constant {
public static final int GAME_WIDTH = 500;
public static final int GAME_HEIGHT = 500;

}


package tk.javazhangwei.util;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

public class GameUtil {

private GameUtil(){}  //工具类最好将构造器私有了。

public static Image getImage(String path){
BufferedImage bi=null;
try {
URL u = GameUtil.class.getClassLoader().getResource(path);
bi = javax.imageio.ImageIO.read(u);
} catch (IOException e) {
e.printStackTrace();
}
return bi;
}
}


二丶游戏主窗口

package tk.zhangwei.games;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Date;

import tk.javazhangwei.util.Constant;
import tk.javazhangwei.util.GameUtil;
import tk.javazhangwei.util.MyFrame;
/***
* 飞行游戏主窗口
* @author zw
*
*/
public class PlaneGameFrame extends MyFrame {
Image bg = GameUtil.getImage("images/bg.jpg");
Plane p = new Plane("images/plane.png", 230, 400);
ArrayList bulletList = new ArrayList();//以后加上泛型
Date startTime;
Date endTime;
Explode bao;
int bulletNumber = 18;//子弹数目设定

public void paint(Graphics g){
g.drawImage(bg, 0, 0, null);
p.draw(g);

//遍历子弹
for(int i=0;i<bulletList.size();i++){
Bullet b = (Bullet)bulletList.get(i);
b.draw(g);
//检测跟飞机的碰撞
boolean peng = b.getRect().intersects(p.getRect());
if(peng){

p.setLive(false);//飞机死掉
if(bao==null){
endTime = new Date();
bao = new Explode(p.x,p.y);
}
bao.draw(g);
break;
}
}
if(!p.isLive()){
printGG(g, "GAME OVER!", 50, 110, 200, Color.red);
int gameTime = (int)((endTime.getTime() - startTime.getTime())/1000);//40行结束时间减去游戏开始
printGG(g, "生存时间:"+gameTime+"秒", 20, 150, 250, Color.blue);
switch (gameTime/10) {
case 0:
case 1:
printGG(g, "游戏评分:★ ", 30, 140, 300, Color.blue);
break;
case 2:
printGG(g, "游戏评分:★ ★", 30, 140, 300, Color.blue);
break;
case 3:
case 4:
printGG(g, "游戏评分:★ ★★", 30, 140, 300, Color.blue);
break;
case 5:
printGG(g, "游戏评分:★ ★★★", 30, 140, 300, Color.blue);
break;
default:
printGG(g, "游戏评分:★ ★★★★", 30, 140, 300, Color.blue);
break;
}
}

}
/***
* 封装飞机死后,打印窗口提示信息
* @param g
* @param str
* @param size
*/
public void printGG(Graphics g,String str,int size,int x,int y,Color color){
Color c = g.getColor();
Font f = new Font("宋体", Font.BOLD, size);
g.setFont(f);
g.setColor(color);
g.drawString(str, x, y);
g.setColor(c);
}

public static void main(String[] args){
new PlaneGameFrame().launchFrame();
}

public void launchFrame(){
super.launchFrame();//继续使用父类,如果不使用,只会操作键盘监听
//增加键盘监听
addKeyListener(new KeyMonitor());

//生成一堆子弹
for(int i =0;i<bulletNumber;i++){          //生成子弹数目
Bullet b = new Bullet();
bulletList.add(b);
}
startTime = new Date();
}

//定义一个内部类,方便使用外部类的普通属性

class KeyMonitor extends KeyAdapter{

@Override
public void keyPressed(KeyEvent e) {
System.out.println("按下"+e.getKeyCode());
p.add(e);//调用键盘按下事件
}

@Override
public void keyReleased(KeyEvent e) {

System.out.println("释放"+e.getKeyCode());
p.reduce(e);//如果不调用这个方法,当你弹起这个按键,飞机一直会往那个方向飞,不会停止
}

}
}


三丶飞机

package tk.zhangwei.games;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.lang.invoke.SwitchPoint;

import tk.javazhangwei.util.GameUtil;
/***
* 构造飞机方法
* @author zw
*
*/
public class Plane extends GameObject {
Image img;
int speed = 6;
private boolean live = true;//默认为true
boolean left,up,right,down;

public void draw(Graphics g){
if(live){
g.drawImage(img, (int)x, (int)y, null);
move();
}

}
/*
* 八个方向的算法
*/
public void move(){    //给飞机增加移动属性
if(left){
x -=speed;
}
if(right){
x +=speed;
}
if(up){
y -=speed;
}
if(down){
y +=speed;
}
}

public void add(KeyEvent e){//键盘按下的操作
switch (e.getKeyCode()) {
case 37:
left = true;
break;
case 38:
up = true;
break;
case 39:
right = true;
break;
case 40:
down = true;
break;
default:
break;
}
}
public void reduce(KeyEvent e){//键盘谈起,禁止移动
switch (e.getKeyCode()) {
case 37:
left = false;
break;
case 38:
up = false;
break;
case 39:
right = false;
break;
case 40:
down = false;
break;
default:
break;
}
}

public Plane(String imgpath, double x, double y) {//传入参数,增加图片初始化

this.img = GameUtil.getImage(imgpath);
this.x = x;
this.y = y;
this.width = img.getWidth(null);
this.height = img.getHeight(null);
}

public Plane(){

}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}

}


四丶子弹

package tk.zhangwei.games;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

import tk.javazhangwei.util.Constant;
/**
* 设置子弹
* @author zw
*
*/
public class Bullet extends GameObject{

double degree;

public Bullet(){
degree = Math.random()*Math.PI*2;//设置随机角度,在0到360度之间
x = Constant.GAME_WIDTH/2;
y = Constant.GAME_HEIGHT/2;
width = 10;
height = 10;

}

public void draw(Graphics g){
Color c = g.getColor();
g.setColor(Color.yellow);
g.fillOval((int)x, (int)y, width, height);

x += speed*Math.cos(degree);
y += speed*Math.sin(degree);
if(y>Constant.GAME_HEIGHT-height||y<30){
degree = -degree;
}
if(x<0||x>Constant.GAME_WIDTH-width){
degree = Math.PI-degree;
}
g.setColor(c);

}

}


五丶爆炸效果

package tk.zhangwei.games;

import java.awt.Graphics;
import java.awt.Image;

import tk.javazhangwei.util.GameUtil;

/***
* 爆炸
* @author zw
*
*/
public class Explode {
double x,y;
static Image[] imgs = new Image[16];
static{
for(int i=0;i<=15;i++ ){
imgs[i] = GameUtil.getImage("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;
}

}


六丶GameObject

package tk.zhangwei.games;

import java.awt.Rectangle;

public class GameObject {
double x,y;//子弹初始位置
double degree;
int speed = 3;
int width ;
int height ;

//获取子弹矩形
public Rectangle getRect(){
Rectangle r = new Rectangle((int)x, (int)y, width, height);
return r;
}

public GameObject(double x, double y, double degree, int speed, int width, int height) {
super();
this.x = x;
this.y = y;
this.degree = degree;
this.speed = speed;
this.width = width;
this.height = height;
}
public GameObject(){

}
}


七丶运行游戏

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 游戏