我是 Cocos2D 世界的初学者,更是 Box2D 的初学者。我正在使用这两个引擎开发一个 iOS 游戏,我想要的是让一个人(英雄)在滚动地图中捡起硬币。
好吧,问题是“联系侦听器”。我似乎无法理解它的真正作用,以及如何使用它来区分我的硬币和地图周围的其他物体(都是静态物体)。我设置了所有硬币.isSensor = true
以禁用碰撞。我正在使用来自raywenderlich.com教程的 MyContactListener。
所以,主要的问题是:如何通过接触监听器知道是什么类型的身体与英雄的身体发生碰撞?
(我在这里阅读了很多教程和问题,我似乎不知道从哪里开始)
谢谢!
编辑:
Si,我终于让它与 sprite.tag 一起工作,但我无法破坏身体和纹理。有时在使用时[textureB removeFromParentAndCleanup:YES];
我会得到EXC_BAD_ACCESS
. 据我了解,我不能破坏身体,因为我实际上是在使用它。
但是当试图body->SetUserData(self);
在我的英雄类中使用时
@interface Hero : CCNode {
CCSprite * texture;
CGPoint position;
b2Body* body;
TypeCase type;
}
我进入EXC_BAD_ACCESS
我的更新方法:
for(b2Body *b = world_->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
if ([b->GetUserData() isKindOfClass:[Hero class]])
{
Hero* hero = (Hero*)b->GetUserData();
CCSprite *heroSprite = hero.texture;
heroSprite.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
}
else if ([b->GetUserData() isKindOfClass:[Tile class]])
{
Tile* tile = (Tile*)b->GetUserData();
CCSprite *tileSprite = tile.texture;
tileSprite.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
}
}
}
我在调用 isKindOfClass 时得到 EXC_BAD_ACCESS。
英雄用户数据
b2BodyDef heroBodyDef;
heroBodyDef.fixedRotation = true;
heroBodyDef.type = b2_dynamicBody;
heroBodyDef.position.Set(position.x/PTM_RATIO, position.y/PTM_RATIO);
body = world_->CreateBody(&heroBodyDef);
body->SetUserData(self);
平铺用户数据
b2BodyDef blockBodyDef;
blockBodyDef.type = b2_staticBody;
blockBodyDef.position.Set(position.x/PTM_RATIO, position.y/PTM_RATIO);
blockBodyDef.userData = self;
b2Body *body = world ->CreateBody(&blockBodyDef);