1. 程式人生 > >cocos2dx 座標系錨點總結

cocos2dx 座標系錨點總結

cocos2dx 座標系系統是個非常容易引起混亂的課題,而新舊版本間函式名叫法又不太統一,在此統一記錄一下,以備以後來檢視。

(筆者當前使用的是cocos2dx 3.2版本。)

1.座標系

首先是分類,比較公認的是以下四類:

A、OpenGL座標系:該座標系原點在螢幕左下角,x軸向右,y軸向上。
B、螢幕座標系:該座標系的原點在螢幕左上角,x軸向右,y軸向下。
C、世界座標系:又名絕對座標系,和OpenGL座標系方向一致,原點在螢幕左下角,x軸向右,y軸向上。
D、節點座標系:又名相對座標系,和OpenGL座標系方向一致,不同的是原點在父節點左下角。

主要混亂點就是A和B了。

大家getPostion拿到的點就是相對A座標系,但是touch拿到的點是相對B座標系

。咋辦呢,所以推薦的是統一轉成GL座標系也就是A了。

touch->getLocation()就是轉化成A的touch座標。這也就是為啥touch不用getPosition的原因了(表明做了一層轉換嘛,ps:我猜的...)

那如果還是想用B座標系咋辦,還有個touch->getLocationInView()呢。

總結一下:

touch->getLocation()------------相對GL座標系

touch->getLocationInView()------相對螢幕座標系

Director::getInstance()->convertToGL(point)-------螢幕座標系轉GL座標系


那GL座標系轉螢幕座標系呢,小技巧是再用一下Director::getInstance()->convertToGL(point)就轉回去了:)

2.錨點

首先是定義:

網上說的比較多的是這種比喻:錨點我們可以看成用一根圖釘將一張紙或者相片釘在牆上的那個點。

貌似恍然大悟,用起來還是一頭霧水。

個人覺得更加具體的理解是:

子節點的錨點設在哪裡,就相當於把子節點的哪裡釘在父節點的左下角(父節點是layer還是sprite都一樣,都是左下角!),而無關子節點的子節點的位置,也無關父節點的錨點。(有點繞。。。)

比如:

錨點是(0,0)------------子節點左下角和父節點的左下角重合

(0.5,0.5)---------------子節點中點和父節點左下角重合

(1.0,1.0)--------------子節點右上角和父節點左下角重合

但有時大家會發現這個邏輯有時會不起效。原因在於以下兩點比較特殊:

A.精靈(Sprite)的錨點預設為(0.5,0.5),預設不忽略錨點;

B.其他節點比如說CCLayer和CCSense,錨點預設為(0,0),預設是忽略錨點。

忽略錨點的意思就是你怎麼設定它的錨點都沒有用!

除非先加上這麼一句話:

layer1->ignoreAnchorPointForPosition(false);

如有新的發現再來補充。