Cocos2dx 幀動畫播放動作類-Animate
為了滿足開發者需求,靜態的精靈是無法表達出什麼的,很多遊戲中的角色都有自己的幀動畫來表達不同狀況的下該表現出的動作表現,這個時候就需要用到Cocos2dx中實現幀動畫的一種策略,就是換幀精靈。
所謂換幀精靈是指每一個精靈不是僅含又一副貼圖,而是含有一系列的貼圖,這一系列畫面連續播放就可以產生幀動畫效果。
想要開發出由多個動畫幀組成的換幀精靈,首先要明白代表精靈幀的類SpriteFrame。每個SpriteFrame代表了一個精靈動畫幀。
SpriteFrame類的一些方法:
①建立、初始化SpriteFrame
static SpriteFrame* create(const std::string& filename,const Rect& rect) //建立一個精靈幀物件,引數一是圖片路徑,引數二是確定矩形區域並從圖片中剪出來作為精靈幀顯示的內容。
static SpriteFrame* create(const std::string& filename,const Rect& rect,bool rotated,const Point& oferrset,const Size& originalSize) //建立一個精靈幀物件,引數一是圖片路徑,引數二是確定矩形區域並從圖片中剪出來作為精靈幀顯示的內容,引數三是是否旋轉,引數四是精靈幀偏移量,引數無表示修剪前的原始畫素尺寸。
static SpriteFrame* createWithTexture(Texture2D* pobTexture,const Rect& rect) //建立一個精靈幀物件,引數一是紋理圖快取,引數二是確定矩形區域並從圖片中剪出來作為精靈幀顯示的內容。
static SpriteFrame* createWithTexture(Texture2D* pobTexture,const Rect& rect,bool rotated,const Point& oferrset,const Size& originalSize)//建立一個精靈幀物件,引數一是紋理圖快取,引數二是確定矩形區域並從圖片中剪出來作為精靈幀顯示的內容,引數三是是否旋轉,引數四是精靈幀偏移量,引數無表示修剪前的原始畫素尺寸。
bool initWithTexture(Texture2D* pobTexture,const Rect& rect) //初始化一個精靈物件,引數一是紋理圖快取,引數二是確定矩形區域並從圖片中剪出來作為精靈幀顯示的內容。
bool initWithTexture(Texture2D* pobTexture,const Rect& rect,bool rotated,const Point& oferrset,const Size& originalSize)初始化一個精靈物件,引數一是紋理圖快取,引數二是確定矩形區域並從圖片中剪出來作為精靈幀顯示的內容,引數三是是否旋轉,引數四是精靈幀偏移量,引數無表示修剪前的原始畫素尺寸。
bool initWithTextureFilename(const std::string& filename,const Rect& rect,bool rotated,const Point& oferrset,const Size& originalSize)初始化一個精靈物件,引數一是圖片路徑,引數二是確定矩形區域並從圖片中剪出來作為精靈幀顯示的內容,引數三是是否旋轉,引數四是精靈幀偏移量,引數無表示修剪前的原始畫素尺寸。
②功能方法
const Rect& getRect() //獲取剪裁矩形區域。
void setRect(const Rect& rect) //設定剪裁區域。
cosnt Point& getOffsetInPixels(void) //獲取以畫素為單位的精靈幀位置偏移量。
void setOffsetInPixels(const Point& offsetInPixels) //設定以畫素為單位的精靈幀偏移量。
const Size& getOriginalSizeInPixels(void) //獲取精靈幀原始畫素。
void setOriginalSizeInPixels(const Size& sizeInPixels) //設定精靈幀在修剪之前的原始尺寸,引數一是要設定的目標尺寸。
bool isRotated(void) //獲取精靈幀是否旋轉並將結果返回。
void setRotated(bool rotated) //設定精靈幀是否旋轉,引數一是true時旋轉。
Texture2D * getTextrue() //獲取精靈幀對應的紋理圖。
void setTexture(Texture2D* pobTexture) //獲取精靈幀對應的紋理圖,引數一是紋理圖快取。
對精靈幀的封裝,動畫幀AnimationFrame,通過其可以對每一幀動畫進行更細緻的控制,有需要的時候可以用,無必要可以直接使用精靈幀
AnimationFrame基本方法:
static AnimationFrame* create(SpriteFrame* spriteFrame,float delayUnits,const ValueMap& userInfo) //建立一個動畫幀物件,引數一是精靈幀指標,引數二是動畫幀時間間隔,引數三是使用者資料。
SpriteFrame* getSpriteFrame() //獲取包含的精靈幀物件。
void setSpriteFrame(SpriteFrame* frame) //設定包含的精靈類幀物件。
但精靈幀不過只是一個畫面,要將一系列的幀組裝成動畫,Animation類絕不可少。
Animation中常用的方法
static Animation* createWithSpriteFrames(const Vector<SpriteFrame*>& arrayOfSpriteFrameNames,float delay=0.0f,unsigned int loops=1) //建立一個精靈幀動畫物件,引數一是存放多個精靈幀的容器,第二引數表示精靈幀之間的時間間隔,引數三是迴圈次數。
static Animation* create(const Vector<AnimationFrame*>& arrayOfSpriteFrameNames,float delayPerUnit,unsigned int loops=1) //建立一個精靈幀動畫物件,引數一是存放多個精靈幀的容器,第二引數表示各單元的時間間隔,引數三是迴圈次數。
void addSpriteFrame(SpriteFrame * frame) //向動畫中新增一個精靈幀。
void addSpriteFrameWithFile(const std::string& filename) //向動畫新增一個精靈幀,引數為檔案路徑。
void addSpriteFrameWithTexture(Texture2D* pobTexture,const Rect& rect) //想動畫新增精靈幀,引數一是紋理圖快取,引數二是裁剪區域。
void setDelayPerUnit(float delayPerUnit) //設定每個單元間間隔。
float getDelayPerUnit() //獲取每個單元間間隔。
bool getRestoreOriginalFrame() //判斷在動畫結束時是否恢復原始幀。
void setRestoreOriginalFrame(bool restoreOriginalFrame) //設定在動畫結束識是否恢復原始幀,引數ture時恢復。
將各個SpriteFrame組裝成Animation後,需要一個動作類去包裝執行Animation。而這個類就是Animate。
Animate是ActionInterval的子類,屬於有變化過程動作,其相關方法如下。
static Animate* create(Animation* animation) //建立一個動畫動作物件,引數是Animation類指標。
void setAnimation(Animation* animation) //設定該動作要播放的幀動畫。
Animation* getAnimation() //獲取播放的幀動畫。
如何播放精靈幀動畫例項:
Sprite* sprite = Sprite::create("a.png");//建立精靈例項
SpriteFrame* frame1 = SpriteFrame::create("a.png");//建立動畫幀1
SpriteFrame* frame2 = SpriteFrame::create("b.png");//建立動畫幀1
Vector<SpriteFrame*> frameGroup;//建立一個存放精靈幀的容器
frameGroup->push(frame1);
frameGroup->push(frame2);
Animation* animation = Animation::create(frameGroup,0.1f,5);//建立一個以容器frameGroup內的精靈幀做的動畫,每幀間隔0.1秒,迴圈5次。
sprite->runAction(Animate::create(animation)); //執行播放動畫動作,播放幀動畫。