成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Cocos2d-x坐標(biāo)研究

移動(dòng)開發(fā) iOS 游戲開發(fā)
蘋果的Quarze2D使用的是不同的坐標(biāo)系統(tǒng),原點(diǎn)在屏幕左上角,x軸向右,y軸向下。ios的屏幕觸摸事件CCTouch傳入的位置信息使用的是該坐標(biāo) 系。因此在cocos2d中對(duì)觸摸事件做出響應(yīng)前需要首先把觸摸點(diǎn)轉(zhuǎn)化到GL坐標(biāo)系。可以使用CCDirector的convertToGL來完成這一轉(zhuǎn)化。

GL坐標(biāo)系

Cocos2D以O(shè)penglES為圖形庫,所以它使用OpenglES坐標(biāo)系。GL坐標(biāo)系原點(diǎn)在屏幕左下角,x軸向右,y軸向上。

屏幕坐標(biāo)系

蘋果的Quarze2D使用的是不同的坐標(biāo)系統(tǒng),原點(diǎn)在屏幕左上角,x軸向右,y軸向下。ios的屏幕觸摸事件CCTouch傳入的位置信息使用的是該坐標(biāo) 系。因此在cocos2d中對(duì)觸摸事件做出響應(yīng)前需要首先把觸摸點(diǎn)轉(zhuǎn)化到GL坐標(biāo)系。可以使用CCDirector的convertToGL來完成這一轉(zhuǎn)化。

世界坐標(biāo)系

世界坐標(biāo)系也叫做絕對(duì)坐標(biāo)系,是游戲開發(fā)中的概念,它建立了描述其他坐標(biāo)系所需要的參考框架。我們能夠用世界坐標(biāo)系來描述其他坐標(biāo)系的位置,而不能用更大的,外部的坐標(biāo)系來描述世界坐標(biāo)系。cocos2d中的元素是有父子關(guān)系的層級(jí)結(jié)構(gòu),我們通過CCNode的position設(shè)定元素的位置使用的是相對(duì) 與其父節(jié)點(diǎn)的本地坐標(biāo)系而非世界坐標(biāo)系。***在繪制屏幕的時(shí)候cocos2d會(huì)把這些元素的本地坐標(biāo)映射成世界坐標(biāo)系坐標(biāo)。世界坐標(biāo)系和GL坐標(biāo)系一致, 原點(diǎn)在屏幕左下角,x軸向右,y軸向上。

本地坐標(biāo)系

