2017-11-12 7 views
1

私はLibGDXでゲームをしていて、タイルでマップを設定しています。私は、特定のレイヤーのオブジェクトにカスタムStringプロパティを追加して、それがどのオブジェクトを表しているかを詳細に知ることができました。LibGDX衝突でオブジェクトのプロパティを取得する

マップオブジェクトの抽象クラスのメソッドを呼び出すContactListenerを設定しました。

@Override 
public void beginContact(Contact contact) { 

    Fixture fixtureA = contact.getFixtureA(); 
    Fixture fixtureB = contact.getFixtureB(); 

    if (fixtureA.getUserData() == "player" || fixtureB.getUserData() == "player") { 
     // Get either fixture A or B, depending on which of them is the player fixture 
     Fixture player = fixtureA.getUserData() == "player" ? fixtureA : fixtureB; 
     // Get the colliding object, depending on which of them is the player fixture 
     Fixture collidedObject = player == fixtureA ? fixtureB : fixtureA; 

     // Determine what kind of object the player collided with and trigger the respectable method 
     if (collidedObject.getUserData() instanceof InteractiveMapTileObject) { 
      ((InteractiveMapTileObject) collidedObject.getUserData()).onPlayerBeginContact(); 
     } else if (collidedObject.getUserData() instanceof Enemy) { 
      ((Enemy) collidedObject.getUserData()).onPlayerBeginContact(); 
     } 
    } 
} 

プレイヤーがInteractiveMapTileObjectのインスタンスのオブジェクトに当たるときは、onPlayerBeginContact()メソッドは次のようになりますこれは、呼び出されます:私は取得しています、ここで

@Override 
public void onPlayerBeginContact() { 
    MapObjects objects = playScreen.getMap().getLayers().get("weapon").getObjects(); 
    for (MapObject object : objects) { 
     if (object.getProperties().containsKey("weapon_name")) { 
      String weaponName = object.getProperties().get("weapon_name", String.class); 
      Gdx.app.log("Picked up weapon", weaponName); 
     } 
    } 
} 

リスナーは、次のようになりますマップ内の「weapon」レイヤーのオブジェクトを選択し、それを反復して正しいプロパティと値を見つけます。これはそのまま動作します。

問題は、明らかにレイヤー内に複数のオブジェクトが存在し、複数のMapObjectが存在するということです。私はオブジェクトを特定する方法、プレーヤーが衝突した後にそれを取得する方法が必要です。

ContactListenerでこれを行うことはできますか、それとも別の実装が必要ですか?私はすでに数多くの記事を検索しましたが、運が良かったわけではありません。

答えて

0

私は抽象クラスにカスタムメソッドを書いて、特定のオブジェクトレイヤー内の各オブジェクトの共通部分をチェックすることで、私の問題を解決しました。

protected MapObject getCellProperties(int layerIndex) { 
    MapObjects mapObjects = map.getLayers().get(layerIndex).getObjects(); 

    for (MapObject mapObject : mapObjects) { 
     MapProperties mapProperties = mapObject.getProperties(); 

     float width, height, x, y; 
     Rectangle objectRectangle = new Rectangle(); 
     Rectangle playerRectangle = new Rectangle(); 

     if (mapProperties.containsKey("width") && mapProperties.containsKey("height") && mapProperties.containsKey("x") && mapProperties.containsKey("y")) { 
      width = (float) mapProperties.get("width"); 
      height = (float) mapProperties.get("height"); 
      x = (float) mapProperties.get("x"); 
      y = (float) mapProperties.get("y"); 
      objectRectangle.set(x, y, width, height); 
     } 

     playerRectangle.set(
       playScreen.getPlayer().getX() * MainGameClass.PPM, 
       playScreen.getPlayer().getY() * MainGameClass.PPM, 
       playScreen.getPlayer().getWidth() * MainGameClass.PPM, 
       playScreen.getPlayer().getHeight() * MainGameClass.PPM 
     ); 

     // If the player rectangle and the object rectangle is colliding, return the object 
     if (Intersector.overlaps(objectRectangle, playerRectangle)) { 
      return mapObject; 
     } 
    } 

    // If no colliding object was found in that layer 
    return null; 
} 

これはおそらく最適な解決策ではありませんが、うまく機能します。

1

MapObjectから武器名を取得する代わりに、代わりにWeaponクラスから取得すると思います。

すべての武器はInteractiveTileMapObjectから継承できます。プレイヤーがフィクスチャーと衝突すると、ユーザーデータから参照を取得し、参照を使用して武器名を取得できます。

この回答があなたを助けてくれることを願っております。ご不明な点がありましたら、下記のコメントをお寄せください。

+0

私はオブジェクトと衝突したときにユーザーデータを評価しようとしましたが、衝突したオブジェクトのプロパティを特定できませんでした。以下は、ユーザーデータのスクリーンショットです:https://imgur.com/a/GxJ2R –

関連する問題