cocos2d getPosition()取不到實(shí)際坐標(biāo)問題
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)層次若沒有聲明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ò)的說,要獲取子節(jié)點(diǎn)世界坐標(biāo)胸完,可以用這個(gè)語句:要獲取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類爆惧,在map類里面添加了兩個(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()也還是沒有縮放的值,這樣會(huì)造成取得值比實(shí)際值(世界坐標(biāo)下)大一倍浸剩。
cocos2d 包裝類和子節(jié)點(diǎn)問題
有時(shí)候不會(huì)在scene里面直接添加精靈钾军,而是會(huì)自己建一個(gè)精靈類,例如我要添加hero精靈绢要,但是我不會(huì)直接在scene里面寫
CCSprite?*hero=CCSprite::create("hero.png");
而是會(huì)自己建一個(gè)Hero類吏恭,然后在Hero類的onEnter()函數(shù)里面寫上上述語句,這樣就可以在Hero類里面寫上hero相關(guān)的方法重罪,例如各種動(dòng)作樱哼。
但是這個(gè)時(shí)候會(huì)出現(xiàn)一個(gè)問題,就是雖然Hero類是個(gè)節(jié)點(diǎn)但是其本身并沒有可繪制東西剿配,而是依靠其子節(jié)點(diǎn)hero來繪制搅幅,Hero類本身是可以看成一個(gè)無限小的Node,所以對(duì)Hero的錨點(diǎn)以及位置設(shè)置時(shí)惨篱,會(huì)出現(xiàn)錨點(diǎn)設(shè)置無效的情況盏筐,這樣子節(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è)無限小的節(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()不能改變繪制大小問題
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));
一樣