前面有一節說了幀動畫,就是讓精靈改變自己的位置、形狀、大小來實現相應的動作,這講主要是要通過一些方法來實現精靈的移動,產生各種炫麗的動畫,也可能讓你找到一點遊戲場景。
下面具體根據代碼分析:
爲了清晰最好將前幾節的代碼註釋掉。
//根據前面的知識先創建一個菜單
CCMenuItemFont *item =CCMenuItemFont::create("開始遊戲",this, menu_selector(MainScene::onMenuItem));//點擊事件
//添加到菜單欄裏面
CCMenu *menu = CCMenu::create(item,NULL);//可以傳多個
menu->setPosition(ccp(100,500));
this->addChild(menu);
//創建一個精靈
sprite = CCSprite::create("Icon-72.png");
sprite->setPosition(ccp(300,300));
this->addChild(sprite);
運行:在onMenuItem函數裏實現一些動畫:
//1.實現精靈的隱藏
CCHide *hide =CCHide::create(); //隱藏精靈
sprite->runAction(hide); //運行動畫
運行 點擊開始遊戲:發現精靈隱藏了,這裏有很多動畫都可以去嘗試
CCHide *hide =CCHide::create(); //隱藏精靈
CCFadeTo *to = CCFadeTo::create(2,0); //0~255 淡入淡出用時2s
CCMoveTo *toto = CCMoveTo::create(2,ccp(500, 300)); //移動到某個點用時2s
CCMoveBy *toby = CCMoveBy::create(2,ccp(300, 0)); //2秒增加 x加300 y不變
CCJumpBy *by =CCJumpBy::create(2,ccp(100,0), 200, 1);//2秒鐘內跳到x,y爲(300,0)的位置每次會跳200高一共跳30次
sprite->runAction(hide); //運行動畫
這些是一些基礎的動畫 都可以去嘗試 截圖看不到明顯的效果,只要sprite->runAction(hide) 改括號裏面內容。//2.實現一個簡單的軌跡
軌跡圖片:
//實現一個軌跡
CCPointArray *pa =CCPointArray::create(5);//創建一個點數組
pa->addControlPoint(ccp(0,0));
pa->addControlPoint(ccp(100,0)); //向右移動
pa->addControlPoint(ccp(100, -50));//向下移動
pa->addControlPoint(ccp(150, -50));//向右移動
pa->addControlPoint(ccp(150,0)); //向向移動
pa->addControlPoint(ccp(300,0)); //向右移動
CCCardinalSplineBy *spby =CCCardinalSplineBy::create(5, pa,1); //按軌跡移動
sprite->runAction(spby); //運行一個動畫
運行://3.實現一個曲線
代碼:
//用Bezier實現曲線運動
ccBezierConfig bc;
bc.controlPoint_1 =ccp(400, 400); //控制點1
bc.controlPoint_2 =ccp(800, 200); //控制點2
bc.endPosition =ccp(900, 300); //終點
CCBezierTo *bezie = CCBezierTo::create(3, bc); //傳引用
sprite->runAction(bezie); //運行一個動畫
運行:自己運行才能看到效果!!!
//4.通過CCSequence 實現組合動畫 順序執行
//用CCSequence實現組合動畫 順序執行
CCMoveTo *tototo = CCMoveTo::create(2,ccp(900, 300));//移動
CCEaseSineIn *in = CCEaseSineIn::create(tototo); //控制速度先慢後快可以加可以不加試試
CCBlink *blink = CCBlink::create(3,10); //閃爍一個動畫
CCDelayTime *delay =CCDelayTime::create(2);
CCSequence *sequence = CCSequence::create(in,delay,blink,NULL);//組合動畫按順序執行 先移動 然後延時 最後閃爍
sprite->runAction(sequence); //運行一個動畫
運行:自己運行才能看到效果!!!
//5.通過CCSpawn 實現組合動畫
並行執行
//並行執行動畫
CCMoveTo *totototo = CCMoveTo::create(2, ccp(900, 300));
CCRotateBy *rotate = CCRotateBy::create(2, 3600); //旋轉 3600度
CCSpawn *spawn = CCSpawn::create(totototo,rotate,NULL);
sprite->runAction(spawn);
運行:
自己運行才能看到效果!!!
//6.動畫執行完畢 可以進行回掉
先看 CCCallFunc 類的創建:
CCCallFunc *func = CCCallFunc::create(this, <#SEL_CallFunc selector#>) SEL_CallFunc的定義
typedef void (CCObject::*SEL_CallFunc)(); 由此看出SEL_CallFunc 是個函數指針 指向一個沒有函數參數 函數的返回值爲void的函數
下面就定義一個這樣的函數:
.h文件:
class MainScene:public CCLayer {
private:
void onCallFun(); //動畫執行完 回掉函數
.cpp文件 函數的實現:
void MainScene::onCallFun()
{
CCLOG("action over");
}
只做了一個打印。。下面看回掉的具體實現代碼:
//並行執行動畫
CCMoveTo *totototo = CCMoveTo::create(2, ccp(900, 300));
CCRotateBy *rotate = CCRotateBy::create(2, 3600); //旋轉 3600度
CCSpawn *spawn = CCSpawn::create(totototo,rotate,NULL);
// sprite->runAction(spawn);
//動畫執行完後 回掉
CCCallFunc *func = CCCallFunc::create(this, callfunc_selector(MainScene::onCallFun));
CCSequence *seq = CCSequence::create(spawn,func,NULL); //添加到隊列
sprite->runAction(seq);
運行:可以看到 當動畫執行完後 action over 被打印出來。。。