【问题标题】:Detect whether a specific part of body collided with another body in box2d检测身体的特定部位是否与box2d中的另一个身体碰撞
【发布时间】:2014-04-11 06:34:55
【问题描述】:

请就我如何在 box2d 中使用 libgdx 检测 一个身体的特定部分与另一个身体的特定部分之间的碰撞提出一些解释或代码。我能够使用 Contact Listener 检测两个身体之间的简单碰撞正如提到的here但我还想检查身体的哪些部分重叠

谢谢,

【问题讨论】:

    标签: android libgdx box2d collision-detection


    【解决方案1】:

    ContactListener 为您提供Contact 作为回调参数。这些联系人会通过contact.getFixtureA()contact.getFixtureB() 告诉您哪个Fixtures 确实发生了冲突。

    人们通常会通过body.createFixture(...)用几个Fixtures来找出他们身体的哪个部位发生了碰撞。

    您可以使用fixture.setUserData()body.setUserData()FixtureBody 上设置用户数据。您可以将您的灯具保存在其他地方并通过contact.getFixtureA() == xxx.savedFixture 进行比较。

    这可能在您的实体中,例如:

    public class Player {
        public Fixture arm;
    
        // create the player body and store the arm fixture
        body.setUserData(this);
        arm = body.createFixture(...);
    }
    

    稍后您可以在您的联系人监听器中执行此操作:

    public void beginContact(Contact contact) {
        if (contact.getFixtureA().getBody().getUserData().getClass().equals(Player.class)) {
            if (contact.getFixtureA() == ((Player)contact.getFixtureA().getBody().getUserData()).arm == contact.getFixtureA()) {
                // the arm collided with something
            }
        }
    }
    

    或者您可以添加一些用户数据,例如 fixture.setUserData("arm"),然后您可以轻松检查这些数据。在您的联系人回调处理程序中。

    【讨论】:

    • 我不明白你想通过在某处保存夹具来解释什么。?
    • UserData 可以是任何东西。这是一个Object。这是你想要的。您可以将您的固定装置作为字段保存在实体中的某个位置。
    • @JigarPandya 我给了你更多的伪代码来展示如何使用用户数据。
    • 也许您应该重新阅读我的整个答案,尝试理解其背后的想法,然后在您的特定场景中自己尝试一下?我的回答已经比你最初的问题长得多,而且没有任何关于你的问题的更具体的细节,我现在不能再帮你了。
    • @JigarPandya UserData 只是夹具的一个属性,您可以将其设置为任何您想要的。例如,您可以将其设置为字符串,然后使用该字符串通过 GetUserData() 来识别灯具。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    相关资源
    最近更新 更多