cocos2d js 筆記一

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));

一樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 我選擇開(kāi)發(fā)一個(gè)游戲有很多原因。我覺(jué)得自己是“核心”玩家,過(guò)去的大部分時(shí)間我都花在玩游戲,自己制作、閱讀和游戲...
    月影檀香閱讀 12,452評(píng)論 1 27
  • 前言 LinkedBlockingDeque是基于雙向鏈表的雙端有界阻塞隊(duì)列,使用非公平ReentrantLock...
    zhanglbjames閱讀 958評(píng)論 0 1
  • 探索“雙十一”支付背后的金融科技 探索“雙十一”背后的金融科技 昨天雙十一阿里巴巴交易6分58秒突破100億,10...
    shuytu閱讀 1,039評(píng)論 0 0
  • 文藝點(diǎn)說(shuō),時(shí)間就如同是白駒過(guò)隙。真的就是這樣,毫不夸張的說(shuō),我都不曉得自己是如何經(jīng)過(guò)高考到現(xiàn)在正式成為一名...
    M小馬哥大M閱讀 134評(píng)論 0 0
  • 中國(guó)股市大部分中小投資者其實(shí)都是喜歡追漲殺跌的,都是些短線投資者為主。那么在這個(gè)短線市場(chǎng)里面如果要想真的賺到錢(qián),那...
    陳仁生閱讀 222評(píng)論 0 0

友情鏈接更多精彩內(nèi)容