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座標系
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);
如有新的發現再來補充。