如何使用 PhysicsEditor 加快 cocos2dx-Box2D 開發

來源:互聯網
上載者:User

附件: vs2010工程下載

原文連結:http://blog.csdn.net/zhangxaochen/article/details/8018489

看這裡: http://is.gd/VoBVUJ

PhysicsEditor 是一款很好的box2d 形狀產生工具,通過圖形介面,點點滑鼠,產生形狀的plist檔案,然後使用他的api產生fixtures加到需要的body中去。

軟體的:

http://www.codeandweb.com/physicseditor

1. 下載安裝之後,在類似目錄:

D:\Program Files\PhysicsEditor\Examples\Cocos2d-X\Demo 

下有使用例子。不過那是個xcode project,如果像我一樣使用windows+visual studio,那麼你需要建立一個項目,把類似目錄:

D:\Program Files\PhysicsEditor\Examples\Cocos2d-X\Demo\Demo\Classes 

下的 HelloWorldScene.cpp + HelloWorldScene.h 兩個檔案拷出來,替換建立的cocos2d-x 項目【註:不適用於cocos2dx 2.0 以下的版本

2. 在路徑:

D:\Program Files\PhysicsEditor\Examples\Cocos2d-X\Demo\Demo\generic-box2d-plist 下面,有另外兩個需要的檔案:

GB2ShapeCache-x.cpp + GB2ShapeCache-x.h,把他們拷貝到建立的工程的Classes目錄下。 如果希望只保留這一份.h 和 .cpp 檔案,那麼把 對應路徑加到項目的附加元件封裝含目錄,並且把 cpp 檔案的引用加到工程即可。

產生運行程式,點擊螢幕,不斷地在螢幕地區裡增加水果。像這樣:

==========================================================================================

那麼,代碼裡怎麼使用這個 plist 檔案呢?

1. 建構函式 HelloWorld() 裡面:

    // load physics shapes    GB2ShapeCache::sharedGB2ShapeCache()->addShapesWithFile("shapedefs.plist");

(好像大家都很喜歡單例模式。。。)

2. 成員函數 void HelloWorld::addNewSpriteWithCoords(CCPoint p) 裡面:

void HelloWorld::addNewSpriteWithCoords(CCPoint p){    string name = names[rand()%7];        CCSprite *sprite = CCSprite::spriteWithFile((name+".png").c_str());    sprite->setPosition(p);    addChild(sprite);    b2BodyDef bodyDef;bodyDef.type = b2_dynamicBody;    bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);bodyDef.userData = sprite;b2Body *body = world->CreateBody(&bodyDef);        // add the fixture definitions to the body        GB2ShapeCache *sc = GB2ShapeCache::sharedGB2ShapeCache();    sc->addFixturesToBody(body, name.c_str());     sprite->setAnchorPoint(sc->anchorPointForShape(name.c_str()));}

先建立精靈,然後用 b2BodyDef 建立一個 body,這時body其實還沒有形狀。先前的時候我們給body賦予一個fixture是這樣:

b2FixtureDef carShapeDef;carShapeDef.shape=&carShape;carShapeDef.density=10.f;carShapeDef.restitution=0.9f;//carShapeDef.isSensor=true;_carBody->CreateFixture(&carShapeDef);

先建立一個 b2FixtureDef, 給他的shape域一個形狀,然後 xxBody->CreateFixture...

而這次,我們卻用了 GB2ShapeCache:

    GB2ShapeCache *sc = GB2ShapeCache::sharedGB2ShapeCache();    sc->addFixturesToBody(body, name.c_str()); 

注意到範例程式碼裡面還有個 setAnchorPoint  的行為,事實上,box2d 裡面是沒有 anchorPoint 的概念的,這個 sc->anchorPointForShape(name.c_str()) 是 PhysicsEditor 附加的一個標記,因為如果自己使用physicsEditor,預設情況下,產生的座標值是以圖片左下角作為(0,0)計算的,像這樣:


這就相當於 anchorPoint跑到了 (0,0),如果sprite沒有相應的重設anchorPoint的話,就會產生碰撞檢測跟看到的畫面不一致的情況,或者debugDraw也可以直接看到 shape 跟 sprite沒有重合:

當然,也可以在physicsEditor 裡面就把 “anchorPoint” 拖到中央,這樣就不必總是記得設定 sprite的anchorPoint 了。。。

 

原文連結:http://blog.csdn.net/zhangxaochen/article/details/8018489

{{OVER}}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.