本篇文章繼續介紹cocos2D-x 2.1的新特性:CCPhysicsSprite 和CCPhysicsDebugNode,從名稱上就可以看出來這兩個類是和物理引擎相關的類,和之前介紹的CCDrawNode一樣,CCPhysicsSprite 沒有提供新功能,而是對之前功能的一個封裝。
CCPhysicsSprite 定義一個物理類繫結的精靈,它繼承自CCSprite精靈類,它的使用來看一下TestCpp專案,CCPhysicsSprite 支援目前cocos2D-x中的box2D和chipmunk兩個物理引擎,但是你只能使用定義預編譯的巨集變數CC_ENABLE_CHIPMUNK_INTEGRATION 或CC_ENABLE_CHIPMUNK_INTEGRATION中的一個來使用box2D或chipmunk其中的一個,你可以通過兩種方式來設定CC_ENABLE_CHIPMUNK_INTEGRATION 或CC_ENABLE_CHIPMUNK_INTEGRATION的值,一種是在xcode的building setting中設定,如圖所示
另一種是在Config.h檔案中設定,如圖所示
對於TestCpp這個專案,這裡需要說一句就是把引擎變成box2D後編譯專案會報錯,是因為沒有對ChipmunkTest專案加入預編譯的判斷,對於該部分,我做了修改,下載地址:http://download.csdn.net/detail/bill_man/5012842
回到正題,介紹CCPhysicsSprite 和CCPhysicsDebugNode的使用,CCPhysicsSprite 只需要按照CCSprite的方法定義,然後將之前按照Chipmunk方式定義的body設定給精靈就可以了,程式碼如下:
CCPhysicsSprite *sprite = CCPhysicsSprite::createWithTexture(m_pSpriteTexture, CCRectMake(posx, posy, 85, 121));
parent->addChild(sprite);
sprite->setBody(body);
sprite->setPosition(pos);
可以開啟2.1 之前的版本的相同位置的檔案(名稱可能不同),可以看到當時我們要自己定義一個精靈類並且完成座標的對應,有了CCPhysicsSprite之後就會更方便的使用。
CCPhysicsDebugNode是為了更方便debug的類,將它設定為顯示之後,在場景內定義的精靈的碰撞形狀塊就顯示出來了,如圖所示
在這個例子中,點選Toggle debug就可以切換CCPhysicsDebugNode的顯示和隱藏,定義CCPhysicsDebugNode的程式碼如下:
m_pDebugLayer = CCPhysicsDebugNode::create(m_pSpace);
this->addChild(m_pDebugLayer, Z_PHYSICS_DEBUG);
傳入的引數是cpSpaceNew類例項,預設建立的一個CCPhysicsDebugNode是顯示的,可以通過setVisible函式來控制它的顯示與隱藏,需要說明的是CCPhysicsDebugNode目前只支援Chipmunk。
CCPhysicsSprite在Box2D中的使用和Chipmunk類似(在TestCpp中的Box2DTest中),只是多了一個函式需要設定,就是PTMRatio,即“cocos2D-x中的畫素到box2D中的meters單位的轉換比率”
CCPhysicsSprite *sprite = CCPhysicsSprite::createWithTexture(m_pSpriteTexture,CCRectMake(32 * idx,32 * idy,32,32));
parent->addChild(sprite);
sprite->setBody(body);
sprite->setPTMRatio(PTM_RATIO);
sprite->setPosition( ccp( p.x, p.y) );
在Box2DTest中還保留著之前為了使用box2D而定義的精靈類的程式碼,可以對比一下現在的使用,確實是方便很多了
對於CCPhysicsSprite的使用,有一些限制:
1)Scale 和Skew屬性是忽略的,也就是說setScale或者setSkew後碰撞的形狀塊大小等不會改變。
2)Position 和rotation屬性是有效的,如果你手動設定Position 和rotation,負責控制碰撞的形狀塊的位置和旋轉角度會改變。
3)一個專案中同時只能支援Chipmunk和Box2D中的一個
如有錯誤,請多多指教,歡迎大牛拍磚