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

pamxy發表於2014-05-25

初次使用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專案也可以正常使用,至於是否是這樣有待朋友們證實了。

相關文章