2016-09-18 106 views
0

我正在嘗試創建一個2D平臺遊戲,而我即將嘗試並實現跳躍。不過,我對如何讓玩家僅僅停留在平臺上感到失望。讓玩家只落在平臺上

我想創建一個平臺的新類,然後創建所有的遊戲平臺的所有座標的ArrayList。

我然後創建一個while循環,而當玩家跳躍時,他正在下降,但繼續下跌,除非他是站在一個平臺上?

喜歡的東西:

while(// This is where you check if the player's y coordinate is above all of the platforms in the game, so WHILE you are above all of the platforms, continue falling.){ 

     playery--; 
     repaint(); 
     // Some kind of wait here 
} 

我是否採取正確的做法嗎? 我在複雜嗎?有沒有更簡單的方法來實現這一點?

+0

你在想什麼絕對是一種解決方法。還有很多其他的。 – nhouser9

+0

@ nhouser9更新了這個問題的主要帖子,但我採取了最簡單的方法?還是我過分複雜化了這一點。 – joey942

+0

玩家在走出平臺時會發生什麼(即不跳躍?) 它應該是您正常遊戲循環的一部分(無論跳躍與否)。每次更新週期後,您都會處理輸入,計算新位置,將播放器更新到新位置並重新繪製。部分計算應包括玩家是否在地板上。這樣做取決於你想檢查什麼樣的算法。這可能是通過數組,或一個盒子碰撞等。 –

回答

1

通常你有一個更新()和渲染() - 方法在playerobject。爲了簡單起見,您可以在每次更新電話時更新您的球員的Y位置,例如POSY + = 5。對於高級重力,你可以使用y-速度來更新每個更新的y-位置。這y速度改變平滑運動。

你應該有一個控制器類,用於保存每一個實體在一些收集遊戲。在我的遊戲中,這個類叫做EntityManager,它將LinkedList中的每個實體都保存下來。我會建議爲不同的實體類型提供多個集合。在這種情況下,您可以使用BlockEntities代表構成平臺的方塊。

現在最重要的概念。每個實體都有一個返回Rectangle對象的方法作爲hitbox。 這裏是一個遊戲我做的一個示例:

public Rectangle getBounds() { 
     return new Rectangle(x, y, width, height); 
    } 

的x,y,寬度和高度是所述實體的屬性。

另外您需要的球員是位於播放器的底部擊中格。例如,如果玩家規模將是32×32像素:

public Rectangle getBottomBounds() { 
    return new Rectangle(x, y+30, width, 2); 
} 

現在到了碰撞控制: 在您的播放器,你需要一個領域是這樣的:

protected LinkedList<Block> blocks = null; 

在您的播放器,你實現這個方法:

public void checkBottomCollision() { 
    blocks = game.getEntityManager().getBlocks(); 
    for (int i = 0; i < blocks.size(); i++) { 
     Block tempBlock = blocks.get(i); 
      if(this.getBottomBounds().intersects(tempBlock.getBounds())){ 
       this.y = tempBlock.getY() + this.height; 
      } 
     } 
    } 
} 

game.getEntityManager()獲取包含我遊戲中所有實體的ControllerClass。方法getBlocks()返回一個包含所有塊的LinkedList。 您檢查玩家是否碰撞每個區塊。如果底部撞擊箱發生碰撞,則更新位置,以便您的玩家站在該塊上。 在更新y位置後,在更新方法中調用此方法。

玩得開心;-)

+0

感謝您的信息答案!一定會做到這一點! :) – joey942