關於Cocos2d-x節點和精靈節點的坐標、位置以及大小的設置


1.cocos2d-X中的坐標(0,0),就是運行框的左下角位置,所以運行框看起來就是一個第一象限。

 

2.節點的錨點就是我們setPosition所設定的位置,默認錨點是在節點的中心,也就是setPosition方法設定的坐標的位置,比如setPosition(visibleSize.width/2,visibleSize.height/2),就是把圖片放在運行框的最中央。

 

3.如果想改變錨點,可以用setAnchorPoint方法來設定,setAnchorPoint的坐標是以節點(圖片)為相對的坐標系,比如sprite->setAnchorPoint(Vec2(0, 0)),就是把錨點設定在sprite節點的左下角,這時候如果再sprite->setPosition(0,0),就會把圖片放在運行框的左下角。再比如sprite->setAnchorPoint(Vec2(0.5, 0.5)),就是把錨點設定在sprite節點的中心,這時候如果再sprite->setPosition(visibleSize.width/2,visibleSize.height/2),就會把圖片放在運行框中心。

 

4.sprite->getContentSize()方法是獲得sprite節點的大小,是一個Vec2類型的值,有width和height的屬性。

 

注意:

1.setAnchorPoint方法的參數只有一個,就是一個Vec2類型的變量,而且參數是Vec(0到1,0到1)的常量,不能用變量,Vec2(0,0)表示把錨點設置在節點左下角,Vec2(1,1)表示把錨點設置在節點右上角,Vec2(0.5,0.5)表示把錨點設置在節點中心,以此類推。

2.繼承自Node類型的節點的初始錨點在左下角Vec2(0,0),繼承自Sprite類型的節點的初始錨點在中心Vec2(0.5,0.5)

2.繼承自Node類型的節點的初始錨點在左下角Vec2(0,0),繼承自Sprite類型的節點的初始錨點在中心Vec2(0.5,0.5)

2.繼承自Node類型的節點的初始錨點在左下角Vec2(0,0),繼承自Sprite類型的節點的初始錨點在中心Vec2(0.5,0.5)

 

 

 

 

 

setTextureRect(Rect(0, 0, 50, 50));方法是設置精靈節點的紋理的初始位置和初始大小,比如這時候Rect(0, 0, 50, 50)就表示,初始的精靈節點是在屏幕坐標(0,0)也就是左下角的位置,大小方面,寬是50,高是50,由於一般在實例化創建對象后,都會規范化地另外使用setPosition方法來設置節點的位置,所以這個setTextureRect(Rect(0, 0, 50, 50));里面的初始位置的設置在我看來沒什么意義。這個方法主要是設置一些純色的精靈節點的時候會用到,把紋理設置成(50,50)大小的純色。如果后面有用到setTexture方法來改變紋理,那么setTextureRect的紋理大小(50,50)會被覆蓋。

 

setTexture("s_1.png");方法是設置精靈節點的紋理圖案,同時會自動把圖案的大小設置成精靈節點紋理的大小,這個方法也會覆蓋setTextureRect(Rect(0, 0, 50, 50));中設置設置精靈節點的紋理的初始大小的方法,也就是里面的(50,50)沒有作用,被s_1.png這個圖案本身的大小(自己PS設置的)給覆蓋了。

 

getContentSize()方法是獲得未轉換的節點的大小,就是未經過縮放旋轉的節點或者精靈節點的大小。如果是繼承自Node的普通節點,那么獲得的就是setContentSize()所設置的大小,如果是繼承自Sprite的精靈節點,那么獲得的就是紋理的大小,如果紋理是用setTexture("s_1.png");設置的圖案紋理,那么獲得的大小就是圖片的大小,如果紋理是setTextureRect(Rect(0, 0, 50, 50));設置的純色紋理,那么獲得的大小就是(50,50)。

 

setContentSize()方法是設置未轉換的節點的大小,設置的值就是還沒有經過縮放旋轉的節點或者精靈節點的大小,以后縮放或者旋轉都會以這個值為原始的比例值。繼承自Node的節點比較常用,繼承自Sprite的精靈節點一般不用,而是用setTexture("s_1.png");里面的圖片大小作為精靈節點的大小。

 


setScale(0.5);方法會把節點或者精靈節點進行縮放,這個效果還會作用於該節點的所有子節點。0.5就是縮一半,1就是原始大小,2就是擴大一倍。如果是節點的話在縮放后,節點大小會改變,如果是精靈節點的話在縮放后,圖片大小和精靈節點大小都會改變,不過一般圖片大小是等於精靈節點大小的。

 

