《Java小游戏实现》:坦克大战(续一)
上篇博文(http://blog.csdn.net/u010412719/article/details/51712663)只介绍到了能够控制一个坦克在4个方向上移动就结束了,今天就在此基础上继续完成一个一个的小功能。
完成的功能:根据键盘的按键控制一个坦克在8个方向上移动
要完成这个功能,我们要做一下几个事情
1、记录下键盘的按键情况,即要重写键盘按下和抬起的监听事件
采用4个boolean变量来记录,按下为true,抬起为false
具体实现的代码如下:
//定义四个布尔类型变量来记录按键的情况,默认状态下为false,表示没有键按下
private boolean b_L,b_U,b_R,b_D;
//记录键盘的按键情况
public void keyMonitor(KeyEvent e){
int key=e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
b_L=true;
break;
case KeyEvent.VK_UP:
b_U=true;
break;
case KeyEvent.VK_RIGHT:
b_R=true;
break;
case KeyEvent.VK_DOWN:
b_D=true;
break;
}
//根据上面的按键情况,确定坦克即将要运行的方向,即第二步要完成的内容,具体实现看博文下面
moveDirection();
}
//键盘按键松下时,也要进行记录
public void keyReleased(KeyEvent e) {
int key=e.getKeyCode();
switch(key){
case KeyEvent.VK_LEFT:
b_L=false;
break;
case KeyEvent.VK_UP:
b_U=false;
break;
case KeyEvent.VK_RIGHT:
b_R=false;
break;
case KeyEvent.VK_DOWN:
b_D=false;
break;
}
}
2、根据1中所记录的按键情况来确定坦克的运行方向
8个运行方向采用一个枚举类型来保存。即
private enum Direction{
L,LU,U,RU,R,RD,D,LD,STOP
}
//例如:如果键盘的左键和下键被按下,则运行方向dir=Direction.LD.
//定义一个变量来表示坦克要运行的方向,初始状态为STOP
private Direction dir = Direction.STOP;
//根据键盘的按键情况来确定坦克的运行方向
private void moveDirection() {//L,LU,U,RU,R,RD,D,LD,STOP
if(b_L&&!b_U&&!b_R&&!b_D){
dir = Direction.L;
}
else if(b_L&&b_U&&!b_R&&!b_D){
dir = Direction.LU;
}
else if(!b_L&&b_U&&!b_R&&!b_D){
dir = Direction.U;
}
else if(!b_L&&b_U&&b_R&&!b_D){
dir = Direction.RU;
}
else if(!b_L&&!b_U&&b_R&&!b_D){
dir = Direction.R;
}
else if(!b_L&&!b_U&&b_R&&b_D){
dir = Direction.RD;
}
else if(!b_L&&!b_U&&!b_R&&b_D){
dir = Direction.D;
}
else if(b_L&&!b_U&&!b_R&&b_D){
dir = Direction.LD;
}
else{//其它所有情况,都是不动
dir = Direction.STOP;
}
}
3、根据2中的运动方向来确定具体的运行快慢等情况,例如,如果是像左下方向运动,则坦克目前所在的位置(x,y)—->(x-XSPEED,y+YSPEED);其中XSPEED、YSPEED为x、y轴的运行速度。
//上面有运行方向,但是还缺少具体的运行细节,例如:假设是按下了右键,则应该横坐标x+=XSPEED;
private void move(){
if(dir==Direction.L){
//L,LU,U,RU,R,RD,D,LD,STOP
x -= XSPEED;
}
else if(dir==Direction.LU){
x -= XSPEED;
y -= YSPEED;
}
else if(dir==Direction.U){
y -= YSPEED;
}
else if(dir==Direction.RU){
x += XSPEED;
y -= YSPEED;
}
else if(dir==Direction.R){
x += XSPEED;
}
else if(dir==Direction.RD){
x += XSPEED;
y += YSPEED;
}
else if(dir==Direction.D){
y += YSPEED;
}
else if(dir==Direction.LD){
x -= XSPEED;
y += YSPEED;
}
else if(dir==Direction.STOP){
//... nothing
}
}
上面三步完整代码代码如下:
public class Tank {
//坦克所在的位置坐标
private int x;
private int y;
//定义两个常量,表示运动的速度
private static final int XSPEED = 5;
private static final int YSPEED = 5;
//定义四个布尔类型变量来记录按键的情况,默认状态下为false,表示没有键按下
private boolean b_L,b_U,b_R,b_D;
//定义一个枚举类型来表示运行的方向
private enum Direction{
L,LU,U,RU,R,RD,D,LD,STOP
}
//定义一个变量来表示坦克要运行的方向,初始状态为STOP
private Direction dir = Direction.STOP;
public Tank(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
ret