为什么Android中的碰撞行为与iOS中的行为不同?

时间:2015-08-11 13:55:50

标签: android ios cocos2d-x box2d

我使用Box2D独立于我的精灵来模拟物理世界,并根据b2body的位置更新我精灵的位置。

我有一个由两个灯具组成的播放器。一个夹具不是传感器,可以与地面接触。另一个夹具是一个传感器,用于检查与吃力食品等接触的接触。

。我有一些身体(食物,力量),其中夹具由一个可以与玩家传感器接触的传感器组成。

在iOS中一切正常 - 当玩家与通电/可食用物发生碰撞时,他继续跑步,好像什么都没有错。但是在Android中他反弹了。

可能是什么问题?物理编辑器生成的plist文件对于两者都是相同的。为什么模拟会有所不同? Box2d是cocos2d的一部分,因此库是相同的,两者都应该相同。

我正在使用cocos2d-x 3.7。

编辑:我使用以下内容:

ContactListener.h类:

class ContactListener : public b2ContactListener {

public:


    void BeginContact(b2Contact* contact) {
        void* bodyUserDataA = contact->GetFixtureA()->GetBody()->GetUserData();
        if (bodyUserDataA) {

        }
    }

    void EndContact(b2Contact* contact) {

    }
};

我的ContactListener.cpp为空。

Xcode会自动处理正确构建的所有内容以及正常工作"。在Android上,我不得不在Application.mk中指定我的cpp文件,所以我想知道这是否会导致一些不同的行为,因为我没有在任何地方指定.h文件。

1 个答案:

答案 0 :(得分:0)

这是由于PhysicsEditor文件提供的GB2ShapeCache.cpp中的错误。虽然isSensor的布尔检查适用于iOS / OS X,但在Android中它不能按预期工作并将其设置为false而不是true。

修复:

#if CC_TARGET_PLATFORM == CC_PLATFORM_IOS
            basicData.isSensor = (bool)static_cast<CCString *>(fixtureData->objectForKey("isSensor"))->intValue();
#else
            CCString *foo = static_cast<CCString *>(fixtureData->objectForKey("isSensor"));
            const char *s = foo->getCString();
            if (s==NULL) {
                basicData.isSensor = false;
            }else{
                std::string str(s);
                if (str=="true") {
                    basicData.isSensor = true;
                }else{
                    basicData.isSensor = false;
                }
            }
#endif