为什么 Android 中的碰撞行为与 iOS 中的不同?
Why do collisions behave differently in Android than in iOS?
我正在使用 Box2D 独立于我的精灵来模拟物理世界,我根据 b2body 的位置更新我的精灵的位置。
我有一个由两个固定装置组成的播放器。一个固定装置不是传感器,可以与地面接触。另一个固定装置是一个传感器,用于检查与通电食物等物品的接触。
。我有一些身体(食物、力量),其中固定装置由一个可以与玩家传感器接触的传感器组成。
在 iOS 中一切正常 - 当玩家与 powerup / eatable 发生碰撞时,他继续 运行 好像没有任何问题。但在 Android 中,他从通电中反弹。
可能是什么问题?物理编辑器生成的 plist 文件对于两者都是相同的。为什么模拟应该不同? Box2d 是 cocos2d 的一部分,因此库是相同的,两者应该相同。
我正在使用 cocos2d-x 3.7.
编辑:我使用以下内容:
ContactListener.h class:
class ContactListener : public b2ContactListener {
public:
void BeginContact(b2Contact* contact) {
void* bodyUserDataA = contact->GetFixtureA()->GetBody()->GetUserData();
if (bodyUserDataA) {
}
}
void EndContact(b2Contact* contact) {
}
};
我的ContactListener.cpp是空的。
Xcode 自动处理正确构建所有内容和事物 "just work"。在 Android 上,我必须在 Application.mk 中指定我的 cpp 文件,所以我想知道这是否会导致一些不同的行为,因为我没有在任何地方指定 .h 文件。
这是由于 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
我正在使用 Box2D 独立于我的精灵来模拟物理世界,我根据 b2body 的位置更新我的精灵的位置。
我有一个由两个固定装置组成的播放器。一个固定装置不是传感器,可以与地面接触。另一个固定装置是一个传感器,用于检查与通电食物等物品的接触。
。我有一些身体(食物、力量),其中固定装置由一个可以与玩家传感器接触的传感器组成。
在 iOS 中一切正常 - 当玩家与 powerup / eatable 发生碰撞时,他继续 运行 好像没有任何问题。但在 Android 中,他从通电中反弹。
可能是什么问题?物理编辑器生成的 plist 文件对于两者都是相同的。为什么模拟应该不同? Box2d 是 cocos2d 的一部分,因此库是相同的,两者应该相同。
我正在使用 cocos2d-x 3.7.
编辑:我使用以下内容:
ContactListener.h class:
class ContactListener : public b2ContactListener {
public:
void BeginContact(b2Contact* contact) {
void* bodyUserDataA = contact->GetFixtureA()->GetBody()->GetUserData();
if (bodyUserDataA) {
}
}
void EndContact(b2Contact* contact) {
}
};
我的ContactListener.cpp是空的。
Xcode 自动处理正确构建所有内容和事物 "just work"。在 Android 上,我必须在 Application.mk 中指定我的 cpp 文件,所以我想知道这是否会导致一些不同的行为,因为我没有在任何地方指定 .h 文件。
这是由于 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