1. 程式人生 > >【Cocos2d-x】坐標系和圖層

【Cocos2d-x】坐標系和圖層

pac 多說 pan art world 地圖 分辨 play instance

在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坐標系  

以下看下完整的代碼:

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)中。放在哪個層,坐標的原點就是哪個圖層的左下角。

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

在以下的地圖滾動中。不了解這個概念就非常難理解地圖滾動的算法。


??

【Cocos2d-x】坐標系和圖層