游戲開發(fā)中,有了坐標(biāo)系才有了整個世界,坐標(biāo)系是游戲世界的標(biāo)尺,讓游戲元素正確有序得顯示在屏幕上而不會分崩離析。
標(biāo)準(zhǔn)屏幕坐標(biāo)系
在iOS、Android、WindowsPhone等平臺上,使用原生SDK開發(fā)應(yīng)用時使用的都是標(biāo)準(zhǔn)屏幕坐標(biāo)系(UI坐標(biāo)系),原點(diǎn)為屏幕左上角,x軸向右,y軸向下。
標(biāo)準(zhǔn)屏幕坐標(biāo)系
- 原點(diǎn)位于左上角
- 從左至右,x軸遞增。
- 從上至下,y軸遞增。
屏幕坐標(biāo)系又稱為紋理坐標(biāo)系,在Cocos2d-x中,只有從紋理截取部分矩形時才會使用此坐標(biāo)系,例如Sprite的TextureRect屬性。
OpenGL坐標(biāo)系
OpenGL坐標(biāo)系又稱為繪圖坐標(biāo)系,Cocos2d-x以O(shè)penGL和OpenGL ES為基礎(chǔ),自然支持OpenGL坐標(biāo)系。
- 標(biāo)準(zhǔn)屏幕坐標(biāo)系和OpenGL使用的是不同的坐標(biāo)系,和Cocos2d-x坐標(biāo)系有很大區(qū)別。
- Cocos2d-x坐標(biāo)系和OpenGL坐標(biāo)系一樣,原點(diǎn)為屏幕左下角,x向右,y向上。
Cocos2d引擎的坐標(biāo)系是統(tǒng)一的,卻不同于屏幕坐標(biāo)系,而是繼承自O(shè)penGL的右手笛卡爾坐標(biāo)系,而DIrect3D使用左手坐標(biāo)系。
笛卡爾右手坐標(biāo)系
- 原點(diǎn)位于左下角
- 從左至右,x軸遞增。
- 從下向上,y軸遞增。
- 從遠(yuǎn)到近,z軸遞增。
關(guān)于OpenGL坐標(biāo)系,做2d編程可暫時忽略z軸,但需記住的是渲染的深度問題,也就是說Z_Order的值,其值越大則渲染出的圖將會越在上面。
世界坐標(biāo)系 與 本地坐標(biāo)系
- 世界坐標(biāo)系:絕對坐標(biāo)系
- 本地坐標(biāo)系:相對坐標(biāo)系
世界坐標(biāo)系又叫絕對坐標(biāo)系,是游戲開發(fā)中建立的概念。表示場景空間內(nèi)的統(tǒng)一坐標(biāo)系,游戲世界就是用來表示游戲的場景。它建立了其他坐標(biāo)系所需的參考標(biāo)準(zhǔn),可使用世界系來描述其他坐標(biāo)系的位置。
世界坐標(biāo)系和本地坐標(biāo)系的概念源自于Cocos2d體系中的場景樹。游戲畫面是由一個場景的根節(jié)點(diǎn)及場景包含的子節(jié)點(diǎn)構(gòu)成,節(jié)點(diǎn)又可包含其他子節(jié)點(diǎn),是一個典型的樹形結(jié)構(gòu),如此構(gòu)建出的節(jié)點(diǎn)結(jié)構(gòu)就是場景樹。Cocos體系中的子節(jié)點(diǎn)的定位是基于父節(jié)點(diǎn)的位置的,所以子節(jié)點(diǎn)的坐標(biāo)實(shí)際上相對坐標(biāo),也就是本地坐標(biāo)系中的坐標(biāo),而其相對于場景的絕對坐標(biāo)即世界坐標(biāo)系中的坐標(biāo)。
世界坐標(biāo)系是游戲根節(jié)點(diǎn)場景的坐標(biāo)系,坐標(biāo)系原點(diǎn)位于場景左下角。本地坐標(biāo)系是節(jié)點(diǎn)所處的定位坐標(biāo)系,它的原點(diǎn)位于父節(jié)點(diǎn)的坐標(biāo)系位置。
本地坐標(biāo)系也叫做相對坐標(biāo)系或節(jié)點(diǎn)坐標(biāo)系,是和節(jié)點(diǎn)相關(guān)聯(lián)的坐標(biāo)系。每個節(jié)點(diǎn)都有獨(dú)立的坐標(biāo)系,當(dāng)節(jié)點(diǎn)移動或改變時,和該節(jié)點(diǎn)關(guān)聯(lián)的坐標(biāo)系將隨之移動或改變方向。
錨點(diǎn)
錨點(diǎn)是Cocos2d-x中一個非常重要的概念,每個節(jié)點(diǎn)都有一個錨點(diǎn),錨點(diǎn)指定了紋理圖像和節(jié)點(diǎn)原點(diǎn)重合的位置。默認(rèn)情況下,錨點(diǎn)位于紋理圖像的集合中心。錨點(diǎn)的最大作用是輔助節(jié)點(diǎn)進(jìn)行界面布局定位。
錨點(diǎn)是節(jié)點(diǎn)的另一個重要屬性,決定了節(jié)點(diǎn)以自身約束框中的哪一個點(diǎn)作為整個節(jié)點(diǎn)的位置。
錨點(diǎn)是給節(jié)點(diǎn)定位和仿射變換的基準(zhǔn)點(diǎn),錨點(diǎn)包含x軸和y軸兩個方向上的基準(zhǔn)點(diǎn),兩個方向上的取值均是0到1之間,這意味著錨點(diǎn)位置在節(jié)點(diǎn)的x軸和y軸上的占其寬度和長度的比例。
錨點(diǎn)使用節(jié)點(diǎn)本身的比例來表示,范圍從(0,0)到(1,1)之間,默認(rèn)情況下,錨點(diǎn)位于紋理的幾何中心即(0.5, 0.5)。錨點(diǎn)值并不是一個像素點(diǎn),而是一個乘數(shù)因子。(0.5, 0.5)表示錨點(diǎn)位于紋理圖像長度乘以0.5的地方,即紋理圖像的中心。
錨點(diǎn)是相對坐標(biāo),用來定義物體內(nèi)部的點(diǎn),在Cocos2d中以加載精靈來實(shí)現(xiàn)游戲元素的表現(xiàn),而精靈一般都是對應(yīng)的一張圖片資源。在設(shè)置精靈位置時,要設(shè)置精靈中的錨點(diǎn)來和坐標(biāo)點(diǎn)相對應(yīng)。
在Cocos2d-x中圖層Layer的錨點(diǎn)默認(rèn)值為(0,0),其他節(jié)點(diǎn)的默認(rèn)值為(0.5,0.5)。因?yàn)閳D層比較特殊,它默認(rèn)忽略錨點(diǎn)。
Vec2和Point
在Cocos2d-x 3.0版本中,使用Point來表示一個坐標(biāo)點(diǎn),Point中包含了x和y坐標(biāo),都是浮點(diǎn)數(shù)。從Cocos2d-x 3.1版本開始,使用Vec2來代替Point,而Point作為typedef存在。
父類和子類
每個繼承自CCNode的類都具有一個錨點(diǎn)屬性,當(dāng)決定繪制對象如精靈、圖層等的時候,Cocos2d-x將會考慮位置信息以及錨點(diǎn)信息。當(dāng)旋轉(zhuǎn)一個物體時,Cocos2d-x也會圍繞著錨點(diǎn)旋轉(zhuǎn)。
錨點(diǎn)的操作
-
setAnchorPoint(Vec2(0.5, 0.5))
設(shè)置錨點(diǎn)
setAnchorPoint()
getAnchorPoint()
setIsRelativeAnchorPoint()
getIsRelativeAnchorPoint()