1. 程式人生 > >【COCOS2DX-遊戲開發之三一】之 座標系(下) convertToNodeSpace和convertToWorldSpace

【COCOS2DX-遊戲開發之三一】之 座標系(下) 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)

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
	if ( !Layer::init() ) {
        return false;
    }
    
    // r0加入到根節點上(Layer) 座標(0,0)
    Sprite* r0 = Sprite::create("data/pic/gun.png");
    r0->setAnchorPoint(Point(0.f, 0.f));
    this->addChild(r0);
    
    // r1加入到r0上
    Sprite* r1 = Sprite::create("data/pic/gun.png");
    r1->setAnchorPoint(Point(0.f, 0.f));
    r1->setPosition(Point(100, 0));
    r0->addChild(r1);
    
    // r2加入到r1上
    Sprite* r2 = Sprite::create("data/pic/gun.png");
    r2->setAnchorPoint(Point(0.f, 0.f));
    r2->setPosition(Point(100, 20));
    r1->addChild(r2);
    
}

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

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

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


方法如上:

工作原理詳見cocos2dx程式碼

Point Node::convertToWorldSpace(const Point& nodePoint) const
{
    kmMat4 tmp = getNodeToWorldTransform();
    kmVec3 vec3 = {nodePoint.x, nodePoint.y, 0};
    kmVec3 ret;
    kmVec3Transform(&ret, &vec3, &tmp);
    return Point(ret.x, ret.y);

}

kmMat4 Node::getNodeToWorldTransform() const
{
    kmMat4 t = this->getNodeToParentTransform();

    for (Node *p = _parent; p != nullptr; p = p->getParent())
        kmMat4Multiply(&t, &p->getNodeToParentTransform(), &t);

    return t;
}


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

相關推薦

COCOS2DX-遊戲開發 座標系() convertToNodeSpaceconvertToWorldSpace

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

COCOS2DX-遊戲開發 坐標系() convertToNodeSpaceconvertToWorldSpace

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

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

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

JMeter4.0學習(SoapUI創建WebService接口模擬服務端以及JMeter測試SOAP協議性能測試腳本開發

test 點擊 下一步 download enc text div 接口模擬 wid 目錄: 創建WebService接口模擬服務端 下載SoapUI 新建MathUtil.wsdl文件 創建一個SOAP項目 接口模擬服務端配置以及啟動 【闡

Visual C++遊戲開發五十 淺墨DirectX教程十九 網格模型進階

                最近幾個星期,不停地收到大家的評論和郵件,大家都說希望淺墨早點講骨骼動畫。本來按淺墨擬定的寫作計劃是把骨骼動畫放到很後面,因為骨骼動畫知識需要前面的網格模型知識為基礎,知識量本身有些大,很可能要佔很多次更新的篇幅。但是看到大家一致的評論,都說非常期待骨骼動畫。那就好吧,我們就來

Unity3D遊戲開發學習筆記(七)上帝眼—第人稱攝像機的簡單實現(跟隨視角,自由視角)

陸陸續續又開始更新自己的部落格,看來自我驅動能力還是不夠啊= =,廢話不多說了,之前的內容大概說了一下Unity的一些基礎知識,接下來我們將要對一些基本功能做一些學習。大家都知道,一個遊戲,少不了攝像機的參與(這不是廢話麼!沒攝像機怎麼玩!畫面都不呈現了好伐!)

Unity遊戲開發AssetBundle雜記--AssetBundle的二

比較 streaming 指定 但是 chunk 加載 公司 prefab 方法 一、簡介   馬三在公司大部分時間做的都是遊戲業務邏輯和編輯器工具等相關工作,因此對Unity AssetBundle這塊的知識點並不是很熟悉,自己也是有打算想了解並熟悉一下AssetBun

Unity遊戲開發toluawrap文件的原理與使用

nop 微信 attr hiera n) 接下來 system 作者 prim   本文內容轉載自:https://www.cnblogs.com/blueberryzzz/p/9672342.html 。非常感謝原作者慷慨地授權轉載,比心!@blueberryzzz

Unity遊戲開發toluawrap檔案的原理與使用

    本文內容轉載自:https://www.cnblogs.com/blueberryzzz/p/9672342.html 。非常感謝原作者慷慨地授權轉載,比心!@blueberryzzz 是位大神,歡迎大家關注他的部落格。馬三對原文的排版與結構做了微調,以便更合適閱讀。

