贪吃蛇系列之六——转向

      在上一个版本中,咱们的蛇已经能够在游戏的窗口中运动了,可是这一去就不会来,因此在这个版本中,咱们先来修复这个BUG,咱们让咱们的蛇具备穿透的能力,就是从哪一边跑出屏幕,就从另外一边跑回来。仍是先看咱们的关键代码:


        /**
	 * 蛇移动的方法
	 */
	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
相关文章
相关标签/搜索