4.游戏运动
让游戏动起来是最令我们兴奋的事情之一了,下面我们开始行动
4.1 事件监听器
在GUI程序中,程序获取用户的输入,需要增加事件监听器,本游戏中,我们只需要添加键盘监听器即可。
下面在GameFrame的构造方法中,我们增加键盘监听器,依据传入的值,执行不同的动作
/**
* 新增键盘监听器
*/
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
break;
case KeyEvent.VK_DOWN:
break;
case KeyEvent.VK_RIGHT:
break;
case KeyEvent.VK_LEFT:
break;
}
}
});
当我们的指令下达后,应当交由gamePeople中可以运动的角色执行,即gamePeople.move(int direction,People people)
我们对direction定义如下规则:(当然,最好设置为常量,这里我们就不改了)
- 1 向上移动
- -1向下移动
- 2向右移动
- -2向左移动
如何实现移动,即people的坐标发生变化,即+/-24:
在GamePeople有如下方法:
public void move(int direction, People you) {
/**
* 先移动
*/
switch (direction) {
case 1:
you.setY(you.getY() - 24);//y -= 24;
break;
case -1:
you.setY(you.getY() + 24);//y += 24;
break;
case 2:
you.setX(you.getX() + 24);//x += 24;
break;
case -2:
you.setX(you.getX() - 24);//x -= 24;
break;
}
}
于是,我们的GameFrame就要告知gamePeople谁可以动,当然,这一规则需要后续添加,此时,我们认为baba可以动,于是在监听器中有如下代码:
- 遍历找到可以移动的角色
- 让该角色移动
当然为了代码简洁,我们抽出方法peopleMove((KeyEvent e),如下
/**
* 新增键盘监听器
*/
this.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
peopleMove(e);
}
});
private void peopleMove(KeyEvent e) {
/**
* 遍历循环(添加GamePeople的getPeopleList()方法)
* 寻找可以移动的角色
*/
List<People> peopleList = gamePeople.getPeopleList();
for (int i = 0; i < peopleList.size(); i++) {
People people = peopleList.get(i);
if(PeopleLocation.BABA.equalsIgnoreCase(people.getName())) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
gamePeople.move(1,people);
break;
case KeyEvent.VK_DOWN:
gamePeople.move(-1,people);
break;
case KeyEvent.VK_RIGHT:
gamePeople.move(2,people);
break;
case KeyEvent.VK_LEFT:
gamePeople.move(-2,people);
break;
}
}
}
}
至此,我们的角色已经可以移动,当然,之后我们需要判断碰撞规则
- 遇到墙壁和stop物块:停止移动
- 遇到规则块和push的物体:实现推动
- 遇到胜利win条件:获胜