私は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でこれを行うことはできますか、それとも別の実装が必要ですか?私はすでに数多くの記事を検索しましたが、運が良かったわけではありません。
私はオブジェクトと衝突したときにユーザーデータを評価しようとしましたが、衝突したオブジェクトのプロパティを特定できませんでした。以下は、ユーザーデータのスクリーンショットです:https://imgur.com/a/GxJ2R –