cocos2d-x ios遊戲開發初認識(七) 簡單的動畫
前面有一節說了幀動畫,就是讓精靈改變自己的位置、形狀、大小來實現相應的動作,這講主要是要通過一些方法來實現精靈的移動,產生各種炫麗的動畫,也可能讓你找到一點遊戲情境。
下面具體根據程式碼分析:
為了清晰最好將前幾節的代碼注釋掉。
//根據前面的知識先建立一個菜單
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.實現精靈的隱藏
<喎?http://www.bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgIENDSGlkZSAqaGlkZSA9Q0NIaWRlOjpjcmVhdGUoKTsgLy/S/rLYvqvB6TwvcD4KPHA+ICAgc3ByaXRlLT5ydW5BY3Rpb24oaGlkZSk7ICAgICAgICAgLy/Uy9DQtq+7rTwvcD4K1MvQ0CC147v3v6rKvNPOz7ejugo8cD48aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140819/2014081909105419.png" alt="\">
發現精靈隱藏了,這裡有很多動畫都可以去嘗試
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的定義
typedefvoid (CCObject::*SEL_CallFunc)(); 由此看出SEL_CallFunc 是個函數指標 指向一個沒有函數參數 函數的返回值為void的函數
下面就定義一個這樣的函數:
.h檔案:
class MainScene:publicCCLayer {
private:
void onCallFun(); //動畫執行完回掉函數
.cpp檔案 函數的實現:
voidMainScene::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 被列印出來。。。