Cocos2d中各種座標位置關係

2021-05-27 10:14:10 字數 3553 閱讀 6550

接觸cocos2d有段時間了,今天特意研究了下cocos2d座標系中各種位置關係,anchor屬性,ccnode座標和地圖座標轉換。

先看一段**:

-(id) init

return self;

}

1、載入地圖:

cctmxtiledmap *gameworld = [cctmxtiledmap tiledmapwithtmxfile:@"positiontext.tmx"];
2、獲取手機螢幕大小(320,480)
cgsize winsize = [[ccdirector shareddirector] winsize];
3、地圖格仔數:
gameworld.mapsize (10,10)

4、地圖格仔大小:

gameworld.tilesize    (20,20)
5、整個地圖大小:

gameworld.mapsize * gameworld.tilesize;

當然這裡所說的是地圖格仔是個正方形,非正方形也容易啦。

6、anchor屬性

1) 新增乙個精靈,這個精靈是個畫素為1*1的紅色,設定座標為20,20,即在地圖的第乙個格仔的右上角,設定anchorpoint為(0.5, 0.5)

2) 再新增乙個精靈,這個精靈是個畫素為20*20的藍色,設定座標為20,20,即在地圖的第乙個格仔的右上角,同樣設定anchorpoint為(0.5, 0.5)

執行效果是矩形精靈的中心和在點精靈的位置,即矩形精靈的錨點為第乙個格仔的右上角(20,20)座標 處

去掉兩個精靈的anchorpoint屬性

執行效果和上面相同

設定rectsprite的anchorpoint為ccp(0,0)

執行效果是矩形精靈的左下角與點精靈重合。

設定rectsprite的anchorpoint為ccp(1,1)

執行效果是矩形精靈的右上角與點精靈重合。

同理設定ccp(0.5, 1) , ccp(1, 0.5)等

由上面可以得出:

1)anchorpoint屬性預設為ccp(0.5, 0.5)

2)當設定(0,0)時是以左下角為錨點

3)當設定(1, 1)時是以右上角角為錨點

4)由此可以自己推論到底該把錨點設定在**

cocos2d使用的是opengl座標系

opengl座標系:原點在左下角, x軸向右,y軸向上

iphone螢幕座標系:原點在左上角,x軸向右,y軸向下

很簡單的判斷方法:由於cocos2d的座標系的原點在左下角。所以精靈內部座標原點也是左下角,即當anchorpoint為(0, 0)時即以左下角為錨點,為(1,1)時就以右上角為錨點,當然(0.5, 0.5)就是以精靈中心為錨點了。由此可以推算出-2,-3....    2, 3....   等值時精靈錨點座標。

7、座標轉換

-(id) init

return self;

}- (void) registerwithtouchdispatcher

- (bool) cctouchbegan:(uitouch *)touch withevent:(uievent *)event

- (void) cctouchmoved:(uitouch *)touch withevent:(uievent*)event

- (void) cctouchended:(uitouch *)touch withevent:(uievent*)event

上面的**新增了uiview的事件處理。由於螢幕和cocos2d採用不同的座標系,所以我們需要進行座標轉換。

1)首先獲取螢幕座標

2)將螢幕座標轉換為opengl的座標

3)將opengl的座標轉換為cocos2d的座標。

從執行結果可以看出node1和node2列印出的座標相同。因為cocos2d給我們寫了coverttouchtonodespace方法,可以看看它的原始碼:

- (cgpoint)converttouchtonodespace:(uitouch *)touch

至於為什麼opengl和node1輸出既然相同,為什麼還要使用converttonodespace,由於能力有限,希望大牛們能給告訴我答案。

uiview輸出的是將cocos2d座標轉換為螢幕即quartz座標。

4) converttouchtonodespacear是將觸控點轉換為相對於rectsprite的座標

8、判斷觸控點是否在制定的精靈上

- (bool) cctouchbegan:(uitouch *)touch withevent:(uievent *)event 

return yes;

}

9、獲取觸控的是哪個tile,並改變該tile.

ccsprite *rectsprite;

cctmxtiledmap *gameworld;

int speed = 10;

-(id) init

return self;

}- (void) registerwithtouchdispatcher

- (bool) cctouchbegan:(uitouch *)touch withevent:(uievent *)event

return yes;

}- (void) cctouchmoved:(uitouch *)touch withevent:(uievent*)event

- (void) cctouchended:(uitouch *)touch withevent:(uievent*)event

- (cgpoint) tileposition:(cgpoint)pos

cgsize layersize = [ly layersize];

cgsize tilesize = [gameworld tilesize];

int x = pos.x / tilesize.width;

int y = layersize.height - pos.y / tilesize.height;

if((x >= 0) && (x < layersize.width) && (y >= 0) && (y < layersize.height)) else

if(point.x < 0) return ccp(-1, -1);

if(point.y < 0) return ccp(-1, -1);

if(point.x >= layersize.width) return ccp(-1, -1);

if(point.y >= layersize.height) return ccp(-1, -1);

cclog(@"%d, %d", x, y);

return point;

}

由於我裝的黑蘋果,所以截圖軟體不能用,不能截圖,見諒。

Cocos2d中各種座標位置關係

先看一段 cpp view plain copy id init return self 1 載入地圖 cpp view plain copy cctmxtiledmap gameworld cctmxtiledmap tiledmapwithtmxfile positiontext.tmx 2 獲...

cocos2d中的座標轉換

先說下世界座標跟本地 把世界座標轉換到當前節點的本地座標系中 point converttonodespace constpoint worldpoint const 把基於當前節點的本地座標系下的座標轉換到世界座標系中 point converttoworldspace constpoint no...

cocos2d 座標系的轉換

許久之後遇到問題,立馬又來發了一篇。這次的內容跟c 無關,是有關cocos2d的乙個小技術點 本地座標與世界座標 在cocos中有兩種座標系 本地座標系和世界座標系。本地座標系 這個座標系是基於節點以及層的座標系,例如有兩個節點 node1和node2,node1在layer中,node2在node...