读书人

在做马士兵的坦克大战做到第十一个版

发布时间: 2012-09-15 19:09:28 作者: rapoo

在做马士兵的坦克大战,做到第十一个版本了。坦克不发炮弹,空指针异常,望指导
在做马士兵的坦克大战,做到第十一个版本了。坦克不发炮弹,空指针异常,望指导

我看了一个钟头也没看出哪里空指针异常。各位帮我瞅瞅。

[code=Java][/code]

TankClient类:
import java.awt.Color;
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;

class TankClient extends Frame
{
public static final int GAME_WIDTH=800;
public static final int GAME_HIGHT=600;

Tank tank=new Tank(50, 50,this);
Misssile misssile=null;
Image offscreenImage =null;



public void paint(Graphics g) {
tank.draw(g);
if(misssile!=null)
misssile.draw(g);

}

public void update(Graphics g) {
if(offscreenImage==null)
{
offscreenImage=this.createImage(GAME_WIDTH,GAME_HIGHT);
}
Graphics gofferScreen=offscreenImage.getGraphics();
Color c=gofferScreen.getColor();
gofferScreen.setColor(Color.GREEN);
gofferScreen.fillRect(0, 0, GAME_WIDTH, GAME_HIGHT);
paint(gofferScreen);
g.drawImage(offscreenImage, 0, 0, null);
}
TankClient ()
{
setBounds(10,10,GAME_WIDTH,GAME_HIGHT);
setVisible(true);
setTitle( "TankWar ");
setResizable(false);
setBackground(Color.GREEN);
this.addKeyListener(new KeyMonitor());
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
new Thread(new paintThread()).start();
}

public static void main(String[] args)
{
TankClient frame=new TankClient();

}
private class paintThread implements Runnable
{
public void run() {
while(true)
{
repaint();
System.out.println( "现车不停重画 ");
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}


}

}

private class KeyMonitor extends KeyAdapter
{

public void keyReleased(KeyEvent e) {
tank.keyReleased(e);
}

public void keyPressed(KeyEvent e) {
tank.keyPressed(e);
}

}

}


Tank类:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;


public class Tank {
public static final int XSPEED=5;
public static final int YSPEED=5;

TankClient client=null;
private int x,y;

private boolean bL=false,bU=false,bR =false,bD=false;
enum Direction {L,LU,U,RU,R,RD,D,LD,STOP};

private Direction dir=Direction.STOP;

public Tank(int x, int y)
{
this.x = x;
this.y = y;
}
public Tank(int x, int y,TankClient tc)
{
this.x = x;
this.y = y;
this.client=client;
}
public void draw(Graphics g)
{
Color c=g.getColor();
g.setColor(Color.RED);
g.fillOval(x, y, 30, 30);


g.setColor(c);
move();
}

public void move ()
{
switch(dir)
{
case L:
x -= XSPEED;
break;
case LU:
x -= XSPEED;
y -= YSPEED;
break;
case U:
y -= YSPEED;
break;
case RU:
x += XSPEED;
y -= YSPEED;
break;
case R:
x += XSPEED;
break;
case RD:
x += XSPEED;
y += YSPEED;
break;
case D:
y += YSPEED;
break;
case LD:
x -= XSPEED;
y += YSPEED;
break;
case STOP:
break;

}
}

public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
switch(key) {
case KeyEvent.VK_SPACE:
client.misssile = fire();
break;
case KeyEvent.VK_LEFT :
bL = true;
break;
case KeyEvent.VK_UP :
bU = true;
break;
case KeyEvent.VK_RIGHT :
bR = true;
break;
case KeyEvent.VK_DOWN :
bD = true;
break;
}
locateDirection();
}
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
int key = e.getKeyCode();
switch(key) {
case KeyEvent.VK_LEFT :
bL = false;
break;
case KeyEvent.VK_UP :
bU = false;
break;
case KeyEvent.VK_RIGHT :
bR = false;
break;
case KeyEvent.VK_DOWN :
bD = false;
break;
}

locateDirection();

}

void locateDirection() {
if(bL && !bU && !bR && !bD) dir = Direction.L;
else if(bL && bU && !bR && !bD) dir = Direction.LU;
else if(!bL && bU && !bR && !bD) dir = Direction.U;
else if(!bL && bU && bR && !bD) dir = Direction.RU;
else if(!bL && !bU && bR && !bD) dir = Direction.R;
else if(!bL && !bU && bR && bD) dir = Direction.RD;
else if(!bL && !bU && !bR && bD) dir = Direction.D;
else if(bL && !bU && !bR && bD) dir = Direction.LD;
else if(!bL && !bU && !bR && !bD) dir = Direction.STOP;
}
public Misssile fire() {

Misssile m = new Misssile(x, y, dir);
return m;
}

}

Misssile类:

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


public class Misssile {

public static final int XSPEED=10;
public static final int YSPEED=10;
private int x,y;
Tank.Direction dir;
public Misssile(int x, int y,Tank.Direction dir) {
super();
this.x = x;
this.y = y;
this.dir = dir;
}
public void draw (Graphics g)
{
Color c =g.getColor();
g.setColor(Color.BLACK);
g.fillOval(x, y, 10, 10);
g.setColor(c);


move();

}
public void move ()
{
switch(dir)
{
case L:
x -= XSPEED;
break;
case LU:
x -= XSPEED;
y -= YSPEED;
break;
case U:
y -= YSPEED;
break;
case RU:
x += XSPEED;
y -= YSPEED;
break;
case R:
x += XSPEED;
break;
case RD:
x += XSPEED;
y += YSPEED;
break;
case D:
y += YSPEED;
break;
case LD:
x -= XSPEED;
y += YSPEED;
break;

}
}
}


谢谢




[解决办法]
楼上真相了
[解决办法]
8楼真相

读书人网 >J2SE开发

热点推荐