附件: 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}}