2013-04-30 149 views
0

所以我的問題很簡單......但讓它像那樣工作是另一回事。所以我會立即開始!瞭解如何沿着改變的路徑移動路徑

目的:我正在嘗試製作一個像遊戲一樣的蛇,並且我遇到了路徑跟蹤問題。我已經使用過DID工作的以前的方法,但是,我試圖消除「目標」對象,所以蛇有自由移動的感覺,而不是網格的感覺。

我的問題是當我開始重寫我的球員課程時,我擺脫了很多冗餘的東西。我的最終任務是解決路徑如何移動。我希望線索能夠通過滑入位置來追蹤它的蹤跡。

我寫的代碼工作之前(網格感覺):

public void Move(int delta){ 
//  double moveSpeed = (delta * .6f) - (oreWeight * ore + armorWeight * armor); 

     //Smooth animation for snake movement 
     if(IsMoving() && (X.equals(destX) && Y.equals(destY))){ 
      for(int i = 1; i < getSize(); i++){ 
       if(destX.get(i).intValue() != X.get(i-1).intValue()){ 
        destX.set(i, X.get(i-1)); 
       } 
       else if(destY.get(i).intValue() != Y.get(i-1).intValue()){ 
        destY.set(i, Y.get(i-1)); 
       } 
      } 

      if(left){ 
       destX.set(0, destX.get(0) - GameBoardNew.blockSize); 
      } 
      else if(right){ 
       destX.set(0, destX.get(0) + GameBoardNew.blockSize); 
      } 
      else if(up){ 
       destY.set(0, destY.get(0) - GameBoardNew.blockSize); 
      } 
      else if(down){ 
       destY.set(0, destY.get(0) + GameBoardNew.blockSize); 
      } 
     } 
     else{ 
      for(int i = 0; i < getSize(); i++){ 
       if(up || down){ 
        if(X.get(i).intValue() != destX.get(i).intValue()){ 
         X.set(i, X.get(i) + Integer.signum(destX.get(i) - X.get(i))); 
        } 
        else if(Y.get(i).intValue() != destY.get(i).intValue()){ 
         Y.set(i, Y.get(i) + Integer.signum(destY.get(i) - Y.get(i))); 
        } 
       } 
       if(right || left){ 
        if(Y.get(i).intValue() != destY.get(i).intValue()){ 
         Y.set(i, Y.get(i) + Integer.signum(destY.get(i) - Y.get(i))); 
        } 
        else if(X.get(i).intValue() != destX.get(i).intValue()){ 
         X.set(i, X.get(i) + Integer.signum(destX.get(i) - X.get(i))); 
        } 
       } 
      } 
     } 
} 

而現在,因爲我已經重新設計它,我將在多快的球員與其他一起行進的速度條件,同時試圖擺脫公式的目標部分,並用它的身體來解決這個問題。然而,我的工作,直到玩家在不同的方向快速移動......然後身體聚集在一起。它基本上是相同的公式,但仍然非常困惑。

public void Move(int delta){ 
//  float moveSpeed = (playerSpeed - (oreWeight * getSize() + armorWeight * armor)) * delta; 
    float moveSpeed = 1f; 

    if(IsMoving() && player.get(0).getX() == playerDest.get(0).getX()){ 
     for(int i = 1; i < getSize(); i++){ 
      if(playerDest.get(i).getX() != player.get(i - 1).getX()){ 
       playerDest.get(i).setX(player.get(i - 1).getX()); 
      } 
      else{ 
       playerDest.get(i).setY(player.get(i - 1).getY()); 
      } 
     } 

     if(left){ 
      playerDest.get(0).setX(player.get(0).getX() - moveSpeed); 
     } 
     else if(right){ 
      playerDest.get(0).setX(player.get(0).getX() + moveSpeed); 
     } 
     else if(up){ 
      playerDest.get(0).setY(player.get(0).getY() - moveSpeed); 
     } 
     else if(down){ 
      playerDest.get(0).setY(player.get(0).getY() + moveSpeed); 
     } 
    } 

    for(int i = 0; i < getSize(); i++){ 
     Rectangle location = player.get(i); 
     Rectangle inFront = playerDest.get(i); 
     int xVel = Integer.signum((int)inFront.getX() - (int)location.getX()); 
     int yVel = Integer.signum((int)inFront.getY() - (int)location.getY()); 
     if(up || down){ 
      if(location.getX() != inFront.getX()){ 
       if(xVel == 1){ 
        location.setX(location.getX() + moveSpeed); 
       } 
       else if(xVel == -1){ 
        location.setX(location.getX() - moveSpeed); 
       } 
      } 
      else if(location.getY() != inFront.getY()){ 
       if(yVel == 1){ 
        location.setY(location.getY() + moveSpeed); 
       } 
       else if(yVel == -1){ 
        location.setY(location.getY() - moveSpeed); 
       } 
      } 
     } 
     else if(right || left){ 
      if(location.getY() != inFront.getY()){ 
       if(yVel == 1){ 
        location.setY(location.getY() + moveSpeed); 
       } 
       else if(yVel == -1){ 
        location.setY(location.getY() - moveSpeed); 
       } 
      } 
      else if(location.getX() != inFront.getX()){ 
       if(xVel == 1){ 
        location.setX(location.getX() + moveSpeed); 
       } 
       else if(xVel == -1){ 
        location.setX(location.getX() - moveSpeed); 
       } 
      } 
     } 
    } 
} 

如果我需要澄清的任何信息,我會很高興;只問!

感謝您花時間閱讀本文!

+0

你能澄清你的意思是「網格感」嗎?任何時候你使用不同的整數數字,它會產生一個類似網格的環境。離散數據類型如浮點數(即小數)通常用於「自由移動」系統。 – asteri 2013-04-30 14:09:33

+0

我的網格感的含義,玩家的目的地被設置爲它的大小,例如,這是20px。所以玩家必須先移動20px才能接受不同的方向。只是用完整的方法更新了主帖。 – Twister1002 2013-04-30 14:12:33

回答

0

在另一個幫助論壇中,人們推薦使用目標對象來跟蹤路徑中的前一個對象,以避免發現故障路徑。

0

如果這是一條具有分段身體的蛇,每個分段都跟着之前的分段。唯一具有「自由意志」的部分是遵循用戶輸入的頭部。

+0

這是真的。頭部是接受用戶移動頭部輸入的唯一部分。其他部分則緊隨其後。 – Twister1002 2013-04-30 14:16:44

+0

因此,考慮到這一點,您是否應該能夠以[WireWorld](http://de.wikipedia.org/wiki/Wireworld)的方式「瓦解」瓦片?很顯然,當彼此相鄰的瓷磚恰到好處時很難做到... – tilpner 2013-04-30 14:31:39

+0

Tralli我剛剛重讀了你的答案,是的,那就是它應該如何工作。但如果我沒有試圖讓它像那樣工作的問題,那麼我就不會發布這個問題來獲得幫助=)。 @StackOverflowException你是什麼意思? – Twister1002 2013-04-30 15:11:28