Box2d Cocos2d 中的联系监听器

Posted

技术标签:

【中文标题】Box2d Cocos2d 中的联系监听器【英文标题】:Contact listener in Box2d Cocos2d 【发布时间】:2011-09-04 18:53:44 【问题描述】:

我想在与对象发生碰撞后旋转精灵并向前移动。 碰撞必须使用 Box2d,因为我需要像素完美碰撞。 我有contactlistener的头文件和实现类,但我如何在主类中实现它?

我的联系人监听器 .h 文件是

 #import "Box2D.h"
 #import <vector>
 #import <algorithm>

struct MyContact    
    b2Fixture *fixtureA;   
b2Fixture *fixtureB;   
bool operator==(const MyContact& other) const  
  
    return (fixtureA == other.fixtureA) && (fixtureB == other.fixtureB);  
  
;
class MyContactListener : public b2ContactListener 

public:
std::vector<MyContact>_contacts;

MyContactListener();
~MyContactListener();

virtual void BeginContact(b2Contact* contact);
virtual void EndContact(b2Contact* contact);
virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);    
virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);

;

这是我的联系人监听器 .M 文件

    #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)     
     

在我的主要课程中

contactListner = new MyContactListener;
world->SetContactListener(contactListner);

在此之后如何检查调度程序方法中的冲突?

感谢您的帮助

【问题讨论】:

【参考方案1】:

在您的调度程序方法中,循环访问联系人,检查冲突是否正常:

for(pos = _contactListener->_contacts.begin(); 
        pos != _contactListener->_contacts.end(); ++pos) 
            MyContact contact = *pos;
     if(contact->fixtureA == ball && contact->fixtureB == wall)
        //Do something
     

【讨论】:

pos 应该是使用向量迭代器类型在堆栈上声明的变量。 我想知道 EndContact 函数。如果您能向我解释一下,那就太好了:当联系结束时,联系会从 _contacts 向量中删除。但是,如果联系在调度程序方法中的代码有机会从向量中读取它之前就结束了怎么办? (所以如果联系人的开始和结束都在同一个刻度内)。

以上是关于Box2d Cocos2d 中的联系监听器的主要内容,如果未能解决你的问题,请参考以下文章

带有 box2d 联系人监听器的 cocos2dx 不起作用

克隆一个现有的球体和 box2d cocos2d 中的对象

cocos2d + box2d:向点旋转

单面平台(Box2D/Cocos2D)

Cocos2d / Box2d CCribbon 碰撞检测

重置精灵 - Box2d(Cocos2d)