初次使用cocos2d 3.0 的box2d引擎详解
1.打开在cocos2d-x-3.0beta2\build的cocos2d-win32.vc2012.sln文件,在TestCpp项目
右键->属性->C/C++->Preprocessor(预处理程序)->Preprocessor Definitiions(预处理定义)->三角形按钮->Edit(编辑),出现如图(2)所示,将
“CC_ENABLE_CHIPMUNK_INTEGRATION=1”替换为
“CC_ENABLE_BOX2D_INTEGRATION=1”,图(3)的libExtensions项目也执行同上的操作,那么TestCpp项目运行后的菜单里的Box2dTest就可以运行了!
图(1)
图(2)
图(3)
2.完成上面步骤后,我们用create_project.py创建项目,修改HelloWorldScene.h里的代码,如下:
#include "cocos2d.h"
USING_NS_CC;
class HelloWorld : public cocos2d::Layer
{
public :
Sprite* m_ball;
PhysicsWorld* m_world;
public:
// there's no 'id' in cpp, so we recommend returning the class instance pointer
static cocos2d::Scene* createScene();
void setPhyWorld(PhysicsWorld* _world){m_world=_world;};
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// a selector callback
void menuCloseCallback(Object* pSender);
// implement the "static create()" method manually
CREATE_FUNC(HelloWorld);
};
在HelloWorld.cpp里修改 HelloWorld::createScene()函数:
// 'scene' is an autorelease object
auto scene = Scene::createWithPhysics();
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
// 'layer' is an autorelease object
auto layer = HelloWorld::create();
layer->setPhyWorld(scene->getPhysicsWorld() );
// add layer as a child to scene
scene->addChild(layer);
// return the scene
return scene;
然后,在HelloWorldScene.cpp的init方法中加入下面的代码:
m_ball=Sprite::create("ball.png",Rect(0,0,48,48));
m_ball->setPosition(ccp(400,600));
auto ballBody=PhysicsBody::createCircle(m_ball->getContentSize().width/2);
m_ball->setPhysicsBody(ballBody);
this->addChild(m_ball);
auto edgeSp=Sprite::create();
auto boundBody=PhysicsBody::createEdgeBox(visibleSize,PHYSICSBODY_MATERIAL_DEFAULT,3);
edgeSp->setPosition(ccp(visibleSize.width/2,visibleSize.height/2) );
edgeSp->setPhysicsBody(boundBody);
this->addChild(edgeSp);
edgeSp->setTag(0);
你就可以看到如下图所示一个Sprite由于重力作用下往下坠的动画了,由于设置了DebugDraw,所以会有红色的框框出现, setDebugDrawMask它可将碰撞体的形状、关节等等全部绘制出来,方便我们观察物体及整个场景的可碰撞区域,如不需要时可以去掉:
scene->getPhysicsWorld()->setDebugDrawMask(PhysicsWorld::DEBUGDRAW_ALL);
图(4)
3.如果需要添加libBox2d项目可以
右击解决方案->add(添加)->Existing Item(存在项目)->上一目录-> cocos2d ->external -> Box2D -> proj.win32里找到Box2D.vcxproj,添加这个Box2D项目,之前我是添加了然后编译的,因为想试一下不添加能不能运行,所以remove(移除)了再清除一下,居然也可运行,所以我的结论是不用添加box2d项目也可以正常使用,至于是否是这样有待朋友们证实了。