Я новичок в мире Cocos2D и даже больше в Box2D. Я разрабатываю игру iOS с этими двумя двигателями, и я хочу, чтобы парень (герой) собирал монеты на прокручиваемой карте.Столкновение без физики (Cocos2D + Box2D iOS)
Ну, проблема в том, что «Слушатель контактов». Я не могу понять, что он на самом деле делает, и как я могу использовать его, чтобы сделать разницу между моими монетами и другими телами (все статические тела) вокруг карты. Я установил все монеты .isSensor = true
, чтобы отключить коллизии. Я использую MyContactListener из учебника raywenderlich.com.
Итак, главный вопрос: как узнать, какой тип тела находится в столкновении с телом героя через контакт-слушатель?
(я читал много учебников и вопросов здесь, и я не могу знать, с чего начать)
Спасибо!
Edit:
Si, я, наконец, получил его на работу с sprite.tag, но я не могу уничтожить тела и текстуры. Иногда при использовании [textureB removeFromParentAndCleanup:YES];
я получаю EXC_BAD_ACCESS
. И, как я понял, я не могу уничтожить тело, так как фактически использую его.
Но при попытке использовать body->SetUserData(self);
в моем Hero класса
@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);
}
}
}
Я получаю EXC_BAD_ACCESS при вызове isKindOfClass.
Hero USERDATA
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);
Плитка USERDATA
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);
Почему isKindOfClass не работает для вас? и в какой строке вы получаете исключение? – giorashc
Я отредактировал метод обновления: я получаю исключение, когда вызывается isKindOfClass. – thegameg
Кажется, что данные были выпущены где-то перед тем, как вы его получили. Можете ли вы опубликовать код, в котором вы размещаете данные пользователя тела? используете ли вы ARC в своем проекте? – giorashc