在上一个版本中,我们的蛇已经可以在游戏的窗口中运动了,但是这一去就不会来,所以在这个版本中,我们先来修复这个BUG,我们让我们的蛇具有穿透的能力,就是从哪一边跑出屏幕,就从另一边跑回来。还是先看我们的关键代码:
那么接着,我们就要让我们的蛇听从我们的指挥,我们叫它向左它就要向左,不能向右对不对。那么我们就要给蛇添加一个转向的方法,changeDirection()。在这个方法中,我们用新的方向去替换原来蛇运动的方向即完成了蛇的变向。下面是代码:
我们还是接着讲我们要实现的那个接口, KeyListener,在java中,要实现接口的方式是在我们的类名后面使用关键字implements加上我们要实现的接口的名称。那么当我们实现了这个接口之后,Eclipse会报错,因为我们还没有去实现KeyListener中的方法,使用Eclipse的自动修复功能,我们实现那几个方法:
至此,我们这个版本基本上就完成了,我们可以通过键盘来控制我们的蛇了,是不是感觉离目标越来越近了?呵呵。但是,还有一个小BUG,现在我们的蛇是可以回退的噢,什么意思呢,就是原来我的蛇向右在跑,我是可以按左键让蛇向左跑的噢,这在游戏里面是不被允许的,这个小BUG我们将在下一个版本中进行修复。
我把代码都放在迅雷快传上了,大家奔走相告吧,这里给出链接,一篇博文对应一个项目文件,大家直接导入工程就可以运行:
http://kuai.xunlei.com/d/nNdkCTf2DCjTUAQA450
/**
* 蛇移动的方法
*/
public void move(){
//1.去尾。这个很简单,意思就是说去掉我们snakeList的最后一个元素
snakeBody.removeLast();
//2.加头。这个就相对复杂一点,需要我们根据蛇当前运动的方向来判断我们的蛇头应该加在什么位置
Body head = snakeBody.getFirst();//获得当前蛇头的那个对象
int newX = head.x;//我们要添加的蛇头的横坐标
int newY = head.y;//我们要添加的蛇头的纵坐标
switch(direction){
case DIR_UP:
//如果蛇跑出了上边界我们就让蛇从下边跑出来
if(head.y <= 0){
newY = GameView.WINDOW_HEIGHT - BODY_SIZE;
} else {
newY -= BODY_SIZE;
}
break;
case DIR_DOWN:
//如果蛇跑出了下边界我们就让蛇从上边跑出来
if(head.y >= GameView.WINDOW_HEIGHT - BODY_SIZE){
newY = 0;
} else {
newY += BODY_SIZE;
}
break;
case DIR_LEFT:
//如果蛇跑出了左边界我们就让蛇从右边跑出来
if(head.x <= 0){
newX = GameView.WINDOW_WIDTH - BODY_SIZE;
} else {
newX -= BODY_SIZE;
}
break;
case DIR_RIGHT:
//如果蛇跑出了右边界我们就让蛇从左边跑出来
if(head.x >= GameView.WINDOW_WIDTH - BODY_SIZE){
newX = 0;
} else {
newX += BODY_SIZE;
}
break;
}
snakeBody.addFirst(new Body(newX, newY));
}
我们需要修改蛇的move方法,我们需要对蛇头当前的位置进行判断,根据我们蛇头的临界位置来有选择性的计算出下一个蛇头的位置,这个应该不难理解。
那么接着,我们就要让我们的蛇听从我们的指挥,我们叫它向左它就要向左,不能向右对不对。那么我们就要给蛇添加一个转向的方法,changeDirection()。在这个方法中,我们用新的方向去替换原来蛇运动的方向即完成了蛇的变向。下面是代码:
/**
* 改变蛇的运动方向
* @param direction 蛇的新的运动方向
*/
public void changeDirection(int direction){
this.direction = direction;
}
有了变向的方法,接着我们要做的就是在GameView中去监听用户按下键盘的事件了,在这里呢,我们使用键盘上的上下左右四个方向键来控制蛇的移动,当然,你也可以选择其他的按键。那么,要实现对PC键盘的监听,在我们的java中,我们需要去实现一个叫做KeyListener的接口。
这里有一个很重要的概念——接口,孤狼在这里简单的讲一下接口的概念。大家要理解什么叫做接口,可以想象一下我们的插线板,插线板上是不是有很多两孔的或者三孔的插口,那些就相当于是我们的接口。接口有什么作用呢,同样以插线板为例,一个电器你要使用他是不是要插进插线板中的特定的那个插孔才可以,你不能说把一个有四个角的插头插到三个孔的插孔中吧。因此接口就是我们的开发人员定义的一系列规范(具体来说就是方法),这些方法以后会被什么程序拿去使用我们在造插线板的时候还不知道。但是只要你以后电器的插头满足我给你的样式(即规范),那么你的电器(程序)就可以正常的运行。还不理解的同学就只有去查查资料了,因为接口这个概念很重要,是我们面向对象中的核心之一。
我们还是接着讲我们要实现的那个接口, KeyListener,在java中,要实现接口的方式是在我们的类名后面使用关键字implements加上我们要实现的接口的名称。那么当我们实现了这个接口之后,Eclipse会报错,因为我们还没有去实现KeyListener中的方法,使用Eclipse的自动修复功能,我们实现那几个方法:
/**
* 键盘被按下的事件
*/
@Override
public void keyPressed(KeyEvent e) {
}
/**
* 键盘弹起的事件
*/
@Override
public void keyReleased(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_LEFT://向左
snake.changeDirection(Snake.DIR_LEFT);
break;
case KeyEvent.VK_RIGHT://向右
snake.changeDirection(Snake.DIR_RIGHT);
break;
case KeyEvent.VK_UP://向上
snake.changeDirection(Snake.DIR_UP);
break;
case KeyEvent.VK_DOWN://向下
snake.changeDirection(Snake.DIR_DOWN);
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
这三个方法就是接口中定义好的,我们的虚拟机会在监听到用户按键盘之后调用相应的方法来处理键盘事件。我们选择其中的当键盘被松开弹起的事件来实现我们对蛇的变向的操作。至此,我们这个版本基本上就完成了,我们可以通过键盘来控制我们的蛇了,是不是感觉离目标越来越近了?呵呵。但是,还有一个小BUG,现在我们的蛇是可以回退的噢,什么意思呢,就是原来我的蛇向右在跑,我是可以按左键让蛇向左跑的噢,这在游戏里面是不被允许的,这个小BUG我们将在下一个版本中进行修复。
我把代码都放在迅雷快传上了,大家奔走相告吧,这里给出链接,一篇博文对应一个项目文件,大家直接导入工程就可以运行:
http://kuai.xunlei.com/d/nNdkCTf2DCjTUAQA450