在cocos2d-x中。精靈能夠說是一個最重要的組成元素,它代表游戲中一個最小的可見單位。同一時候也是CCNode一個最為靈活的子類,由於它能夠通過裝載一個平面紋理,從而具有豐富的表現力。
在進一步說精靈之前。有限須要理解一下紋理的概念。簡單直觀地理解,事實上紋理就是我們通常在游戲中看到的圖片,而這張圖片通過精靈這個容器顯示出來。
專業一點來說,紋理是openGL中繪制到物體表面上的圖案。在這里僅僅簡介一下,不深入了解。
精靈的創建方法比較靈活,大致能夠分為下面3種方法:
1、從文件里直接創建精靈。
這樣的方法非常easy,僅僅要知道文件所在的路徑和名稱,直接調用CCSprite的工廠方法就可以。如: CCSprite::spriteWithFile("文件完整名稱"); 當中文件名稱必須是完整路徑,用cocos2d-x生成的項目中Resources文件夾為根文件夾。
CCSprite * sprite= CCSprite::create(pszFilename);
這樣載入方式精靈會把圖片的整個區域顯示出來。另外也能夠添加圖片的顯示區域這一參數。例如以下所看到的:
CCSprite * sprite= CCSprite::create(pszFilename,CCRectMake(0, 0, 30, 30));
注意這里的rect使用的是紋理坐標系,以左上角為原點。原點向右為x的正方向,原點向下為y的正方向。
上面的代碼表示顯示出以圖片左上角為原點的30*30像素范圍的圖片區域。
對於常常被用到或者須要頻繁載入移除的一些資源。假設每次都要從文件里載入,程序的的效率會變低,因此我們能夠先把圖片資源讀到緩存中,再從緩存中載入。
2
、通過紋理去載入。
CCTexture2D*pTexture = CCTextureCache::sharedTextureCache()->addImage(pszFilename);
這個函數將一個圖片增加緩存並返回一個CCTexture2D的指針。然后就能夠
CCSprite * sprite=CCSprite::spriteWithTexture(pTexture);
同方法1一樣也能夠通過加入顯示區域的參數。
CCTextureCache
是相當於CCTexture2D的容器,是內存池。當調用它的addImage函數加入圖片時。會先依據圖片名稱去內存中查找是否已存在,是則直接取出返回。假設須要一次載入多張圖片的時候,能夠先把圖片載入到CCTextureCache中。這樣使用圖片的時候速度就會非常快了。
這樣的方法通經常使用於批處理。CCSpriteBatchNode用於批處理繪制精靈。主要是用來提高精靈的繪制效率的。須要繪制的精靈數量越多,效果越明顯。由於cocos2d-x採用opengl es繪制圖片的。opengl es繪制每一個精靈都會運行:open-draw-close流程。
而CCSpriteBatchNode是把多個精靈放到一個紋理上,繪制的時候直接統一繪制該texture,不須要單獨繪制子節點。這樣opengl es繪制的時候變成了:open-draw()-draw()…-draw()-close()。節省了多次open-close的時間。CCSpriteBatchNode內部封裝了一個CCTextureAtlas(紋理圖集,它內部封裝了一個CCTexture2D)和一個CCArray(用來存儲CCSpriteBatchNode的子節點:單個精靈)。(摘自Alex zhou的博客)
3
、通過幀緩存中的一幀名稱去載入。
SpriteFrame是把一個大的圖片划分掉。每個矩形區域就是一個SpriteFrame。事實上假設這個SpriteFrame在大圖中的矩形區域已知的話,能夠直接使用CCTexture2D的方式,使用CCRect參數。SpriteFrame給我們提供了一種快捷,簡便的方式,就是將這個矩形區域信息保存到plist文件里,並通過一個名稱作為索引。
生成這樣的大圖也有非常多工具,Zwoptex是一個在線的免費工具。TexturePacker一個收費軟件,只是免費版也能滿足主要的須要。也能夠給作者發郵件獲取一個license。這兩種工具能夠生成一個.plist文件和一個圖片文件。存放的時候講這兩個關聯的文件放在同一個文件夾下。
在須要使用的時候,我們能夠將它載入到緩存中:
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("XX.plist");
CCSpriteFrameCache
它是管理CCSpriteFrame的內存池,跟CCTextureCache功能一樣,只是跟CCTextureCache不同的是,假設內存池中不存在要查找的幀,它會提示找不到。而不會去本地載入圖片。
然后能夠用兩種方式載入
CCSprite * sprite
=CCSprite::spriteWithSpriteFrame(pCache->spriteFrameByName(szFrameName));
CCSprite * sprite
= CCSprite::spriteWithSpriteFrameName(szFrameName);
看起來第一個函數比較麻煩,實際上,第二個函數調用的是第一個函數。值得說明的是,這里的szFrameName不須要完整路徑,而是文件名稱索引。
精靈載入完了就改各種使用了。
(接下來的內容摘自Wander的博客,在此表示感謝)
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); // 豎直翻轉