cocos2d getPosition()取不到實(shí)際坐標(biāo)問(wèn)題
1、cocos2d,節(jié)點(diǎn)默認(rèn)坐標(biāo)(0,0),默認(rèn)錨點(diǎn)(0.5,0.5),頂點(diǎn)節(jié)點(diǎn)(最上層節(jié)點(diǎn))的坐標(biāo)以世界坐標(biāo)為基準(zhǔn)(也就是此節(jié)點(diǎn)的坐標(biāo)(0,0)就是世界坐標(biāo)的(0,0))。默認(rèn)層次若沒(méi)有聲明Z坐標(biāo),則先addchild()的在下層,后addchild()的在上層(上層覆蓋下層),默認(rèn)父節(jié)點(diǎn)在子節(jié)點(diǎn)上層。
2、getposition()獲取子節(jié)點(diǎn)坐標(biāo)時(shí),獲取到的不是世界坐標(biāo),而是節(jié)點(diǎn)坐標(biāo),也就是相對(duì)父節(jié)點(diǎn)左下角的坐標(biāo),也就是以父節(jié)點(diǎn)的左下角(錨點(diǎn)0,0)為新坐標(biāo)的原點(diǎn)形成的新坐標(biāo)。這樣很容易弄錯(cuò)的說(shuō),要獲取子節(jié)點(diǎn)世界坐標(biāo),可以用這個(gè)語(yǔ)句:要獲取CCNode *obj;的世界坐標(biāo)
CCPoint objpoint = obj->getParent()->convertToWorldSpace(obj->getPosition()));
還有一點(diǎn)容易忽略,我們?cè)趯?duì)一個(gè)節(jié)點(diǎn)進(jìn)行包裝的時(shí)候其實(shí)就是讓這個(gè)節(jié)點(diǎn)有了父節(jié)點(diǎn),例如我新建了一個(gè)map類(lèi),在map類(lèi)里面添加了兩個(gè)background精靈,這樣其實(shí)background是map的內(nèi)嵌對(duì)象,這樣map就是兩個(gè)精靈的父節(jié)點(diǎn),我取background的坐標(biāo)其實(shí)取的是相對(duì)父節(jié)點(diǎn)的坐標(biāo)。
3、對(duì)父節(jié)點(diǎn)進(jìn)行的移動(dòng)會(huì)造成它的所有子節(jié)點(diǎn)會(huì)隨著父節(jié)點(diǎn)移動(dòng),這樣結(jié)論2也驗(yàn)證了對(duì)隨父節(jié)點(diǎn)運(yùn)動(dòng)的子節(jié)點(diǎn)取getPosition()的值不會(huì)改變事實(shí).
同時(shí),對(duì)父節(jié)點(diǎn)取setScale(),子節(jié)點(diǎn)也會(huì)縮放,但是對(duì)子節(jié)點(diǎn)取getPosition()也還是沒(méi)有縮放的值,這樣會(huì)造成取得值比實(shí)際值(世界坐標(biāo)下)大一倍。
cocos2d 包裝類(lèi)和子節(jié)點(diǎn)問(wèn)題
有時(shí)候不會(huì)在scene里面直接添加精靈,而是會(huì)自己建一個(gè)精靈類(lèi),例如我要添加hero精靈,但是我不會(huì)直接在scene里面寫(xiě)
CCSprite?*hero=CCSprite::create("hero.png");
而是會(huì)自己建一個(gè)Hero類(lèi),然后在Hero類(lèi)的onEnter()函數(shù)里面寫(xiě)上上述語(yǔ)句,這樣就可以在Hero類(lèi)里面寫(xiě)上hero相關(guān)的方法,例如各種動(dòng)作。
但是這個(gè)時(shí)候會(huì)出現(xiàn)一個(gè)問(wèn)題,就是雖然Hero類(lèi)是個(gè)節(jié)點(diǎn)但是其本身并沒(méi)有可繪制東西,而是依靠其子節(jié)點(diǎn)hero來(lái)繪制,Hero類(lèi)本身是可以看成一個(gè)無(wú)限小的Node,所以對(duì)Hero的錨點(diǎn)以及位置設(shè)置時(shí),會(huì)出現(xiàn)錨點(diǎn)設(shè)置無(wú)效的情況,這樣子節(jié)點(diǎn)的坐標(biāo)始原點(diǎn)始終是Hero->setposition()的那個(gè)點(diǎn)。
如果我用setContentSIze對(duì)Hero進(jìn)行設(shè)置
Hero->setContentSize(CCSizeMake(480,360));
這樣Hero就從一個(gè)無(wú)限小的節(jié)點(diǎn)變成一個(gè)480*360的節(jié)點(diǎn),這時(shí)錨點(diǎn)的設(shè)置會(huì)有效了,且hero的坐標(biāo)原點(diǎn)變成(480*360)的左下角。
這樣也從另外的角度解釋了setcontentsize并不能改變繪制大小,改變的僅僅是在屏幕上繪制的位置的結(jié)論。
cocos2d setContentSize()不能改變繪制大小問(wèn)題
setcontentsize并不能改變繪制大小,改變的僅僅是在屏幕上繪制的位置,例如setContentSize比實(shí)際小,但是還是會(huì)全部顯示在屏幕上,一般會(huì)和setAnchorPoint一起使用,例如
map->setPosition(ccp(0,0));
map->setAnchorPoint(ccp(0,0.1));
map->setContentSize(CCSizeMake(960,620));
在屏幕上顯示效果和
map->setPosition(ccp(0,0));
map->setAnchorPoint(ccp(0,0.2));
map->setContentSize(CCSizeMake(960,310));
一樣