簡體   English   中英

Libgdx平鋪地圖碰撞檢測

[英]Libgdx tiled map collision detection

我目前正在開發2d rpg游戲,例如最終幻想1-4。 基本上,可以加載我的平鋪地圖,並且精靈可以在地圖上自由行走。

如何處理平鋪地圖的碰撞?

我創建了三個單獨的圖塊層。 “背景層”,“碰撞層”,“開銷層”,我不確定這是否有用。

編輯:我現在創建了一個對象層,用於在我希望精靈碰撞的區域上與矩形碰撞。

任何幫助是極大的贊賞。 謝謝!

這是我當前的代碼

MapObjects collisionObjects = (GameAssets.mainTiledMap).getLayers().get("CollisionLayer").getObjects();
int tileWidth = 16;
int tileHeight = 16;

for (int i = 0; i < collisionObjects.getCount(); i++) {
    RectangleMapObject obj = (RectangleMapObject) collisionObjects.get(i);
    Rectangle rect = obj.getRectangle();

    rect.set(GamePlayer.x, GamePlayer.y, 16,16);

    Rectangle rectobject = obj.getRectangle();
        rectobject.x /= tileWidth;
        rectobject.y /= tileHeight;
        rectobject.width /= tileWidth;
        rectobject.height /= tileHeight;

    if(rect.overlaps(rectobject)) {
        GamePlayer.ableToMove = false;
    }
}

在我的游戲中,我具有2D int數組walls[][] ,在其中存儲有關Tiles的信息。 對我來說0是沒有牆,所以我可以經歷。 所有其他數字都壓制了一些特殊的牆型,這些牆型我必須處理碰撞。 為了檢測是否發生碰撞,我執行以下操作:

if (yMov > 0) {
    int leftX = (int)(position.x - width/2);    // The leftmost point of the Object.
    int rightX = (int)(position.x + width/2);   // The rightmost point of the Object.
    int newMaxY = (int)((position.y * yMov * currentSpeed * delta) + height/2);
    if (walls[leftX][newMaxY] != 0 || walls[rightX][newMaxY] != 0)
         // Collision in positive y-Direction.

筆記:

  1. 這是可以解決的,因此請先檢測碰撞然后再移動。 為此,您必須將碰撞檢測的結果存儲在某處。
  2. 角色所在的Integer由其position.xposition.yInteger表示來定義。
  3. yMov以y方向描述運動的垂直值。 因此,如果您向右轉到45°,則您的yMov = 0.5xMov = 0.5 左上將是yMov = 0.5xMov = -0.5
  4. 在此處使用此示例代碼塊並將其復制3次,分別是yMov < 0xMov > 0xMov < 0
  5. 在此示例中,位置是對象的中間。 如果您的情況是左下角,則只需要為上移添加全高,為右移添加全寬,其他移動不增加高度/寬度。

編輯:我試圖更好地解釋它:您有一個Sprite它由他的中心點定義: position.xposition.y和他的大小: size.xsize.y (寬度和高度)。 現在考慮一下情況,您就可以向右運行。 在這種情況下,您永遠無法與左側的瓷磚碰撞。 同樣,如果您向右移動,則無法與上方或下方的圖塊發生碰撞。 因此,只需檢查1個圖塊:您右邊的圖塊。 同樣,如果子畫面的右側部分( position.x + size / 2 )移得足夠遠,則只能與右側的Tile碰撞。 如果您在y方向上在2個圖塊之間移動,則必須檢查upperY位置處的newX以及您的upperY (position.y + size.y / 2)和lowerY (position.y-size.y / 2)。

給你我正在使用的圖片: 碰撞檢測 看一下第三張圖片,帶有以下說明:

上圖為我們提供了2個候選單元格(平鋪),以檢查這些單元格中的對象是否與Bob發生碰撞。

這是平台游戲的碰撞,在平台游戲中您有重力,因此您必須檢查在其下的Tile。 在自上而下的游戲中並非如此。 我沒有完全使用這種方法,但是圖片顯示了我在做什么。

如果您還有其他問題,請隨時提出。

我真的不建議使用矩形。 相反,我在自己的游戲中所做的是:

  1. 在“平鋪”中,將您的牆磚分配為已阻止。 為此,只需向每個單獨的圖塊添加一個名為block的屬性。
  2. 在代碼中,當您處理玩家的動作時,請編寫如下偽代碼:

     try { cell = collisionLayer.getCell((int) (x / collisionLayer.getTileWidth()), (int) (y / collisionLayer.getTileHeight())); } catch (Exception e) { e.printStackTrace(); } if (cell.getTile().getProperties().containsKey("blocked")) { blocked = true; } 

其中x和y是要檢查的單元格的位置。 然后,如果blocked = true,則不要移動播放器。 如果阻止=否,則移動播放器。

我可能不清楚這個答案,如果是的話,請隨時給我發消息或查看dermetfan的這篇很棒的教程

我假設您有一個處理運動階段的方法,如果是這樣,我過去所做的方法是,在確定運動方向后,檢查矩形碰撞層,檢查位置是否相交邊界之一然后返回/運行一種方法,但是您要處理該方法,即玩家死亡,或者玩家位置不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM