【Cocos2d-x】座標系和圖層

在Cocos2D-X中,存在四種座標系:

1、OpenGL座標系:該座標系原點在屏幕左下角,x軸向右,y軸向上。這也就是cocos2dx中用到的座標系所以沒啥好說的。

2、屏幕座標系(UIKit座標):該座標系的原點在屏幕左上角,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傳來的觸點座標便是屏幕座標系,獲得該座標系的方法如下:

auto point = touch->getLocationInView();//獲得屏幕座標系  
當然了,我們一般使用時都應該將屏幕座標系轉成OpenGL座標系,方法有兩種:
auto point = touch->getLocation();//直接從touch中獲取,在getLocation()源碼裏會將座標轉成OpenGL座標系  
  
auto point = touch->getLocationInView();  
point = Director::getInstance()->convertToGL(point);//先獲得屏幕座標,在調用convertToGL轉成OpenGl座標系  

<span style="font-size:14px;">auto point = touch->getLocation();//直接從touch中獲取,在getLocation()源碼裏會將座標轉成OpenGL座標系

auto point = touch->getLocationInView();
point = Director::getInstance()->convertToGL(point);//先獲得屏幕座標,在調用convertToGL轉成OpenGl座標系</span>

下面看下完整的代碼:

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);

	return true;
}
convertToGL將point屏幕座標轉成OpenGL座標後,再對point使用一次convertToGL後,point又從OpenGL座標轉成了屏幕座標。


2、接下來說節點座標吧,世界座標不打算詳細介紹,因爲自己也沒怎麼去用過...
節點座標的一個比較典型的用法應該就是scrollView了吧,例如在scrollView的層上有一個精靈sp,你想獲取sp在scrollView中的哪個位置,可是每次獲取的座標都不一樣。原因就在於你每次獲得的座標都是OpenGL座標
,上面有說道了,OpenGL的座標原點是在屏幕的左下角,而scrolView是一直在拖動的,每拖動一次sp的OpenGL座標當然也跟着改變。解決辦法就是將OpenGl座標轉成節點座標,方法如下:

point = scroll_layer->convertToNodeSpace(point);//假設scrollView中的層是scroll_layer  
通常在Cocos2dx中使用的座標默認是OpenGL座標系表示。

在窗口中放置對象時(如圖像等),默認的是從左下角開始算偏移量,座標偏移是相對於圖像的錨點來計算的,錨點的位置默認在圖像中心位置。例如:將一副圖像放在窗口位置(0,0),就是將圖像的中心點(錨點)放置在該原點位置。可以用精靈來將加載圖像,然後將精靈放置在層(CCLayer)中。放在哪個層,座標的原點就是哪個圖層的左下角。

即是座標位置是相對於圖層而言的,不是相對於屏幕!這個概念很重要。

在下面的地圖滾動中,不瞭解這個概念就很難理解地圖滾動的算法。


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