Box2d Cocos2d ContactListener检测碰撞

时间:2013-05-06 11:02:05

标签: cocos2d-iphone box2d collision

我的问题非常简单,但我无法修复它。

我有一个旋转的雷达,我有一个正在移动的操纵杆

嗯,我只想检测雷达和玩家之间的碰撞。当两者都在移动但是在雷达移动并且我的播放器不是时它不能正常工作。

这里有代码来检测它以及它是如何工作的:

//moves radar
    [self schedule:@selector(loopRadar) interval: 12];

//moves player with joystick
    body->SetLinearVelocity(b2Vec2(scaledVelocity.x*dt, scaledVelocity.y*dt));
    actor.position = ccp(body->GetPosition().x * PTM_RATIO,
                         body->GetPosition().y * PTM_RATIO);

// DETECTS COLLISION BETWEEN RADAR AND PLAYER
    std::vector<MyContact>::iterator pos;
    for(pos = _contactListener->_contacts.begin();
        pos != _contactListener->_contacts.end(); ++pos) {
        MyContact contact = *pos;



        if ((contact.fixtureA == radarBody->GetFixtureList() && contact.fixtureB == body->GetFixtureList()) ||
            (contact.fixtureA == body->GetFixtureList() && contact.fixtureB == radarBody->GetFixtureList())) {

            //DO SOMETHING LIKE GAME OVER



        }

    }
//ENDS COLLISION

MycontactListener类:

#import "MyContactListener.h"

MyContactListener::MyContactListener() : _contacts() {
 }

 MyContactListener::~MyContactListener() {
 }

void MyContactListener::BeginContact(b2Contact* contact) {
// We need to copy out the data because the b2Contact passed in
// is reused.
MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
_contacts.push_back(myContact);
}

void MyContactListener::EndContact(b2Contact* contact) {
MyContact myContact = { contact->GetFixtureA(), contact->GetFixtureB() };
std::vector<MyContact>::iterator pos;
pos = std::find(_contacts.begin(), _contacts.end(), myContact);
if (pos != _contacts.end()) {
    _contacts.erase(pos);
}
}

void MyContactListener::PreSolve(b2Contact* contact,
                             const b2Manifold* oldManifold) {
}

void MyContactListener::PostSolve(b2Contact* contact,
                              const b2ContactImpulse* impulse) {
}

所以,问题在于,当雷达通过玩家并且玩家没有移动时,它不会检测到碰撞,但是当两者都在移动时它会完美地运行。

任何提示? 非常感谢你!

1 个答案:

答案 0 :(得分:0)

工作添加这些行作为“LearnCocos2D”说,设置两个身体唤醒

    body->SetAwake(TRUE);
    radarBody->SetAwake(TRUE);

非常感谢!