文章目录
- 飞机大战
-
- 面向对象思想重构飞机类
- 键盘控制游戏物体运动
- 面向对象思想重构飞机类的键盘移动
- 炮弹类的设计
- 容器或数组产生多发炮弹
- 飞机和炮弹碰撞实现
- 爆炸类图片的实现
- 程序计时功能
飞机大战
面向对象思想重构飞机类
package feiji;
import java.awt.*;
public class plane extends GameObject {
@Override
public void drawMyself(Graphics g){
super.drawMyself(g);
x+=speed;
}
public plane(Image img,double x,double y,int speed,int width,int height) {
super(img,x,y,speed,width,height);
}
}
package feiji;
import java.awt.*;
public class GameObject {
Image img;
double x,y;
int speed;
int width,height;
public GameObject(Image img,double x,double y,int speed,int width,int height) {
this.img = img;
this.x=x;
this.y=y;
this.speed=speed;
this.width=width;
this.height=height;
}
public GameObject(Image img,double x,double y,int speed) {
this.img = img;
this.x=x;
this.y=y;
this.speed=speed;
this.width=img.getWidth(null);
this.height=img.getHeight(null);
}
public GameObject(){
}
public void drawMyself(Graphics g){
g.drawImage(img,(int)x,(int)y,width,height,null);
}
public Rectangle getRec(){
return new Rectangle((int)x,(int)y,width,height);
}
}
键盘控制游戏物体运动
package feiji;
import java.awt.*;
import java.lang.*;
import java.awt.event.*;
public class MyGame extends Frame {
Image planeImg=Gameu.getImage("images/feiji.png");
Image bg=Gameu.getImage("images/bj.png");
plane p1=new plane(planeImg,100,100,3,50,50);
boolean left,right,up,down;
@Override
public void paint(Graphics g) {
g.drawImage(bg,0,0,500,500,null);
p1.drawMyself(g);
if(left){
p1.x-=p1.speed;
}
if(right){
p1.x+=p1.speed;
}
if(up){
p1.y-=p1.speed;
}
if(down){
p1.y+=p1.speed;
}
}
public void launchFrame() {
this.setTitle("飞机大战");
setVisible(true);
setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGH);
setLocation(100,100);
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
new PaintThread().start();
this.addKeyListener(new KeyMonitor());
}
class PaintThread extends Thread{
@Override
public void run(){
while (true){
repaint();
try{
Thread.sleep(50);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
class KeyMonitor extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e){
System.out.println("按下:"+e.getKeyCode());
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;
}
}
@Override
public void keyReleased(KeyEvent e){
System.out.println("抬起:"+e.getKeyCode());
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;
}
}
}
public static void main(String[] args) {
MyGame game=new MyGame();
game.launchFrame();
}
private Image offScreanImage=null;
public void update(Graphics g){
if(offScreanImage==null)
offScreanImage=this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGH);
Graphics goff=offScreanImage.getGraphics();
paint(goff);
g.drawImage(offScreanImage,0,0,null);
}
}
面向对象思想重构飞机类的键盘移动
package feiji;
import java.awt.*;
import java.awt.event.KeyEvent;
public class plane extends GameObject {
boolean left,right,up,down;
@Override
public void drawMyself(Graphics g){
super.drawMyself(g);
if(left){
x-=speed;
}
if(right){
x+=speed;
}
if(up){
y-=speed;
}
if(down){
y+=speed;
}
}
public void addDiretion(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;
}
}
public plane(Image img,double x,double y,int speed,int width,int height) {
super(img,x,y,speed,width,height);
}
}
炮弹类的设计
package feiji;
import java.awt.*;
public class shell extends GameObject{
double dagree;
public shell(){
x=200;
y=200;
dagree=Math.random()*Math.PI*2;
width=10;
height=10;
speed=7;
}
@Override
public void drawMyself(Graphics g){
Color c=g.getColor();
g.setColor(Color.red);
g.fillOval((int)x,(int)y,width,height);
g.setColor(c);
x+=speed*Math.cos(dagree);
y+=speed*Math.sin(dagree);
if(y>Constant.GAME_HEIGH-this.height||y<40){
dagree=-dagree;
}
if(x<0||x>Constant.GAME_WIDTH-this.width){
dagree=Math.PI-dagree;
}
}
}
容器或数组产生多发炮弹
shell[] s1=new shell[50];
for(int i=0;i<50;i++){
s1[i].drawMyself(g);
for(int i=0;i<50;i++){
s1[i]=new shell();
}
飞机和炮弹碰撞实现
for(int i=0;i<s1.length;i++){
s1[i].drawMyself(g);
boolean peng = s1[i].getRec().intersects(p1.getRec());
if(peng){
p1.live=false;
}
}
boolean live=true;
@Override
public void drawMyself(Graphics g){
if(live){
super.drawMyself(g);
if(left){
x-=speed;
}
if(right){
x+=speed;
}
if(up){
y-=speed;
}
if(down){
y+=speed;
}
}
}
爆炸类图片的实现
package feiji;
import java.awt.*;
public class Explode {
double x,y;
static Image[] imgs=new Image[3];
int count;
static {
for (int i=0;i<3;i++){
imgs[i]=Gameu.getImage("images/explode/"+(i+1)+".png");
}
}
public void drawMyself(Graphics g){
if(count<3){
g.drawImage(imgs[count],(int)x,(int)y,null);
count++;
}
}
public Explode(){
}
public Explode(double x,double y){
this.x=x;
this.y=y;
}
}
程序计时功能
package feiji;
import java.awt.*;
import java.lang.*;
import java.awt.event.*;
import java.util.Date;
public class MyGame extends Frame {
Image planeImg=Gameu.getImage("images/feiji.png");
Image bg=Gameu.getImage("images/bj.png");
plane p1=new plane(planeImg,100,100,7,70,70);
shell[] s1=new shell[3];
Explode explode;
Date start=new Date();
Date end;
long period=0;
@Override
public void paint(Graphics g) {
g.drawImage(bg,0,0,500,500,null);
g.setColor(Color.black);
if(p1.live){
period=(System.currentTimeMillis()-start.getTime())/1000;
g.drawString("坚持:"+period,10,70);
}else{
if(end==null){
end=new Date();
period=(end.getTime()-start.getTime())/1000;
}
g.setFont(new Font("微软雅黑",Font.BOLD,30));
g.drawString("最终时间:"+period,150,250);
}
p1.drawMyself(g);
for (int i = 0; i < s1.length; i++) {
s1[i].drawMyself(g);
boolean peng = s1[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 launchFrame() {
this.setTitle("飞机大战");
setVisible(true);
setSize(Constant.GAME_WIDTH,Constant.GAME_HEIGH);
setLocation(100,100);
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
new PaintThread().start();
this.addKeyListener(new KeyMonitor());
for(int i=0;i<s1.length;i++){
s1[i]=new shell();
}
}
class PaintThread extends Thread{
@Override
public void run(){
while (true){
repaint();
try{
Thread.sleep(50);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
}
class KeyMonitor extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e){
System.out.println("按下:"+e.getKeyCode());
p1.addDiretion(e);
}
@Override
public void keyReleased(KeyEvent e){
System.out.println("抬起:"+e.getKeyCode());
p1.minusDirection(e);
}
}
public static void main(String[] args) {
MyGame game=new MyGame();
game.launchFrame();
}
private Image offScreanImage=null;
public void update(Graphics g){
if(offScreanImage==null)
offScreanImage=this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGH);
Graphics goff=offScreanImage.getGraphics();
paint(goff);
g.drawImage(offScreanImage,0,0,null);
}
}