1. 程式人生 > >COCOS2DX-遊戲開發之三 座標系

COCOS2DX-遊戲開發之三 座標系

遊戲中經常會用到一些變換:

遊戲中武器和角色在一個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)

  1. bool HelloWorld::init()  
  2. {  
  3.     //////////////////////////////
  4.     // 1. super init first
  5.     if ( !Layer::init() ) {  
  6.         returnfalse;  
  7.     }  
  8.     // r0加入到根節點上(Layer) 座標(0,0)
  9.     Sprite* r0 = Sprite::create("data/pic/gun.png");  
  10.     r0->setAnchorPoint(Point(0.f, 0.f));  
  11.     this->addChild(r0);  
  12.     // r1加入到r0上
  13.     Sprite* r1 = Sprite::create("data/pic/gun.png");  
  14.     r1->setAnchorPoint(Point(0.f, 0.f));  
  15.     r1->setPosition(Point(100, 0));  
  16.     r0->addChild(r1);  
  17.     // r2加入到r1上
  18.     Sprite* r2 = Sprite::create("data/pic/gun.png");  
  19.     r2->setAnchorPoint(Point(0.f, 0.f));  
  20.     r2->setPosition(Point(100, 20));  
  21.     r1->addChild(r2);  
  22. }  

如何將r2的座標轉換為世界座標?

如何將r2的座標轉換為r0的區域性座標?

  1. // 獲得r2的世界座標,兩種方法
  2. // 方法1:以r2座標系為起點,向根節點(世界座標)變換,座標必須為(0,0)
  3. Point p2world = r2->convertToWorldSpace(Point(0, 0));  
  4. // 方法2:以r1座標系為起點,向根節點(世界座標)變換,座標為r2在父節點r1內的座標
  5. p2world = r1->convertToWorldSpace(r2->getPosition());  
  6. // 獲得r2在r0座標系中的座標
  7. // convertToNodeSpace要傳入的座標為世界座標
  8. Point pt = r0->convertToNodeSpace(p2world);  


方法如上:

工作原理詳見cocos2dx程式碼

  1. Point Node::convertToWorldSpace(const Point& nodePoint) const
  2. {  
  3.     kmMat4 tmp = getNodeToWorldTransform();  
  4.     kmVec3 vec3 = {nodePoint.x, nodePoint.y, 0};  
  5.     kmVec3 ret;  
  6.     kmVec3Transform(&ret, &vec3, &tmp);  
  7.     return Point(ret.x, ret.y);  
  8. }  
  9. kmMat4 Node::getNodeToWorldTransform() const
  10. {  
  11.     kmMat4 t = this->getNodeToParentTransform();  
  12.     for (Node *p = _parent; p != nullptr; p = p->getParent())  
  13.         kmMat4Multiply(&t, &p->getNodeToParentTransform(), &t);  
  14.     return t;  
  15. }  


cocos2d-x 座標系詳解:http://www.tairan.com/archives/3367
【cocos2dx遊戲開發】之座標系(一) 點選這裡

相關推薦

COCOS2DX-遊戲開發 座標系

遊戲中經常會用到一些變換: 遊戲中武器和角色在一個layer上,為了效率,會考慮將bullet, effect和 PhysicsParticle分別放到不用的層上,對應的層上使用batchnode來提高效率 武器和PhysicsParticleLauncher(粒子發射器)繫結,發射的時候,會向Phy

COCOS2DX-遊戲開發一】 座標系(下) convertToNodeSpace和convertToWorldSpace

遊戲中經常會用到一些變換: 遊戲中武器和角色在一個layer上,為了效率,會考慮將bullet, effect和 PhysicsParticle分別放到不用的層上,對應的層上使用batchnode來提高效率 武器和PhysicsParticleLauncher(粒子發射器)

COCOS2DX-遊戲開發一】 坐標系(下) convertToNodeSpace和convertToWorldSpace

Language pla col 坐標 particle tis fec 不用 -s 遊戲中常常會用到一些變換: 遊戲中武器和角色在一個layer上,為了效率。會考

COCOS2DX-BOX2D遊戲開發】 讀取tiledmap的tmx阻擋

做一款畫素遊戲專案,需要讀取TMX檔案中的阻擋區域,生成box2d的fixture,來做阻擋  使用cocos2dx版本: 2.2.2 1.在tmx檔案中建立一個"Physics"的層,用來存放編輯器中生成的各種阻擋塊 編輯器中主要有polygone, polyline,

微信小遊戲開發:實現小遊戲的簡易引擎

一、建立引擎目錄 在主目錄下建立名為'lib'的資料夾,存放引擎程式碼 二、建立所有遊戲元素的基類:Node 在'lib'資料夾下建立'node.js'檔案; 一個元素,需要座標去定義位置,長寬來定義範圍,還需要能夠切換顯示狀態,新增子元素和獲取父元素等等 程式碼如下:

