Cocos2d中各種座標位置關係

2021-06-05 06:23:12 字數 4078 閱讀 9129

**: 

先看一段**:

[cpp]view plain

copy

-(id) init  

return

self;  

}  

1、載入地圖:

[cpp]view plain

copy

cctmxtiledmap *gameworld = [cctmxtiledmap tiledmapwithtmxfile:@

"positiontext.tmx"

];  

2、獲取手機螢幕大小(320,480)

[cpp]view plain

copy

cgsize winsize = [[ccdirector shareddirector] winsize];  

3、地圖格仔數:

[cpp]view plain

copy

gameworld.mapsize (10,10)       

4、地圖格仔大小: 

[cpp]view plain

copy

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、座標轉換

[cpp]view plain

copy

-(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方法,可以看看它的原始碼:

[cpp]view plain

copy

- (cgpoint)converttouchtonodespace:(uitouch *)touch  

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

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

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

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

[cpp]view plain

copy

- (bool

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

return

yes;   

}  

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

[cpp]view plain

copy

ccsprite *rectsprite;  

cctmxtiledmap *gameworld;  

intspeed = 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];  

intx = pos.x / tilesize.width;  

inty = 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中各種座標位置關係

接觸cocos2d有段時間了,今天特意研究了下cocos2d座標系中各種位置關係,anchor屬性,ccnode座標和地圖座標轉換。先看一段 id init return self 1 載入地圖 cctmxtiledmap gameworld cctmxtiledmap tiledmapwithtm...

cocos2d中的座標轉換

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

cocos2d 座標系的轉換

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