码迷,mamicode.com
首页 > 其他好文 > 详细

瘸腿蛤蟆笔记36-cocos2d-x-3.2 Box2d物理引擎Ray-cast使用

时间:2014-08-29 11:09:27      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   使用   io   strong   ar   

瘸腿蛤蟆原创笔记,欢迎转载,转载请标明出处:

 

上篇回顾

本篇名言:人类心灵深处,有许多沉睡的力量;唤醒这些人们从未梦想过的力量,巧妙运用,便能彻底改变一生。[澳瑞森·梅伦]

上几篇中,蛤蟆学习了Box2d物理引擎中如何将我们创建的物理体给描绘在程序里面。让我们能够看到一个非常直观的物体,便于后续进一步学习和理解。

 

具体步骤

我们还是使用helloworld工程。

1、  首先将\cocos2d-x-3.2\tests\cpp-tests\Classes\Box2DTestBed目录中的6个文件GLES-Render.c,GLES-Render.h,RayCast.h, Test.cpp, Test.h,TestEntries.cpp复制到我们自己的所在工厂目录中的classes文件夹中。然后将这6个文件添加到我们自己的工程项目中。

2、  然后我们自己新建一个类,Box2D类。这个是基于Layer类的用于承载物理世界。

3、  然后在HelloWorld.Scene.h头文件中,加入如下

#include "GLES-Render.h"

#include "Test.h"

#include "RayCast.h"

#include "Box2D.h"包含刚才的头文件

 

         3、在bool HelloWorld::init() 函数中加入如下代码,即可

Box2D* view= Box2D::viewWithEntryID();

         addChild(view,0, 2);

         view->setScale(15);

   view->setAnchorPoint( Vec2(0,0));

   view->setPosition( Vec2(origin.x+visibleSize.width/2,origin.y+visibleSize.height/3) );

4、   编辑Test.h头文件中,

找到类定义中的protected:增加

friend class Box2D;

 

5、   编辑TestEntries.cpp

只留下如下,即可。

#include <cstring>

using namespace std;

#include "Test.h"

#include "RayCast.h"

TestEntryg_testEntries[] =

{

         {"Ray-Cast", RayCast::Create},

};

int g_totalEntries = sizeof(g_testEntries) / sizeof(g_testEntries[0]);

 

6、   编辑Box2D.h 文件

如下:

#pragma once

#include "cocos2d.h"

#include "GLES-Render.h"

#include "Test.h"

#include "RayCast.h"

USING_NS_CC;

class Test;

class Box2D :

         public Layer

{

public:

         static Box2D*viewWithEntryID();

         bool Box2D::initWithEntryID();

         Box2D(void);

         ~Box2D(void);

         RayCast* raycast;

         Test* m_test;

         Settings settings;

         TestEntry*    m_entry;

         GLESDebugDraw *m_debugDraw; //这里新建示例

         b2World* world;

         virtual void draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) override;

protected:

         CustomCommand _customCmd;

         void Box2D::onDraw(const Mat4&transform, uint32_tflags);

};

7、   编辑Box2D.cpp 文件

如下:

#include "Box2D.h"

 

Box2D::Box2D(void)

{

}

Box2D::~Box2D(void)

{

}

Box2D* Box2D::viewWithEntryID()

{

          Box2D*pView = new Box2D();

   pView->initWithEntryID();

   pView->autorelease();

 

    return pView;

}

bool Box2D::initWithEntryID()

{

         m_entry= g_testEntries;

    m_test =m_entry->createFcn();

         return true;

}

 

void Box2D::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags)

{

    Layer::draw(renderer, transform, flags);

         _customCmd.init(_globalZOrder);

   _customCmd.func = CC_CALLBACK_0(Box2D::onDraw, this, transform, flags);

    renderer->addCommand(&_customCmd);

 

}

void Box2D::onDraw(const Mat4 &transform, uint32_t flags)

{

    Director* director = Director::getInstance();

    CCASSERT(nullptr !=director, "Director is null when seting matrixstack");

   director->pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

   director->loadMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW, transform);

   GL::enableVertexAttribs( cocos2d::GL::VERTEX_ATTRIB_FLAG_POSITION );

   m_test->Step(&settings);

   m_test->m_world->DrawDebugData();

    CHECK_GL_ERROR_DEBUG();

   

   director->popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);

}

         编译运行如下图:

bubuko.com,布布扣

         我们成功的将RayCast测试用例从源码中移植出来了,是不是很好玩?

至于原理的知识,蛤蟆后续学习之。

 

总结

         接下去蛤蟆会学习Box2d物理引擎中Box2dTextBed的架构,这样小伙伴们自己就可以在代码中穿梭了。

瘸腿蛤蟆笔记36-cocos2d-x-3.2 Box2d物理引擎Ray-cast使用

标签:style   blog   http   color   os   使用   io   strong   ar   

原文地址:http://blog.csdn.net/notbaron/article/details/38908925

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!