Cocos2d-X的UI樹(1)

原文地址:


http://www.geekfaner.com/cocos2d-x/ReadCocos2dxSourceCode5.html


課程概述

“Cocos2d-X的UI樹(1)”課程概述

課程概述

“Cocos2d-X的UI樹(1)”課程概述

    遊戲是由UI構成的,每個UI元素最主要的屬性就是位置和樣式,本節課講從Cocos2d-X源碼角度介紹如何確定一個UI元素的位置

UI元素


Node


    UI元素是指sprite、label、layer、scene等基本上所有常見的元素,繼承自Node類,Node類的主要作用是提供:設置UI元素的位置、根據座標系對UI元素進行座標計算、確定UI元素的深度值、設置UI元素的縮放因子、得到UI元素的尺寸、設置UI元素的可見性/運行狀態/事件監聽器/動作/調度器/顏色/Camera、繪製UI元素、對子UI元素進行操作、操作與父UI元素的關係、獲取UI元素的scene/碰撞矩陣繪製元素、查詢OpenGL ES狀態、操作用戶數據等通用函數。


位置


    UI元素的位置是通過3個因素確定的。1是確定UI元素的錨點,錨點的意義在於:設置UI位置的時候,通過將錨點放在父UI元素座標系的某個點上;2是確定UI元素的父UI元素是誰;3是確定將UI元素的錨點放在父UI元素的那個點。確定了這三個因素後,UI元素的位置在開發者角度就基本確定了。如果父UI、祖父UI(如果有的話)等,在layer上的位置已經確定,那麼UI元素的位置就算是確定了。

Node的setAnchorPoint用於設置Node的錨點位於Node本地座標系的位置,傳入參數爲位置座標的歸一化座標。tAnchorPoint與setAnchorPoint相對應

Node的getAnchorPointInPoints得到Node的錨點在Node本地座標系的非歸一化位置。

Node的setPosition用於設置Node的錨點在其父UI元素的本地座標系中的位置,傳入參數爲位置座標。getPosition與setPosition相對應

Node的setNormalizedPosition用於設置Node的錨點在其父UI元素的本地座標系中的歸一化位置,傳入參數爲位置座標的歸一化座標。getNormalizedPosition與setNormalizedPosition相對應

Node的setPosition3D除了設置位置的x和y值,還設置了一個_positionZ和_globalZOrder,_globalZOrder用於排序和給事件分發器提供位置信息使用。getPosition3D與setPosition3D相對應

Node的ignoreAnchorPointForPosition是一個內部函數,只能用於scene和layer,作用是在設置scene和layer的位置的時候,錨點按照(0,0)來設置。其他類如果使用該函數會報錯


座標系


    Cocos2d-X擁有一個世界座標系,世界座標系等同於OpenGL ES座標系;然而開發者接觸的基本都是本地座標系,每個父UI元素都有一個自己的本地座標系,子UI設置座標的時候都是相對父UI的座標系進行設置。

    Node的getNodeToParentTransform用於獲取一個Mat4的矩陣,該矩陣可以用於將Node的本地座標系中的座標,轉換到父UI元素的座標系中。比如Node的錨點爲(0.5, 0.5),將Node的position設置爲(100, 100),假如Node的contentsize爲(50, 50),那麼在Node本地座標系(0, 0)的點,其實是其父UI元素座標系中的(100-50*0.5, 100-50*0.5)=(75, 75)。setNodeToParentTransform與getNodeToParentTransform。getNodeToParentAffineTransform類似getNodeToParentTransform,區別在於getNodeToParentTransform得到的是Mat4的矩陣,getNodeToParentAffineTransform得到的是仿射變換,在有限維的情況,每個仿射變換可以由一個矩陣A和一個向量b組成。

   Node的getParentToNodeTransform用於獲取一個Mat4的矩陣,該矩陣可以用於父UI元素的座標系中的座標,轉變爲Node的本地座標系中的座標。getParentToNodeAffineTransform得到的是仿射變換。

   Node的getNodeToWorldTransform用於獲取一個Mat4的矩陣,該矩陣可以用於將Node的本地座標系中的座標,轉換到世界座標系中。getNodeToWorldAffineTransform得到的是仿射變換

   Node的getWorldToNodeTransform用於獲取一個Mat4的矩陣,該矩陣可以用於將世界座標系中的一個座標,轉換到Node的本地座標系中的座標。getWorldToNodeAffineTransform得到的是仿射變換

  Node的convertToNodeSpace是借用getWorldToNodeTransform得到的Mat4矩陣,將世界座標,轉換到Node本地座標系中的本地座標。反之,Node的convertToWorldSpace是借用getNodeToWorldTransform得到的Mat4矩陣,將Node本地座標系中的本地座標轉爲世界座標。

  Node的convertToNodeSpaceAR是將世界座標,轉換到以Node錨點爲原點的座標系中的座標。反之,Node的convertToWorldSpaceAR將以Node錨點爲原點的座標系中的某一點座標,轉爲世界座標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章