貪吃蛇系列之六——轉向

      在上一個版本中,咱們的蛇已經能夠在遊戲的窗口中運動了,可是這一去就不會來,因此在這個版本中,咱們先來修復這個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
相關文章
相關標籤/搜索