本地坐標(biāo)系也叫做物體坐標(biāo)系,是和特定物體相關(guān)聯(lián)的坐標(biāo)系。每個(gè)物體都有它們獨(dú)立的坐標(biāo)系,當(dāng)物體移動(dòng)或改變方向時(shí),和該物體關(guān)聯(lián)的坐標(biāo)系將隨之移動(dòng)或改變方向。例如坐出租車的時(shí)候?qū)︸{駛員說“向左轉(zhuǎn)”,我們使用的是車的物體坐標(biāo)系,“前”、“后”、“左”、“右”只有在物體坐標(biāo)系中才有意義。但如果我們說 “向東開”,我們使用的就是世界坐標(biāo)系了,無論是車內(nèi)還是車外的人都知道應(yīng)該向什么方向開。CCNode的position使用的就是父節(jié)點(diǎn)的本地坐標(biāo) 系,它和GL坐標(biāo)系也是一致的,x軸向右,y軸向上,原點(diǎn)在父節(jié)點(diǎn)的左下角。如果父節(jié)點(diǎn)是場(chǎng)景樹中的頂層節(jié)點(diǎn),那么它使用的本地坐標(biāo)系就和世界坐標(biāo)系重合了。在CCNode對(duì)象中有幾個(gè)方便的函數(shù)可以做坐標(biāo)轉(zhuǎn)換:convertToWorldSpace方法可以把基于當(dāng)前節(jié)點(diǎn)的本地坐標(biāo)系下的坐標(biāo)轉(zhuǎn)換到世 界坐標(biāo)系中。convertToNodeSpace方法可以把世界坐標(biāo)轉(zhuǎn)換到當(dāng)前節(jié)點(diǎn)的本地坐標(biāo)系中。注意這些方法轉(zhuǎn)換的是基于當(dāng)前節(jié)點(diǎn)的坐標(biāo),而一個(gè)節(jié) 點(diǎn)的position所使用的坐標(biāo)是基于它父節(jié)點(diǎn)的本地坐標(biāo),因此我們要把node的位置轉(zhuǎn)換到世界坐標(biāo)系中應(yīng)該調(diào)用父節(jié)點(diǎn)的 convertToWorldSpace函數(shù) node->getParent()->convertToWorldSpace(node->getPosition)。幾 乎所有的游戲引擎都會(huì)使用本地坐標(biāo)系而非世界坐標(biāo)系來指定元素的位置,這樣做的好處是當(dāng)計(jì)算物體運(yùn)動(dòng)的時(shí)候使用同一本地坐標(biāo)系的元素可以作為一個(gè)子系統(tǒng)獨(dú) 立計(jì)算,***再加上坐標(biāo)系的運(yùn)動(dòng)即可,這是物理研究中常用的思路。例如一個(gè)在行駛的車廂內(nèi)上下跳動(dòng)的人,我們只需要在每幀繪制的時(shí)候計(jì)算他在車廂坐標(biāo)系中 的位置,然后加上車的位置就可以計(jì)算出人在世界坐標(biāo)系中的位置,如果使用單一的世界坐標(biāo)系,人的運(yùn)動(dòng)軌跡就變復(fù)雜了。

錨點(diǎn)

每一個(gè)CCNode都有一個(gè)錨點(diǎn)(anchorpoint),錨點(diǎn)指定了texture上和所在節(jié)點(diǎn)原點(diǎn)(也就是position所表示的點(diǎn))重合的點(diǎn)的位 置,因此只有在節(jié)點(diǎn)使用了texture的情況下,錨點(diǎn)才有意義。錨點(diǎn)的默認(rèn)值是(0.5,0.5),它表示的并不是一個(gè)像素點(diǎn),而是一個(gè)乘數(shù)因子。 (0.5, 0.5)表示錨點(diǎn)位于texture長(zhǎng)度乘以0.5和寬度乘以0.5的地方,即texture的中心。改變錨點(diǎn)的值并不會(huì)改變節(jié)點(diǎn)的位置 (position),雖然可能看起來節(jié)點(diǎn)的圖像位置發(fā)生了變化,其實(shí)變化的只是texture相對(duì)于position的位置,相當(dāng)于你在移動(dòng)節(jié)點(diǎn)里面的 texture,而非節(jié)點(diǎn)本身。如果把錨點(diǎn)設(shè)置成(0,0),texture的左下角就會(huì)和節(jié)點(diǎn)的position點(diǎn)重合,這可能使得元素定位更為方便, 但會(huì)影響到元素的縮放和旋轉(zhuǎn)等一系列變換,所以不推薦這么做。因此在錨點(diǎn)為默認(rèn)值(0.5,0.5)的情況下要把一個(gè)精靈放置到屏幕底部中央,應(yīng)該如下設(shè) 置position:

  1. [plain] view plaincopy CGSize screenSize = [[CCDirectorsharedDirector] winSize]; 
  2. float imageHeight = player.contentSize.height; 
  3. player.position = CGPointMake(screenSize.width / 2,imageHeight / 2); 

個(gè)人研究

今天晚上,對(duì)cocos2d-x里面的四個(gè)表示坐標(biāo)的方法進(jìn)行了一下研究,特意做了下筆記,如下:

CCPoint convertToNodeSpace(const CCPoint& worldPoint);

CCPoint convertToWorldSpace(const CCPoint& nodePoint);

CCPoint convertToNodeSpaceAR(const CCPoint& worldPoint);

CCPoint convertToWorldSpaceAR(const CCPoint& nodePoint);

在理解這個(gè)之前,要多世界坐標(biāo)和本地坐標(biāo)有一定的理解,

GL坐標(biāo)系Cocos2D以O(shè)penglES為圖形庫,所以它使用OpenglES坐標(biāo)系。GL坐標(biāo)系原點(diǎn)在屏幕左下角,x軸向右,y軸向上。

屏幕坐標(biāo)系蘋果的Quarze2D使用的是不同的坐標(biāo)系統(tǒng),原點(diǎn)在屏幕左上角,x軸向右,y軸向下。ios的屏幕觸摸事件CCTouch傳入的位置信息使用的是該坐標(biāo) 系。因此在cocos2d中對(duì)觸摸事件做出響應(yīng)前需要首先把觸摸點(diǎn)轉(zhuǎn)化到GL坐標(biāo)系。可以使用CCDirector的convertToGL來完成這一轉(zhuǎn)化。

世界坐標(biāo)系也叫做絕對(duì)坐標(biāo)系,cocos2d中的元素是有父子關(guān)系的層級(jí)結(jié)構(gòu),我們通過CCNode的position設(shè)定元素的位置使用的是相對(duì)與其父節(jié)點(diǎn)的本地坐標(biāo)系而非世界坐標(biāo)系。***在繪制屏幕的時(shí)候cocos2d會(huì)把這些元素的本地坐標(biāo)映射成世界坐標(biāo)系坐標(biāo)。世界坐標(biāo)系和GL坐標(biāo)系一致,原點(diǎn)在屏幕左下角,

本地坐標(biāo)系本 地坐標(biāo)系也叫做物體坐標(biāo)系,是和特定物體相關(guān)聯(lián)的坐標(biāo)系。每個(gè)物體都有它們獨(dú)立的坐標(biāo)系,當(dāng)物體移動(dòng)或改變方向時(shí),和該物體關(guān)聯(lián)的坐標(biāo)系將隨之移動(dòng)或改變 方向。比如用cocos2d-x創(chuàng)建了個(gè)矩形colorLayer:CCRect(10,10,100,100),這是的本地坐標(biāo)系為以(10,10)為 坐標(biāo)原點(diǎn),x軸向右,y軸向上。如果創(chuàng)建了一個(gè)CCSprite,錨點(diǎn)為(0.5,0.5),位置為(100,100),size為(40,40),這時(shí)的本地坐標(biāo)系為以(80,80)為坐標(biāo)原點(diǎn),x軸向右,y軸向上。總之,本地坐標(biāo)系原點(diǎn)為node的左下角坐標(biāo)

接下來,convertToNodeSpace:調(diào)用CCPoint point = node1->convertToNodeSpace(node2->getPosition());

將node2的坐標(biāo)轉(zhuǎn)化成相對(duì)于node1的本地坐標(biāo)

cocos2d-x 坐標(biāo)研究 - zjfzjf - zjfzjf

比如坐標(biāo)如上圖所示,node1的錨點(diǎn)為(0,0),node2的錨點(diǎn)為(1,1),轉(zhuǎn)化之后,node的坐標(biāo)變成了(-25,-60)

下頁為您接續(xù)帶來Cocos2d-x個(gè)人研究

#p#

而convertToWorldSpace:調(diào)用CCPoint point = node1->convertToWorldSpace(node2->getPosition());

cocos2d-x 坐標(biāo)研究 - zjfzjf - zjfzjf

是將node的坐標(biāo)轉(zhuǎn)化成相對(duì)于node1的世界坐標(biāo),如上圖所示:首先將node1的坐標(biāo)當(dāng)做世界坐標(biāo),然后讓node2的坐標(biāo)位置重置成相對(duì)于node1的世界坐標(biāo),也就是(15,20)

convertToNodeSpaceAR,就是把node1的坐標(biāo)系原點(diǎn)設(shè)置在錨點(diǎn)的位置,這里的錨點(diǎn)是(0,0)所以轉(zhuǎn)化之后的坐標(biāo)系位置和上面的convertToNodeSpace一樣,結(jié)果也是一樣的,convertToWorldSpaceAR同理

測(cè)試:

CCSprite *sprite1 = CCSprite::spriteWithFile("CloseNormal.png");

sprite1->setPosition(ccp(20,40));

sprite1->setAnchorPoint(ccp(0,0));

this->addChild(sprite1);

CCSprite *sprite2 = CCSprite::spriteWithFile("CloseNormal.png");

sprite2->setPosition(ccp(-5,-20));

sprite2->setAnchorPoint(ccp(1,1));

this->addChild(sprite2);

CCPoint point1 = sprite1->convertToNodeSpace(sprite2->getPosition());

CCPoint point2 = sprite1->convertToWorldSpace(sprite2->getPosition());

CCPoint point3 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());

