深刻理解 cocos2d-x 座標系

首先對於初學的,帶你們認識 cocos2d-x 中座標系的幾個概念,參考 http://blog.csdn.net/tskyfree/article/details/8292544。其餘的往下看。html

弄懂座標系是開始開發的重要的一步,爲了避免讓你們頭暈,如今裏沃特深刻的爲你們講解一下,本人原文地址:http://www.cnblogs.com/lyout/p/3292702.html。函數

首先咱們添加兩個測試精靈(寬:27,高:40)到場景裏面:測試

		CCSprite *sprite1 = CCSprite::create("player.png");
		sprite1->setPosition(ccp(20, 40));
		sprite1->setAnchorPoint(ccp(0, 0));
		this->addChild(sprite1);

		CCSprite *sprite2 = CCSprite::create("player.png");
		sprite2->setPosition(ccp(-15, -30));
		sprite2->setAnchorPoint(ccp(1, 1));
		this->addChild(sprite2);

而後調試,在場景中大概是下圖這樣顯示(以左下角爲座標原點,從左到右爲x方向,從下到上爲y方向,廢話了:)):this

在cocos2d-x中,每一個精靈都有一個錨點,之後對精靈的操做(好比旋轉)都會圍繞錨點進行,咱們暫且能夠看做是精靈的中心位置,通常來講有每一個方向有三種可能的值:0,0.5,1。上圖中紅色圓點即爲各自的錨點,sprite1 錨點爲 (0,0) 左下角,sprite2錨點爲(1,1)在右上角。spa

如今咱們來看看座標系轉換,一樣地,咱們先寫點測試代碼:.net

		CCPoint p1 = sprite2->convertToNodeSpace(sprite1->getPosition());
		CCPoint p2 = sprite2->convertToWorldSpace(sprite1->getPosition());
		CCPoint p3 = sprite2->convertToNodeSpaceAR(sprite1->getPosition());
		CCPoint p4 = sprite2->convertToWorldSpaceAR(sprite1->getPosition());

接着,再打印出各點的x,y值:3d

		CCLog("p1:%f,%f", p1.x, p1.y);
		CCLog("p2:%f,%f", p2.x, p2.y);
		CCLog("p3:%f,%f", p3.x, p3.y);
		CCLog("p4:%f,%f", p4.x, p4.y);

如今開始分析這四個經常使用座標系轉換函數轉換後的值(有興趣的同窗能夠先算一算)。調試

因爲cocos2d-x的座標系(本地座標系)是以左下角爲座標原點的,因此 sprite1和sprite2的座標原點在上圖的位置分別是(20,40)、(-42,-70),那麼很明顯的:htm

p1就是sprite1錨點相對於sprite2原點來講在sprite2座標系中的位置,通過對比上圖,咱們能夠獲得(20-(-42),40-(-70))即(62,110)blog

p2就是sprite1錨點相對於sprite2原點來講在上圖座標系中的位置,這樣咱們能夠計算出sprite1在sprite2座標系中的位置:(20+(-42),40+(-70)),即(-22,-30)

p3就是sprite1錨點相對於sprite2錨點來講在sprite2座標系中的位置,也就是(20-(-15),40-(-30)),即(35,70)

p4就是sprite1錨點相對於sprite2錨點來講在上圖座標系中的位置,也就是(20+(-15),40+(-30)),即(5,10)

如今咱們能夠知道,計算方法都是用sprite1的座標去加減sprite2的座標,針對本地座標系就用減法,針對世界座標系就用加法

 

好了,方法出來了,有興趣的能夠作計算一下如下幾個座標的值(先不要上機調試),而後回覆我,差很少10個回覆後我會貼出正確答案:

		CCPoint p1 = sprite1->convertToNodeSpace(sprite2->getPosition());
		CCPoint p2 = sprite1->convertToWorldSpace(sprite2->getPosition());
		CCPoint p3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());
		CCPoint p4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());
相關文章
相關標籤/搜索