CC中的座標系

------------------
有段時間沒用到onTouchBegan,近來寫代碼時發現對convertToGL(),getLocation()這些接口都有點陌生了,所以趁這次機會就寫個總結到博客裏,下次忘了就來博客裏看看,當筆記用咯。

首先腦補下基礎知識吧:
1、OpenGL座標系:該座標系原點在屏幕左下角,x軸向右,y軸向上。這也就是cocos2dx中用到的座標系所以沒啥好說的。
2、屏幕座標系:該座標系的原點在屏幕左上角,x軸向右,y軸向下,其實和OpenGL座標系的差別也就是y軸的方向拉。假設遊戲場景的分辨率爲(500,500),其中一個點的座標爲(200,200),那麼它在OpenGL座標系中的座標還是(200,200),在屏幕座標系中則要倒過來,則爲(200,500-200)。其實也就是6和9的差別啦,呵呵,六九式...
3、世界座標系:又名絕對座標系,概念啥的就不多說了,我們只要知道世界座標系和OpenGL座標系方向一致,原點在屏幕左下角,x軸向右,y軸向上。
4、節點座標系:又名相對座標系,和OpenGL座標系方向一致,不同的是原點在父節點左下角。

下面舉下例子:
1、先說OpenGL座標系與屏幕座標系吧

前面不是提到onTouchBegan(Touch* touch,Event* event)麼,參數touch傳來的觸點座標便是屏幕座標系,獲得該座標系的方法如下:
?
1
auto point = touch->getLocationInView();//獲得屏幕座標系
當然了,我們一般使用時都應該將屏幕座標系轉成OpenGL座標系,方法有兩種:
?
1
2
3
4
auto point = touch->getLocation();//直接從touch中獲取,在getLocation()源碼裏會將座標轉成OpenGL座標系
 
auto point = touch->getLocationInView();
point = Director::getInstance()->convertToGL(point);//先獲得屏幕座標,在調用convertToGL轉成OpenGl座標系
下面看下完整的代碼:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
bool HelloWorld::onTouchBegan(Touch* touch,Event* event)
{
    auto point = touch->getLocation();//獲得OpenGl座標系
    CCLOG("Location point x=%f , y=%f",point.x,point.y);
 
    auto point2 = touch->getLocationInView();//獲得屏幕座標
    CCLOG("LocationInView point x=%f , y=%f",point2.x,point2.y);
 
    point2 = Director::getInstance()->convertToGL(point2);//將屏幕座標轉成OpenGL座標
    CCLOG("convertToGL1 point x=%f , y=%f",point2.x,point2.y);
 
    point2 = Director::getInstance()->convertToGL(point2);//注意這個
    CCLOG("convertToGL2 point x=%f , y=%f",point2.x,point2.y);
 
    returntrue;
}

我當前屏幕的分辨率爲:960x640。輸出結果如下:

\


有沒有發現一個有趣的現象,convertToGL將point屏幕座標轉成OpenGL座標後,再對point使用一次convertToGL後,point又從OpenGL座標轉成了屏幕座標,哈哈。

2、接下來說節點座標吧,世界座標不打算詳細介紹,因爲自己也沒怎麼去用過...
節點座標的一個比較典型的用法應該就是scrollView了<喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPrDJo6zA/cjn1NpzY3JvbGxWaWV3tcSy48nP09DSu7j2vqvB6XNwo6zE48/ru/HIoXNw1NpzY3JvbGxWaWV31tC1xMTEuPbOu9bDo6y/ycrHw7+0zrvxyKG1xNf4seq2vLK70rvR+aGj1K3S8r7N1NrT2jxzdHJvbmc+xOPDv7TOu/G1w7XE1/ix6ra8ysdPcGVuR0zX+LHqPC9zdHJvbmc+o6zJz8Pm09DLtbXAwcujrE9wZW5HTLXE1/ix6tSttePKx9TaxsHEu7XE1/PPwr3Ho6y2+HNjcm9sVmlld8rH0rvWsdTazc+2r7XEo6zDv83Ptq/Su7TOc3C1xE9wZW5HTNf4seq1sci70rK4+tfFuMSx5KGjveK+9rDst6i+zcrHvatPcGVuR2zX+LHq16qzyb3atePX+LHqo6y3vbeoyOfPwqO6PGJyIC8+PHByZSBjbGFzcz0="brush:java;">point = scroll_layer->convertToNodeSpace(point);//假設scrollView中的層是scroll_layer說到scrollView,下一篇要不要講點scrollView的技巧呢?

恩,先這樣吧,每次寫博客到這個點都好睏。其實也才十一點多~

尊重原創,轉載請註明來源:http://blog.csdn.net/star530/article/details/25250031


補充:1.tmx地圖的座標爲格子座標,左上角爲原點(0,0),設備座標系

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