精靈是2D游戲中得主角,這次就總結一下cocos2d-x中精靈的使用。
一,加載
首先,創建一個變量 CCSprite *pSprite;
加載函數分為兩組initWithXXXX和spriteWithXXXX,其主要的區別是使用initWithXXXX的手工作業,而spriteWithXXXX是純自動化作業。在SpriteWithXXXX中,先分配內存,然后加載,最后加入到autorelease中。而前者只有加載的部分,分配內存以及釋放都需要靠自己。下邊全部以spriteWithXXXX函數說明。
1,從文件中直接加載
從文件中加載很簡單,只需要 CCSprite::spriteWithFile("文件完整名稱"); 其中文件名必須是完整路徑,用cocos2d-x生成的項目中Resources目錄為根目錄。若有一個文件目錄為..\Resources\chars\a.png 則 文件名部分就應該為"chars/a.png"。值得注意的是,在WINDOWS下,后綴名大寫小寫無所謂,但是在MAC下,后綴的大小寫必須與文件完全一致,否則無法加載。
此函數還有一個重載函數,后邊多一個CCRect參數,可以通過此參數設定加載圖片中某個矩形區域。
2,間接加載
有些經常被用到或者需要頻繁加載移除的一些資源,如果每次都從文件中加載,程序的效率會變得非常低,通常的做法是將這些文件先讀到緩存中,然后再從緩存中加載。
CCTexture2D *pTexture = CCTextureCache::sharedTextureCache()->addImage(pszFilename);
這個函數將一個圖片加入緩存並返回一個CCTexture2D的指針。然后就可以
pSprite = CCSprite::spriteWithTexture(pTexture);
如果一個資源已經被加入到了緩存,addImage是不會再加一遍的。程序中我很少會直接用spriteWithTexture這個函數,因為需要保存pTexture的指針。而在spriteWithFile函數中起內部就已經使用了上述過程。
另一種間接加載方法是利用SpriteFrame。SpriteFrame是把一個大的圖片划分掉,每一個矩形區域就是一個SpriteFrame。其實如果這個SpriteFrame在大圖中的矩形區域已知的話,可以直接使用CCTexture2D的方式,使用CCRect參數。SpriteFrame給我們提供了一種快捷,簡便的方式,就是將這個矩形區域信息保存到plist文件中,並通過一個名稱作為索引。生成這種大圖也有很多工具,我使用過兩種工具,一個是 Zwoptex 是一個在線的免費工具,另一個我常用的是 TexturePacker。這是一個收費軟件,不過免費版也能滿足基本的需要。這兩種工具可以生成一個.plist文件和一個圖片文件。存放的時候講這兩個關聯的文件放在同一個目錄下。在需要使用的時候,我們可以將它加載到緩存中:
CCSpriteFrameCache *pCache = CCSpriteFrameCache::sharedSpriteFrameCache();
pCache->addSpriteFramesWithFile("XXXX.plist");
其中plist文件的路徑是完整路徑。
然后可以用兩種方式加載
pSprite = CCSprite::spriteWithSpriteFrame(pCache->spriteFrameByName(szFrameName));
pSprite = CCSprite::spriteWithSpriteFrameName(szFrameName);
看起來第一個函數比較麻煩,實際上,第二個函數調用的是第一個函數。。。。值得說明的是,這里的szFrameName不需要完整路徑,而是文件名索引。
二,常用操作
精靈加載完了就改各種使用了。
1,錨點
錨點就是所有旋轉,移動,縮放的參考點。cocos2-x中默認的錨點是中心點。錨點用比例來表示范圍為0-1,(0,0)點代表左下點,(1,1)代表右上點。設置的函數為setAnchorPoint(ccp(0.5, 0.5));
2,旋轉
setRotation(angle) 其中angle為角度不是弧度。正數為順時針旋轉,負數為逆時針旋轉。
3,位置
setPosition(ccp(xPos, yPos)) xPos和yPos為相對於父節點錨點的位置。
4,縮放
setScale(s); // 整體縮放
setScaleX(s); // 原圖片坐標X軸縮放
setScaleY(s); // 原圖片坐標Y軸縮放
s為比例,s = 1表示原尺寸。
5,傾斜
setSkewX(s); // 原圖片坐標X軸傾斜
setSkewY(s); // 原圖片坐標Y軸傾斜
X軸向右為正,Y軸向上為正。
6,透明度
setOpacity(s);
s范圍0-255,0完全透明,255完全不透明。
7,可見
setIsVisible(bVisible)
bVisible為bool值true代表可見false代表不可見
8,翻轉
setFlipX(bFlip); // 水平翻轉
setFlipY(bFlip); // 豎直翻轉
bFlip為true,則圖片翻轉,false不翻轉。注意,翻轉是針對原圖片的操作,水平翻轉相當於在圖片編輯軟件里水平翻轉一樣。不根據錨點進行翻轉。翻轉以后,設置的以前設置的錨點不會隨着圖片的翻轉而改變。比如設置右下角為錨點,則翻轉以后,錨點為翻轉后的圖片的右下角(是不是有點繞?)
最后,初始化完成后,不要忘了使用addChild加入到父節點,否則是不會顯示的。