1. 程式人生 > >Cocos2dx 小技巧(十三)聊聊坐標系

Cocos2dx 小技巧(十三)聊聊坐標系

south world 有趣 rect 區別 發現 技術 ins 不同

一好友考上了空姐。她說:以後基本上不會回來了。等下次見面時請叫我白富美!盡管有點羨慕。但我依然不甘示弱回復:下次見面時請叫我高富帥!


未來,誰說得準呢?

------------------
有段時間沒用到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傳來的觸點坐標便是屏幕坐標系,獲得該坐標系的方法例如以下:

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

我當前屏幕的分辨率為:960x640

輸出結果例如以下:

技術分享


有沒有發現一個有趣的現象。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
說到scrollView,下一篇要不要講點scrollView的技巧呢?

恩,先這樣吧,每次寫博客到這個點都好困。事實上也才十一點多~
尊重原創,轉載請註明來源:http://blog.csdn.net/star530/article/details/25250031

Cocos2dx 小技巧(十三)聊聊坐標系