CCPoint point4 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());

CCLog("position = (%f,%f)",point1.x,point1.y);

CCLog("position = (%f,%f)",point2.x,point2.y);

CCLog("position = (%f,%f)",point3.x,point3.y);

CCLog("position = (%f,%f)",point4.x,point4.y);

運(yùn)行結(jié)果:

position = (-25.000000,-60.000000)

position = (15.000000,20.000000)

position = (-25.000000,-60.000000)

position = (15.000000,20.000000)

和預(yù)算的一樣

這里在將sprite1的錨點(diǎn)設(shè)置成(0.5,0.5),對(duì)convertToNodeSpaceAR和convertToWorldSpaceAR進(jìn)行了進(jìn)一步的測(cè)試

sprite1->setAnchorPoint(ccp(0.5,0.5));

sprite1->setPosition(ccp(100,100));

CCPoint point5 = sprite1->convertToNodeSpaceAR(sprite2->getPosition());

CCPoint point6 = sprite1->convertToWorldSpaceAR(sprite2->getPosition());

CCLog("position = (%f,%f)",point5.x,point5.y);

CCLog("position = (%f,%f)",point6.x,point5.y);

運(yùn)算結(jié)果:

size = (40.000000,40.000000)

position = (-105.000000,-120.000000)

position = (95.000000,80.000000)

