标签: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);
}
编译运行如下图:
我们成功的将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