实例介绍Cocos2d-x中Box2D物理引擎:碰撞检测

  次阅读 作者:智能小宝 来源:互联网 2015-09-27 15:55 我要评论(0)

在Box2D中碰撞事件通过实现b2ContactListener类函数实现,b2ContactListener是Box2D提供的抽象类,它的抽象函数:

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)。持续接触时响应,调用完preSolve后调用。

下面通过将12.2.3一节的实例采用Box2D技术重构,了解一下Box2d物理引擎中如何检测碰撞。

首先我们需要在工程中添加一个新类。使用Visual Studio 2012中添加一个新类,需要分别添加C++源文件和头文件。具体操作,如图所示,右键点击工程HelloBox2D下的Classes文件夹,在右键菜单中选择,“添加”→ “新项目”。弹出如后面的图所示添加新项对话框,我们在对话框中选择文件的种类,在“名称”中输入文件名ContactListener,然后点击“添加”按钮添加文件。

Visual Studio 2012中添加新类添加新项对话框添加完成新类ContactListener,我们还需要修改它的代码,ContactListener.h文件代码如下:#include cocos2d.h

#include Box2D/Box2D.h

USING_NS_CC;

class ContactListener : public b2ContactListener

{

private:

//两个物体开始接触时会响应

virtual void BeginContact(b2Contact* contact);

//持续接触时响应

virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold);

//持续接触时响应,调用完preSolve后调用

virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse);

//分离时响应

virtual void EndContact(b2Contact* contact);

};

在头文件中需要引入cocos2d.h和Box2D/Box2D.h头文件,否则会有编译错误。ContactListener采用共有继承b2ContactListener。

ContactListener.cpp文件代码如下:

#include ContactListener.h

void ContactListener::BeginContact(b2Contact* contact)①

{

log(BeginContact);

b2Body* bodyA = contact->GetFixtureA()->GetBody();②

b2Body* bodyB = contact->GetFixtureB()->GetBody();③

auto spriteA = (Sprite*)bodyA->GetUserData();④

auto spriteB = (Sprite*)bodyB->GetUserData();⑤

if (spriteA != nullptr && spriteB != nullptr)⑥

{

spriteA->setColor(Color3B::YELLOW);

spriteB->setColor(Color3B::YELLOW);

}

}

void ContactListener::EndContact(b2Contact* contact)⑦

{

log(EndContact);

b2Body* bodyA = contact->GetFixtureA()->GetBody();

b2Body* bodyB = contact->GetFixtureB()->GetBody();

auto spriteA = (Sprite*)bodyA->GetUserData();

auto spriteB = (Sprite*)bodyB->GetUserData();

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...