【iOS-cocos2d-X 遊戲開發四】Cocos2dX建立Android NDK新專案並編譯匯入Eclipse中正常執行!

站文章均為 李華明Himi 原創,轉載務必在明顯處註明: 轉載自【黑米GameDev街區】 原文連結: http://www.himigame.com/android-game/645.html          ☞ 點選訂閱 ☜ 本部落格最新動態

3D數學基礎圖形與遊戲開發 座標系

3d 遊戲中各種座標系介紹:【3d數學基礎圖形與遊戲開發】 =========== 為什麼要有多種座標系:方便 打個比方:廣場中兩個人a和b,a 向前走就大聲說我向前走了,這時b看到,a在b的左邊,b就說在我左邊的a向東南方向走了~~ 差不多就是這樣,這樣就有兩個座標系,

COCOS2DX-IOS-遊戲開發二一】 最熱血的RPG+RTS塔防遊戲Flesh&Blood-Attack on Orc上線了

我們的新遊戲Flesh&Blood – Attack on Orc  中文名:血肉之軀 正式在AppStore上線了,是一款熱血的塔防RTS遊戲,同時支援iPhone和iPad AppStore下載地址: 目前是收費的,過兩天限免的時候我會第一時間通知大家的. 

COCOS2DX-BOX2D遊戲開發四】 Box2D勻速運動

文章最後,附上自己的勻加速程式碼片段 以勻速移動物體 遊戲中一種常見的需求是讓物體做勻速運動。例如橫屏遊戲中的玩家角色,太空飛船或者汽車,等等。根據遊戲的不同,有時候物體應該逐漸改變速度,其他情況又希望能夠瞬間開始和停止運動。使用SetLinearVelocity方

java遊戲伺服器開發--日誌

        日誌在一個系統中的重要性還是很大的,有時候專案部署到伺服器上,不可能使用斷點除錯的方式,只能從日誌檔案中查詢蛛絲馬跡。 這邊是使用的slf4j。         在pom檔案中新增slf4j <!-- 日誌包 --> <depe

【Cocos2d-x 3.0】遊戲開發android交叉編譯

plain edit 100% b2c 令行 sdk 自己的路 smi bin 作者:Senlern 轉載請註明,原文鏈接:http://blog.csdn.net/zhang429350061/article/details/37959489 在上

Unity遊戲開發“屏幕截圖”

texture apt 項目 一個 art error topn details camera2 下面是我總結的、在u3d中的,三種截屏方法:1、使用Application類下的CaptureScreenshot方法。void CaptureScreen() { Ap

cocos2dx遊戲開發加速度計

在cocos2d-x引擎中 使用了類CCAccelerometer來儲存加速度計的資訊 類CCAccelerometer的作用和使用者操作的分發器類似 區別在於使用者操作的分發器可以擁有很多委託物件 而加速度計只存在一個委託物件 這是因為一個移動裝置只有一個硬體 所以介面進行了簡化 CCAccel

外星人大戰---------遊戲開發

前兩章已經針對於遊戲螢幕以及飛船移動,以及發射子彈有了簡單的設定,現在就開始新增外星人。螢幕邊緣附近新增一個外星人,然後生成一群外星人,外星人向兩邊和下面移動,並刪除被子彈擊中的外星人,最後顯示使用者擁有的飛船數量,用完後結束遊戲。 做專案就是先一步一步構建,然後再研究已有的程式碼看看是否還可以

Unity3D遊戲開發資料持久化PlayerPrefs的使用

1、Unity3D中的資料持久化是以鍵值的形式儲存的,可以看作是一個字典。 2、Unity3D中值是通過鍵名來讀取的,當值不存在時,返回預設值。 目前,在Unity3D中只支援int、string、float三種資料型別的讀取,所以我們可以使用這三種資料型別來儲存簡單的資料。目前Unity3D中用於資料持

unity遊戲開發ULua框架介紹(二)

1.SimpleFramework框架配置檔案 (1)AppConst 檔案    在AppConst.cs檔案中配置了很多專案開發過程中,需要使用到的“公共常量資訊”。指令碼內的常量都有中文備註。所在位置是:Scripts/ConstDefine/AppConst.cs

unity遊戲開發ULua框架介紹(一)

1.基礎介紹 ①ULua 整合開發環境叫做:SimpleFramework,SimpleFramework 分為NGUI 和UGUI兩個版本,區別是NGUI 版本的框架資源中含有NGUI 這個外掛。SimpleFramework 本身不是Unitypackage 格式,而是一個Unity3D的專

遊戲開發_簡單相機跟隨

using System.Collections; using System.Collections.Generic; using UnityEngine; public class CamCamera : MonoBehaviour { //跟隨目標 public Transfo

遊戲開發_⑨都會跳躍程式碼

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Jump : MonoBehaviour { public GameObject gameobjec

遊戲開發角色移動的一些程式碼

淺談個人認知的幾種方法 一:通過Transform元件來移動 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Move : MonoBehaviour {