通常你有一個更新()和渲染() - 方法在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位置後,在更新方法中調用此方法。
玩得開心;-)
你在想什麼絕對是一種解決方法。還有很多其他的。 – nhouser9
@ nhouser9更新了這個問題的主要帖子,但我採取了最簡單的方法?還是我過分複雜化了這一點。 – joey942
玩家在走出平臺時會發生什麼(即不跳躍?) 它應該是您正常遊戲循環的一部分(無論跳躍與否)。每次更新週期後,您都會處理輸入,計算新位置,將播放器更新到新位置並重新繪製。部分計算應包括玩家是否在地板上。這樣做取決於你想檢查什麼樣的算法。這可能是通過數組,或一個盒子碰撞等。 –