本科阶段尽管学过JAVA课程,却始终感觉在云里雾里。这段时间认真学习了马士兵老师JAVA基础教程,跟着写了TankWar的小项目,感觉对JAVA中类的使用有了许多新的认识,思路比原来也清晰多了,在此总结一下TankWar小项目。
TankWar项目一共有6个类:
TankClient类:相当于整个游戏的大管家,每个类都有一个TankClient的引用,其负责游戏窗口的重绘。难点:双缓冲消除闪烁;线程重绘保证移动均匀,paint()方法应该调用其他类自身的draw()方法,也就是所谓的画自己;同理,按键的相应也有其他类自身实现。
Tank类:可以根据属性产生自身或者是敌人,根据面向对象的思想,Tank发Missile,即fire()方法应该包含在Tank类中。难点:实现8个方向的移动;碰撞检测(Rectangle的使用);智能Tank的实现(使用Random),无规则运动,可自己发炮弹;设置记录先前位置的oldX、oldY变量,碰撞后可以回到先前位置(stay方法)。
Missile类:可以根据属性产生自身Missile或者是敌人Missile,根据面向对象的思想,Missile打Tank,即hitTank()方法应该包含在Missile类中。难点:可利用Tank所定义的枚举方向变量。
Explode类:产生Explode效果,即绘制一组从小到大再到小的圆。
Wall类:设置Wall障碍物。
Blood类:可以给Tank增加Blood。
难点代码示例:
(1)双缓冲消除闪烁
public void update(Graphics g) {
if (offScreenImage == null) {
offScreenImage = this.createImage(GAME_WIDTH, GAME_HEIGHT);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.BLACK);
gOffScreen.fillRect(0, 0, GAME_WIDTH, GAME_HEIGHT);
gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}
(2)实现8个方向的移动
enum direction {L, LU, U, RU, R, RD, D, LD, STOP};
private boolean bL = false, bU = false, bR = false, bD = false;
public 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 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;
}
}
(3)智能Tank的实现(使用Random),无规则运动,可自己发炮弹
private Random r = new Random();
direction dirs[] = direction.values();
if (step == 0) {
step = r.nextInt(12) + 3;
int rn = r.nextInt(dirs.length);
dir = dirs[rn];
}
step--;
if (r.nextInt(50) > 47)
fire();
(4)碰撞检测(Rectangle的使用)
public Rectangle getRect() {
return new Rectangle(x, y, WIDTH, HEIGHT);
}
this.getRect().intersects(b.getRect());