接觸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...