一般欲實現手機動畫大都多採用Cocos2d-x內部所提供之動畫類別來實作,此種作法比較制式化且無彈性,換言之,展現出來的動畫可能與他人大同小異,無法突顯出獨具的特色,對遊戲創造而言無引人入勝之新穎感,故自訂動畫是遊戲開發過程中必須學會之一門技巧。
此篇文章主要實現一個精靈執行載入多個圖片資源,使之達到動畫之效果(有點類似Flash技巧),將結果截取部份圖示展示如下(真實效果須於模擬器或真機上執行才能看出):
圖片資源之原稿分別列舉如下:【此參考《捕魚達人》和《魔塔》所截錄取得】
下面動畫代碼是設計人物呈現一直走動之情況:(解析代碼並思考其運用技巧,此非我原創,是網路某位高手改寫Flash程式而來─當想用之動畫技術已有現有模組或樣式可直接套用,但要徹底分析其設計代碼學會其精髓)。
CCTexture2D *pTexture=CCTextureCache::sharedTextureCache()->addImage("hero.png");
CCSpriteFrame *frame0=CCSpriteFrame::createWithTexture(pTexture,CCRectMake(0,0,32,32));
CCSpriteFrame *frame1=CCSpriteFrame::createWithTexture(pTexture,CCRectMake(32,0,32,32));
CCSpriteFrame *frame2=CCSpriteFrame::createWithTexture(pTexture,CCRectMake(64,0,32,32));
CCSpriteFrame *frame3=CCSpriteFrame::createWithTexture(pTexture,CCRectMake(96,0,32,32));
CCArray *animFrames=CCArray::create();
CC_BREAK_IF(!animFrames);
animFrames->addObject(frame0);
animFrames->addObject(frame1);
animFrames->addObject(frame2);
animFrames->addObject(frame3);
CCAnimation *animation=CCAnimation::createWithSpriteFrames(animFrames,0.2f);
CC_BREAK_IF(!animation);
CCSprite *heroSprite0=CCSprite::createWithSpriteFrame(frame0);
CC_BREAK_IF(!heroSprite0);
heroSprite0->setPosition(ccp(100,100));
addChild(heroSprite0,1);
CCAnimate *animate=CCAnimate::create(animation);
heroSprite0->runAction(CCRepeatForever::create(animate)); //人物走動
下為另種方法實現動畫之技巧:
CCAnimation* animation2 = CCAnimation::create();
for(int i=1;i<19;i++)
{
char *tt=new char[3];
memset(tt,0,3);
std::string s;
if(i<10)
{
itoa(i,tt,10);
s="fish00"+std::string(tt);
}
else
{
itoa(i,tt,10);
s="fish0"+std::string(tt);
}
s=s+".png";
CCTexture2D *playerRunTexture =
CCTextureCache::sharedTextureCache()->addImage(s.c_str());
animation2->addSpriteFrame(CCSpriteFrame::createWithTexture(playerRunTexture,
cocos2d::CCRectMake(0, 0, 100, 100)));
delete []tt;
}
animation2->setDelayPerUnit(0.2f);
CCAnimate* action =
CCAnimate::create(animation2);
CCTexture2D *playerRunTexture0 =
CCTextureCache::sharedTextureCache()->addImage("fish001.png");
CCSprite *p=CCSprite::createWithSpriteFrame(CCSpriteFrame::createWithTexture(playerRunTexture0, cocos2d::CCRectMake(0, 0, 100, 100)));
p->setPosition(ccp(200,200));
addChild(p,1);
p->runAction(CCRepeatForever::create(action));
最後貼出init()函數的全部代碼供對照用:
bool HelloWorld::init()
{
mPercentage=100;
bool bRet = false;
do
{
CC_BREAK_IF(!
CCLayer::init());
CCTexture2D *pTexture=CCTextureCache::sharedTextureCache()->addImage("hero.png");
CCSpriteFrame *frame0=CCSpriteFrame::createWithTexture(pTexture,CCRectMake(0,0,32,32));
CCSpriteFrame *frame1=CCSpriteFrame::createWithTexture(pTexture,CCRectMake(32,0,32,32));
CCSpriteFrame *frame2=CCSpriteFrame::createWithTexture(pTexture,CCRectMake(64,0,32,32));
CCSpriteFrame *frame3=CCSpriteFrame::createWithTexture(pTexture,CCRectMake(96,0,32,32));
CCArray *animFrames=CCArray::create();
CC_BREAK_IF(!animFrames);
animFrames->addObject(frame0);
animFrames->addObject(frame1);
animFrames->addObject(frame2);
animFrames->addObject(frame3);
CCAnimation *animation=CCAnimation::createWithSpriteFrames(animFrames,0.2f);
CC_BREAK_IF(!animation);
CCSprite *heroSprite0=CCSprite::createWithSpriteFrame(frame0);
CC_BREAK_IF(!heroSprite0);
heroSprite0->setPosition(ccp(100,100));
addChild(heroSprite0,1);
CCAnimate *animate=CCAnimate::create(animation);
heroSprite0->runAction(CCRepeatForever::create(animate));//人物走動
CCActionInterval *en=CCRotateBy::create(5,-360);
CCSprite *hua=CCSprite::create("end.png");
hua->setPosition(ccp(240,160));
addChild(hua,1);
hua->runAction(CCRepeatForever::create(en));
CCAnimation* animation2 =
CCAnimation::create();
for(int i=1;i<19;i++)
{
char *tt=new char[3];
memset(tt,0,3);
std::string s;
if(i<10)
{
itoa(i,tt,10);
s="fish00"+std::string(tt);
}
else
{
itoa(i,tt,10);
s="fish0"+std::string(tt);
}
s=s+".png";
CCTexture2D *playerRunTexture =
CCTextureCache::sharedTextureCache()->addImage(s.c_str());
animation2->addSpriteFrame(CCSpriteFrame::createWithTexture(playerRunTexture,
cocos2d::CCRectMake(0, 0, 100, 100)));
delete []tt;
}
animation2->setDelayPerUnit(0.2f);
CCAnimate* action =
CCAnimate::create(animation2);
CCTexture2D *playerRunTexture0 =
CCTextureCache::sharedTextureCache()->addImage("fish001.png");
CCSprite *p=CCSprite::createWithSpriteFrame(CCSpriteFrame::createWithTexture(playerRunTexture0, cocos2d::CCRectMake(0, 0, 100, 100)));
p->setPosition(ccp(200,200));
addChild(p,1);
p->runAction(CCRepeatForever::create(action));
bRet = true;
} while (0);
return bRet;
}



.png)














.png)