首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

Cocos2d-x Box2d札记:碰撞检测 自定义contactListener

2014-06-03 
Cocos2d-x Box2d笔记:碰撞检测 自定义contactListener这里用一个弹跳乒乓作为例子: 先上我的自定义监听类#

Cocos2d-x Box2d笔记:碰撞检测 自定义contactListener

这里用一个弹跳乒乓作为例子:

Cocos2d-x Box2d札记:碰撞检测 自定义contactListener

 

先上我的自定义监听类

#include "Box2D/Box2D.h"#include "cocos2d.h"#include <list>using namespace std;class MyContact{public :b2Fixture *fixtureA,*fixtureB;bool operator==(const MyContact& other) const{return (fixtureA == other.fixtureA) && (fixtureB == other.fixtureB);}};class MyContactListener:public b2ContactListener{virtual void BeginContact(b2Contact* contact) { if(contact){MyContact mc;mc.fixtureA=contact->GetFixtureA();mc.fixtureB=contact->GetFixtureB();contactList.push_back(mc);}B2_NOT_USED(contact); }/// Called when two fixtures cease to touch.virtual void EndContact(b2Contact* contact) { MyContact mc;mc.fixtureA=contact->GetFixtureA();mc.fixtureB=contact->GetFixtureB();list<MyContact>::iterator pos;pos = find(contactList.begin(),contactList.end(),mc);if(pos!=contactList.end()){contactList.erase(pos);}B2_NOT_USED(contact); }virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold){B2_NOT_USED(contact);B2_NOT_USED(oldManifold);}virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse){B2_NOT_USED(contact);B2_NOT_USED(impulse);}public:list<MyContact> contactList;};

作用是存储发生碰撞的夹具,在后面的逻辑中才容易处理

//contactcontactListener=new MyContactListener();world->SetContactListener(contactListener);


 

这里在init()里面初始化;

然后在update里面实行逻辑

std::list<MyContact>::iterator pos;std::list<b2Body *> toDestroy;for(pos=contactListener->contactList.begin();pos!=contactListener->contactList.end();pos++){MyContact &contact=*pos;if((contact.fixtureA==bottomFixture&&contact.fixtureB==ballFixture)||(contact.fixtureB==bottomFixture&&contact.fixtureA==ballFixture)){CCLOG("hit");}b2Body *bodyA=contact.fixtureA->GetBody(),*bodyB=contact.fixtureB->GetBody();for(int i=0;i<4;i++){if(contact.fixtureA==blockFixture[i]&&contact.fixtureB==ballFixture){toDestroy.push_back(bodyA);CCLOG("ok");} else if(contact.fixtureB==blockFixture[i]&&contact.fixtureA==ballFixture){CCLOG("ok");toDestroy.push_back(bodyB);}}}std::list<b2Body*>::iterator it = toDestroy.begin();while(it != toDestroy.end()){world->DestroyBody(*it);it++;}


 

热点排行