2016年6月2日 星期四

0602 cocos2d-x 座標轉換 convertToNodeSpace convertToWorldSpace

遊戲中經常會用到一些變換:
遊戲中武器和角色在一個layer上,為了效率,會考慮將bullet, effect和 PhysicsParticle分別放到不用的層上,對應的層上使用batchnode來提高效率
武器和PhysicsParticleLauncher(粒子發射器)綁定,發射的時候,會向PhysicsParticleLayer的武器相同的位置上生成一個物理粒子特效

會經常用到convertToNodeSpace和convertToWorldSpace轉換坐標
我們加三個sprite,r0,r1,r2,
r0的父節點是layer, 父節點下坐標(0,0,100,100)
r1的父節點是r0,父節點下坐標(0,0,100,100)
r2的父節點是r1,父節點下坐標(0,0,100,20)

[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. bool HelloWorld::init()  
  2. {  
  3.     //////////////////////////////  
  4.     // 1. super init first  
  5.     if ( !Layer::init() ) {  
  6.         return false;  
  7.     }  
  8.       
  9.     // r0加入到根節點上(Layer) 坐標(0,0)  
  10.     Sprite* r0 = Sprite::create("data/pic/gun.png");  
  11.     r0->setAnchorPoint(Point(0.f, 0.f));  
  12.     this->addChild(r0);  
  13.       
  14.     // r1加入到r0上  
  15.     Sprite* r1 = Sprite::create("data/pic/gun.png");  
  16.     r1->setAnchorPoint(Point(0.f, 0.f));  
  17.     r1->setPosition(Point(100, 0));  
  18.     r0->addChild(r1);  
  19.       
  20.     // r2加入到r1上  
  21.     Sprite* r2 = Sprite::create("data/pic/gun.png");  
  22.     r2->setAnchorPoint(Point(0.f, 0.f));  
  23.     r2->setPosition(Point(100, 20));  
  24.     r1->addChild(r2);  
  25.       
  26. }  
如何將r2的坐標轉換為世界坐標?
如何將r2的坐標轉換為r0的局部坐標?
[cpp] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. // 獲得r2的世界坐標,兩種方法  
  2. // 方法1:以r2坐標係為起點,向根節點(世界坐標)變換,坐標必須為(0,0)  
  3. Point p2world = r2->convertToWorldSpace(Point(0, 0));  
  4.   
  5. // 方法2:以r1坐標係為起點,向根節點(世界坐標)變換,坐標為r2在父節點r1內的坐標  
  6. p2world = r1->convertToWorldSpace(r2->getPosition());  
  7.   
  8. // 獲得r2在r0坐標系中的坐標  
  9. // convertToNodeSpace要傳入的坐標為世界坐標  
  10. Point pt = r0->convertToNodeSpace(p2world);  

沒有留言:

張貼留言

cocos2dx-lua 建立滑鼠監聽

重要關鍵字  EVENT_MOUSE_SCROLL addEventListenerWithSceneGraphPriority      if IsPc() then --建立滑鼠監聽         local listener = cc.EventListenerMouse...