初次使用cocos2d 3.0 的box2d引擎详解

来源:互联网 发布:衡水星河网络 编辑:程序博客网 时间:2024/04/29 20:45

初次使用cocos2d 3.0 box2d引擎详解

1.打开在cocos2d-x-3.0beta2\buildcocos2d-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.cppinit方法中加入下面的代码:

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项目也可以正常使用,至于是否是这样有待朋友们证实了。

0 0
原创粉丝点击