如果我知道主体,如何将精灵附加到 box2d 主体上?

发布于 2024-12-03 08:39:40 字数 278 浏览 9 评论 0原文

碰撞检测后,我可以获得碰撞的物体,但是如何获得附加到这些物体上的精灵,以便我也可以将它们从场景中删除?

例如,如果我有一个身体(玩家),这个身体与另一个身体(敌人)碰撞,我可以从接触侦听器中获取哪些身体发生碰撞,如下所示:

pContact.getFixtureA().getBody()
pContact.getFixtureB().getBody()

因此,如果我们假设我们有很多敌人,我怎样才能获得准确的精灵附着在每一具尸体上,这样我就可以将它们移除?

After collision detection I can get the bodies that collided, but how can I get the sprites attached to these bodies so I can remove them from the scene also?

For example if I had a body (player) this body collided with another body (enemy), I can get which bodies collide from the contact listener like this:

pContact.getFixtureA().getBody()
pContact.getFixtureB().getBody()

So if we assume that we have a lot of enemies how can I get the exact sprite attached to each one of the bodies so I can remove them?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

胡渣熟男 2024-12-10 08:39:40

免责声明:我的经验是在 iOS 中使用 Cocos2d/Box2D,但在 Android 中应该类似。

通常,当使用 Box2D 主体和精灵时,您可以使用精灵设置主体定义的 UserData 属性。示例:

设置 userData:

bodyDef.UserData = sprite;

接触后检索精灵:

enemySprite = pContact.getFixtureA().getBody().GetUserData()

disclaimer: My experience is with Cocos2d/Box2D in iOS, but should be similar in Android.

Typically, when using Box2D bodies and sprites you set the UserData property of the Body Definition with the sprite. Example:

setting userData:

bodyDef.UserData = sprite;

retrieving sprite after contact:

enemySprite = pContact.getFixtureA().getBody().GetUserData()
天煞孤星 2024-12-10 08:39:40

您应该有一个 Enemy 类,它有 BodySprite。如果您有一个物体与另一个物体发生过接触,您可以迭代您的 Enemy 对象列表,通过简单地比较它们来找到谁的物体。然后你就可以轻松获取这个 Enemy 对象的精灵。希望我已经足够清楚地解释了我的想法。

You should have an Enemy class, that has its Body and Sprite. If you have a body that had a contact with an another body, you can iterate over the list of your Enemy objects to find whose body was that by simply comparing them. Then you can easily get this Enemy object's sprite. Hope I've explained my idea clear enough.

寄离 2024-12-10 08:39:40

阅读后AndEngine 论坛上的帖子,这是我的解决方案:

创建一个新的“UserData”类:

public class UserData implements Serializable {

    private static final long serialVersionUID = 1L;

    String mString;
    Object mObject;

    public UserData(){}

    public UserData(String string, Object object) {
        this.mString = string;
        this.mObject = object;
    }

    public String getString() {
        return mString;
    }

    public Object getObject() {
        return mObject;
    }
}

使用 UserData 类设置所有 body 的 UserData:

body.setUserData(new UserData("enemy", CustomSprite));

然后您可以检测到碰撞和获取你的自定义精灵:

if (((UserData) x1.getBody().getUserData()).getString().equals("enemy") && ((UserData) x2.getBody().getUserData()).getString().equals("bullet")) {
    CustomSprite myEnemySprite = (CustomSprite) ((UserData) x1.getBody().getUserData()).getObject();
    myEnemySprite.die();
}

After read this thread on AndEngine forums, this is my solution:

Create a new "UserData" class:

public class UserData implements Serializable {

    private static final long serialVersionUID = 1L;

    String mString;
    Object mObject;

    public UserData(){}

    public UserData(String string, Object object) {
        this.mString = string;
        this.mObject = object;
    }

    public String getString() {
        return mString;
    }

    public Object getObject() {
        return mObject;
    }
}

Set the UserData of all your bodys with the UserData class:

body.setUserData(new UserData("enemy", CustomSprite));

Then you can detect the collision and get your CustomSprite:

if (((UserData) x1.getBody().getUserData()).getString().equals("enemy") && ((UserData) x2.getBody().getUserData()).getString().equals("bullet")) {
    CustomSprite myEnemySprite = (CustomSprite) ((UserData) x1.getBody().getUserData()).getObject();
    myEnemySprite.die();
}
巴黎夜雨 2024-12-10 08:39:40
enemy.setUserData(new Object[]{"enemy",enemySprite/*,... And other objects as user data if you wish */})

在检查时:

final Object[] x1 = (Object[]) contact.getFixtureA().getBody().getUserData();
final Object[] x2 = (Object[]) contact.getFixtureB().getBody().getUserData();

做某事:

if(x1[0].equals("This is the tag for the enemy"))
x2[1].playerhascollidedwithyouandyouhavetodosomething();
enemy.setUserData(new Object[]{"enemy",enemySprite/*,... And other objects as user data if you wish */})

And while checking:

final Object[] x1 = (Object[]) contact.getFixtureA().getBody().getUserData();
final Object[] x2 = (Object[]) contact.getFixtureB().getBody().getUserData();

Doing something:

if(x1[0].equals("This is the tag for the enemy"))
x2[1].playerhascollidedwithyouandyouhavetodosomething();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文