UNITY3D 遊戲開發C# 中的委託、事件、匿名函式、Lambda 表示式

"委託是一個類,它定義了方法的型別,使得可以將方法當作另一個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用If-Else(Switch)語句,同時使得程式具有更好的可擴充套件性。" from: http://www.himigame.com/

IOS遊戲開發IPA破解原理

IPHONE,ITOUCH和IPAD 需要安裝蘋果的IPA軟體,我們向AppStore釋出IPA軟體的時候蘋果會給我們的IPA軟體添加簽名認證 Appstore上的應用都採用了DRM(digitalrights management)數字版權加密保護技術,直接的表現是A帳號

COCOS2DX-遊戲開發 座標系

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

Android遊戲開發十七讓玩家自定義手勢玩轉Android遊戲!—Android Gesture輸入法手勢技術

原創,轉載務必在明顯處註明:轉載自 原文連結: http://www.himigame.com/android-game/340.html很多童鞋說我的程式碼執行後,點選home或者back後會程式異常,如果你也這樣遇到過,那麼你肯定沒有仔細讀完Himi的博文,第十九篇Him

No11Cocos2dx遊戲開發工程師[更新完畢-共享完畢]

Cocos2d-JS v3新特性教程 1 Cocos2d-JS v3簡單新特性概述 2 Cocos2d-JS v3工作流 3 Cocos2d-JS v3物件 4 Cocos2d-JS v3事件管理器 5 Cocos2d-JS v3物件緩衝池 6 Cocos2d-JS v3

VC++遊戲開發#五2D篇 —— 遊戲二:看看你能堅持多少秒

我的郵箱:[email protected]    歡迎大家和我交流程式設計心得前段時間在網上看見了一個小遊戲——看看你能堅持多少秒——考你的敏捷性,我玩了幾次,然後居然超過了18秒事後,我用MFC模擬了該遊戲中方塊"撞牆反彈"的效果——撞牆反彈效果今天呢,我就繼續

Unity3D遊戲開發學習筆記(六)上帝手—GameObject的操作

在Unity中,所有實體都屬於遊戲物件(GameObject),比如外部匯入到場景中的模型,Unity自帶的立方體等等,而要將這些GameOject進行管理,互動等操作,則需要用到指令碼來實現,上一節我們已經學習瞭如何建立一個指令碼並繫結到一個物體上,現在我們將

UNITY3D 遊戲開發Google-protobuf與FlatBuffers資料的序列化反序列化

★protobuf有啥缺陷?前幾天剛剛在“光環效應 ”的帖子裡強調了“要同時評估優點和缺點”。所以俺最後再來批判一下這玩意兒的缺點。◇應用 不夠廣由於protobuf剛公佈沒多久,相比XML而言,protobuf還屬於初出茅廬。因此,在知名度、應用廣度等方面都遠不如XML。由於這個原因,假如你設計的系統需要提

Android遊戲開發二十物理遊戲重力系統開發,讓你的遊戲變得有質有量!

原創,轉載務必在明顯處註明:    今天群裡一哥哥說急需關於物理遊戲方面的資料,so~下午就隨手寫了一個簡單的圓形自由落體Demo,正好一起分享給大家學習下吧;    先大概說一下,之前的文章中,給大家介紹過重力感測器,那麼和今天要說的重力系統,其實是一樣的!    在重力感

Android遊戲開發十六Android Gesture觸控式螢幕手勢識別操作!利用觸控式螢幕手勢實現一個簡單切換圖片的功能!

原創,轉載務必在明顯處註明:很多童鞋說我的程式碼執行後,點選home或者back後會程式異常,如果你也這樣遇到過,那麼你肯定沒有仔細讀完Himi的博文,第十九篇Himi專門寫了關於這些錯誤的原因和解決方法,這裡我在部落格都補充說明下,省的童鞋們總疑惑這一塊;請點選下面聯絡進入

UNITY3D 遊戲開發Google-protobuf與FlatBuffers資料的序列化反序列化

 關於Protobuf 通過本文的轉載和分享的相關連結,足夠了解使用了,所以這裡不贅述了。但是這裡Himi順便提一下“FlatBuffers” ,它是 Protocol Buffers升級版,其主要區別在於FlatBuffers在訪問資料前不需要解析/拆包這一步。