1、方块移动控制
上次写到了要让自己的方块单方向移动,那么我们如何控制我们的方块听从我们从键盘数入的指令,使他能够上下左右的移动起来呢,还上前面介绍国的方法,使用继承自KeyAdpter类的键盘监听器,监听我们输入的指令来控制方块的移动,话不多说直接看代码:
class mykeyListener extends KeyAdapter{
@Override
public void keyPressed(KeyEvent e) { //键盘按下
// TODO Auto-generated method stub
int key=e.getKeyCode();//取出按下键的码
switch (key){
case KeyEvent.VK_W: y=y-5 ;break;//绑定按键w向上
case KeyEvent.VK_S: y+=5;break;//绑定按键s向下
case KeyEvent.VK_A: x-=5;break;//绑定a键向左
case KeyEvent.VK_D: x+=5;break;//绑定d键向右
default:
break;
}
}
@Override
public void keyReleased(KeyEvent e) { //键盘抬起
// TODO Auto-generated method stub
}
}
在其中我写入了一个变量key, 而这个key的值来自按下的这个方法的参数,这个参数就是直接读取我们所按下键盘的键的代号,通俗的理解就是直接读取我们所按下的键的ASCLL码值,然后赋值给Key这个变量(由于我个人对于这个语句是真的只能理解到这个程度,如有失偏颇请各位评论指正),又因为在mainActivity主类中写入了刷新频率为每50毫秒进行一次画面刷新,这时我们就可以使用以swich语句来对方块的坐标进行设置,在这里又引用了一个KeyEvent绑定虚拟按键为w键向上,当监听到按下的键为w时,就重新设置方块的纵向坐标减去要移动端的量即可,上下左右均可这样设置。
————————————————分割线————————————————————
或者用另一种方法来写。我们建立一个枚举类,在其中写入上下左右4个方向。
package tank;
public enum Dir {
LEFT,UP,RIGHT,DOWN;
}
然后我们在tankframe类中的键盘监听方法中定义4个Boolean类型的值,并设置初值为false,还是同样的方法使用getKeyCode()方法来监听键盘,并绑定按键,这时当监听到所按下的方向键时,重新设置4个布尔类型的值均为false。
接着让keyPressed方法中使用switch语句更改这4个布尔类型的值为true,在keykeyReleased方法中使用switch语句使这4个布尔值false。
class mykeyListener extends KeyAdapter{
Boolean bw=false;
Boolean bs=false;
Boolean ba=false;
Boolean bd=false;
@Override
public void keyPressed(KeyEvent e) {
int key=e.getKeyCode();
switch(key) {
case KeyEvent.VK_W:bw=true;break;
case KeyEvent.VK_S:bs=true;break;
case KeyEvent.VK_A:ba=true;break;
case KeyEvent.VK_D:bd=true;break;
default:
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
int key=e.getKeyCode();
switch(key) {
case KeyEvent.VK_W:bw=false;break;
case KeyEvent.VK_S:bs=false;break;
case KeyEvent.VK_A:ba=false;break;
case KeyEvent.VK_D:bd=false;break;
default:
break;
}
}
然后在这两个方法中写入一个名为setMainTankdir();构造方法设置坦克的初始方向。
private void setMainTankdir() {
// TODO Auto-generated method stub
if(bw) dir=Dir.UP;
if(bs) dir=Dir.DOWN;
if(ba) dir=Dir.LEFT;
if(bd) dir=Dir.RIGHT;
}
注意:在使用这个构造方法之前需要先在tankFrame类中初始化好枚举类型,并设定坦克的初始方向为DOWN
然后在paint方法中写入使坦克能按照一定速度进行移动的方法,同样还是使用switch语句来进行
public void paint(Graphics g) {
// TODO Auto-generated method stub
g.fillRect(x,y, 50, 50);
switch(dir) {
case RIGHT: x+=SPEED; break;
case UP: y-=SPEED; break;
case LEFT: x-=SPEED; break;
case DOWN: y+=SPEED; break;
default:
break;
}
}
运行程序坦克就可以按照我们希望的方向自己移动了。