分析:重置的sprite1的坐標(biāo)為(100,100),錨點(diǎn)為(0.5,0.5)所以對(duì)于convertToNodeSpaceAR和convertToWorldSpaceAR這兩個(gè)方法的坐標(biāo)系為原點(diǎn)(100,100),所以用convertToNodeSpaceAR轉(zhuǎn)化之后的坐標(biāo)為(-105,-120)用convertToWorldSpaceAR化之后的坐標(biāo)為(95,80),和運(yùn)算結(jié)果一樣

責(zé)任編輯:閆佳明 來源: blog.163
相關(guān)推薦

2013-05-22 14:38:44

iOS開發(fā)Cocos2d-x坐標(biāo)系統(tǒng)

2011-12-12 10:40:08

Cocos2d-X游戲開發(fā)開發(fā)環(huán)境

2012-04-17 12:38:46

cocos2d-x

2012-04-17 12:44:38

cocos2d-x

2013-04-16 10:02:47

cocos2d-x懶人Android開發(fā)

2013-06-03 17:04:20

CocoStudioCocos2D-X添加CocoStudi

2013-12-03 10:58:50

Cocos2D-X磚塊地圖

2012-04-17 12:58:44

Cocos2D-X

2014-07-31 16:57:30

2012-02-19 20:10:23

Cocos2d-x fCocos2dWindows Pho

2012-04-17 10:06:08

cocos2d-x

2012-04-17 12:47:27

cocos2d-x

2012-04-17 10:59:31

cocos2d-x

2012-04-17 13:12:00

2014-08-13 10:07:02

游戲引擎

2013-11-13 16:31:32

Cocos2d-x

2012-05-09 10:09:57

Cocos2d-xAndroidiOS

2013-06-07 14:06:52

移動(dòng)開發(fā)Android開發(fā)cocos2d-x

2014-06-10 11:12:34

Cocos2d-x

2014-07-31 16:48:09

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产一区二区三区 | 黄网站涩免费蜜桃网站 | 国产精品亚洲第一区在线暖暖韩国 | 中文字幕一区二区三区精彩视频 | 亚洲精品一区二区三区 | 日韩中文欧美 | www.日本精品| 日中文字幕在线 | 一区二区av| 亚洲视频三区 | 久久久久久成人网 | 视频一区二区三区在线观看 | 成人在线免费视频观看 | 国产欧美精品一区二区 | 免费观看www7722午夜电影 | 色婷婷国产精品 | 中文字幕在线观看 | 国产乱码精品1区2区3区 | www.一区二区三区.com | 日本公妇乱淫xxxⅹ 国产在线不卡 | 网色| 亚洲国产精品久久久久秋霞不卡 | 国产一区亚洲二区三区 | 亚洲精品一区二区 | 一区二区成人 | 国产日韩欧美精品 | 国产精品久久久久久久免费观看 | 国产精品毛片一区二区三区 | 免费观看黄色一级片 | 高清av在线 | 亚洲精品视频一区 | 一区二区三区高清不卡 | 一本色道精品久久一区二区三区 | 嫩草视频入口 | 亚洲欧美在线观看 | 日韩成人在线观看 | 黄色免费av | 国产中文字幕在线观看 | 最新国产精品视频 | 中文字幕日本一区二区 | 亚洲午夜精品一区二区三区他趣 |