我一直在寻找一个基于 OBJ-C 的教程,关于如何在特定 b2body 与其他东西(不是所有东西)碰撞时调用方法。
基本上,每秒有一个方块掉到地上。这很好用,但是当它撞到地面或玩家时,应该删除块并且应该产生它的碎片(不同的对象)。
谁能告诉我该怎么做?
任何帮助都会很热
谢谢
我一直在寻找一个基于 OBJ-C 的教程,关于如何在特定 b2body 与其他东西(不是所有东西)碰撞时调用方法。
基本上,每秒有一个方块掉到地上。这很好用,但是当它撞到地面或玩家时,应该删除块并且应该产生它的碎片(不同的对象)。
谁能告诉我该怎么做?
任何帮助都会很热
谢谢
我认为这是您需要的..您需要包括 MycontactListener
-(void) checkForHit{
std::vector<b2Body *>toDestroy;
std::vector<MyContact>::iterator pos;
for(pos = _contactListener->_contacts.begin(); pos != _contactListener->_contacts.end(); ++pos) {
MyContact contact = *pos;
bodyA = contact.fixtureA->GetBody();
bodyB = contact.fixtureB->GetBody();
if (bodyA->GetUserData() != NULL && bodyB->GetUserData() != NULL) {
spriteA = (CCSprite *) bodyA->GetUserData();
spriteB = (CCSprite *) bodyB->GetUserData();
//NSLog(@”sprite tag is %d”,spriteA.tag);
if (spriteA.tag == 50) {
if (std::find(toDestroy.begin(), toDestroy.end(), bodyB) == toDestroy.end()) {
toDestroy.push_back(bodyB);
}
}
std::vector<b2Body *>::iterator pos2;
for(pos2 = toDestroy.begin(); pos2 != toDestroy.end(); ++pos2) {
b2Body *body = *pos2;
if (body->GetUserData() != NULL) {
CCSprite *sprite = (CCSprite *) body->GetUserData();
[self removeChild:sprite cleanup:YES];
}
_world->DestroyBody(body);
}
或者如果您不想使用接触侦听器。您可以为地面主体和您要销毁的主体创建一个夹具,并使用以下代码检查它是否相交并销毁它...
if((contact.fixtureA == groundFixture && contact.fixtureB == bodyFixture) ||
(contact.fixtureA == bodyFixture&& contact.fixtureB == groundFixture ))
{
//destroy the body
}
我已经意识到,当我的物体掉到地上时,我可以通过创建一个起始速度来创建自己的非常简单的物理,然后在更新方法中将它增加一个特定的量。
对于碰撞,我的对象都适合 48pt 宽的网格,所以我可以进行简单的矩形碰撞检测。