setScaleX(0.5);方法會把節點或者精靈節點的寬度進行縮放,這個效果還會作用於該節點的所有子節點。0.5就是縮一半,1就是原始大小,2就是擴大一倍。如果是節點的話在縮放后,節點大小會改變,如果是精靈節點的話在縮放后,圖片大小和精靈節點大小都會改變,不過一般圖片大小是等於精靈節點大小的。是以錨點為定點開始擴展延伸的。

 

setScaleY(0.5);方法會把節點或者精靈節點的高度進行縮放,這個效果還會作用於該節點的所有子節點。0.5就是縮一半,1就是原始大小,2就是擴大一倍。如果是節點的話在縮放后,節點大小會改變,如果是精靈節點的話在縮放后,圖片大小和精靈節點大小都會改變,不過一般圖片大小是等於精靈節點大小的。是以錨點為定點開始擴展延伸的。

 

setVisible(false);方法會把精靈節點的紋理變得不可見,就是圖片資源看不見,但是如果已經綁定了一個剛體的話,在有調試框的情況下還是可以看見剛體,也就是說剛體不會隱藏起來,而隱藏剛體就必須用物理引擎類中的隱藏剛體的方法。

 

 setPosition();方法設置節點或者精靈節點的位置,如果沒有寫這句話直接addchild的話是默認設置位置為(0,0)。

 

注意:

如果在繼承自Sprite的精靈節點的初始化中,已經用setTexture("s_1.png");設置了它的紋理圖案和節點大小(大小是自動適配圖片大小的),這時候如果再用

Size s = Size(180, 180);
setContentSize(s);

來強行設置一個Size類型的變量s,再強行設置精靈節點的大小,如果這個s的大小和圖片的大小不一致,而我們又用

setPhysicsBody(PhysicsBody::createBox(this->getContentSize()));來設置精靈節點的物理剛體的時候,

就會出現圖片和剛體邊界錯位的情況。所以最好是不要設置完圖片紋理后,又自己去人為修改精靈節點的大小。如果非要用這個方法的話,就把變量s的值設置成和圖片s_1.png一樣的大小,或者比圖片稍微小一點,這樣可以去除一些空白的區域,這樣設置剛體檢測碰撞的時候就更加精確。

 

 

 

 注意

getContentSize();

獲取精靈的邏輯尺寸。此值不受縮放變換影響。即setScale()方法不影響此值

 

boundingBox().size;

獲取精靈的邊框尺寸。此值受到縮放變換影響。

 

getTexture()->getContentSizeInPixels();

獲取精靈的紋理的像素尺寸。

 

像素點和邏輯點關系:邏輯點大小 = 像素大小/contentScale

例子:

 

Size sizeByContentSize = pBackground->getContentSize();
Size sizeByboundingBox = pBackground->boundingBox().size;
Size sizeByPoints = pBackground->getTexture()->getContentSizeInPixels();

LOG("sizeByContentSize:width:%f height:%f",sizeByContentSize.width,sizeByContentSize.height);
LOG("sizeByboundingBox:width:%f height:%f",sizeByboundingBox.width,sizeByboundingBox.height);
LOG("sizeByPoints:width:%f height:%f",sizeByPoints.width,sizeByPoints.height);

pBackground->setScale(2);
LOG("轉變后:");

sizeByContentSize = pBackground->getContentSize();
sizeByboundingBox = pBackground->boundingBox().size;
sizeByPoints =pBackground->getTexture()->getContentSizeInPixels();

LOG("sizeByContentSize:width:%f height:%f",sizeByContentSize.width,sizeByContentSize.height);
LOG("sizeByboundingBox:width:%f height:%f",sizeByboundingBox.width,sizeByboundingBox.height);
LOG("sizeByPoints:width:%f height:%f",sizeByPoints.width,sizeByPoints.height);

 

 

Cocos2d: sizeByContentSize:width:114.000000 height:114.000000

Cocos2d: sizeByboundingBox:width:114.000000 height:114.000000

Cocos2d: sizeByPoints:width:114.000000 height:114.000000

Cocos2d: 轉變后:

Cocos2d: sizeByContentSize:width:114.000000 height:114.000000

Cocos2d: sizeByboundingBox:width:228.000000 height:228.000000

Cocos2d: sizeByPoints:width:114.000000 height:114.000000

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM