bada 2D游戏编程之十——关键帧动画原理
bada 2D游戲編程之十——關(guān)鍵幀動(dòng)畫原理
?
前面提到的逐幀動(dòng)畫有一個(gè)關(guān)鍵的缺點(diǎn)就是需要為動(dòng)畫中的每一幀都提供一張單獨(dú)的圖片,由于每一幀的圖片都需要單獨(dú)提供,制作起來比較麻煩,圖片量也比較大。用關(guān)鍵幀動(dòng)畫可以很好的解決這個(gè)問題,下面就給大家進(jìn)行講解bada平臺(tái)的關(guān)鍵幀動(dòng)畫。
?
1, 什么是關(guān)鍵幀動(dòng)畫
關(guān)鍵幀動(dòng)畫的原理是只需要提供一張圖片(或者對象),然后對這張圖片(或者對象)進(jìn)行處理產(chǎn)生出不同的效果,例如進(jìn)行放縮處理產(chǎn)生出大小不同的效果,還有進(jìn)行透明度處理產(chǎn)生出透明度不同的效果等,連續(xù)播放處理出來的效果就形成了動(dòng)畫。
往往這種處理的效果有限,只能進(jìn)行一些常規(guī)的處理,如改變大小、透明度、位置、角度等,所以關(guān)鍵幀動(dòng)畫不適合表現(xiàn)復(fù)雜的變形,例如在逐幀動(dòng)畫中提到的描述一株向日葵從苗芽狀態(tài)成長到綻放花朵的過程動(dòng)畫就不能用關(guān)鍵幀動(dòng)畫來完成,因?yàn)檫@個(gè)動(dòng)畫中的效果不是僅僅通過變形就能實(shí)現(xiàn)的,而是需要對圖片中內(nèi)容的改變,這種情況下就只有采用逐幀動(dòng)畫了。
下面給大家描述如何用一張圖片來實(shí)現(xiàn)一個(gè)動(dòng)畫。
這是提供的一張金魚的圖片,
?
然后用關(guān)鍵幀動(dòng)畫來實(shí)現(xiàn)這條金魚從小長到大的變化過程,
?
?
?
這個(gè)動(dòng)畫就是對提供的圖片進(jìn)行大小的改變來實(shí)現(xiàn)的,不需要對每個(gè)大小的圖片都提供一張圖片,中間圖片的產(chǎn)生交給系統(tǒng)去處理,節(jié)省了很多的工作量。
?
2, 相關(guān)概念
關(guān)鍵幀動(dòng)畫是對圖片(或者對象)的屬性值進(jìn)改變,一般可以改變的屬性為大小、透明度、位置坐標(biāo)和旋轉(zhuǎn)角度等,這樣來理解的話,關(guān)鍵幀動(dòng)畫也可以稱為屬性動(dòng)畫。下面要介紹的這些概念都是和屬性值相關(guān)的:
開始值:起始幀中的的屬性值;
結(jié)束值:結(jié)束幀中的的屬性值;
關(guān)鍵值:在起始幀和結(jié)束幀之間產(chǎn)生的屬性值,這些值都是按照一定的方式計(jì)算出來的;
持續(xù)時(shí)間:動(dòng)畫持續(xù)的時(shí)間;
關(guān)鍵幀:開始值和結(jié)束值表示的幀都稱為關(guān)鍵幀;
過渡幀:關(guān)鍵值表示的幀稱為過渡幀;
插值器:可以理解為關(guān)鍵值產(chǎn)生的計(jì)算方式;
?
3, 相關(guān)類
在關(guān)鍵幀動(dòng)畫中最重要的是如何得到關(guān)鍵值,因?yàn)殛P(guān)鍵值得依靠各種復(fù)雜的計(jì)算來得到。bada在這方面提供了為開發(fā)者提供了很大的幫助,來幫助開發(fā)者很方便的獲取關(guān)鍵值。
?
3.1 屬性動(dòng)畫
下面的這些屬性動(dòng)畫都是用于模擬從一個(gè)屬性值變化到另一個(gè)屬性值的變化過程的,都提供了GetAnimatedValue ()或者其它函數(shù)來根據(jù)時(shí)間獲取屬性值。這樣將得到的屬性值作為幀屬性進(jìn)行播放就可以形成動(dòng)畫了。
| 類 | 功能說明 |
| IntegerAnimation | 用于計(jì)算整數(shù)型的屬性值,如用于計(jì)算旋轉(zhuǎn)角度屬性值 |
| FloatAnimation | 用于計(jì)算浮點(diǎn)型的屬性值,如用于計(jì)算旋轉(zhuǎn)角度屬性值。可以得到浮點(diǎn)值,更加精確 |
| PointAnimation | 用于計(jì)算位置屬性 |
| DimensionAnimation | 用于計(jì)算大小屬性 |
| RectangleAnimation | 用于同時(shí)計(jì)算位置和大小屬性 |
| RotateAnimation | 用于計(jì)算旋轉(zhuǎn)角度屬性 |
這些類都可以通過傳入開始值、結(jié)束值、持續(xù)時(shí)間和插值器來進(jìn)行初始化。
?
3.2 插值器
插值器定義了屬性值的計(jì)算方式,能夠讓關(guān)鍵值呈一定的規(guī)律進(jìn)行變化。這種變化最終體現(xiàn)在動(dòng)畫的播放速度上,可以產(chǎn)生勻速播放、加速播放和減速播放等各種效果。
其實(shí)改變動(dòng)畫的播放速度有兩種方式,第一種是在動(dòng)畫中各幀的屬性值保持不變的情況下去改變幀的持續(xù)時(shí)間,如原有每幀的持續(xù)時(shí)間是40ms,先進(jìn)將這值改為20ms,這樣播放速度就明顯加快了;第二種就是在保持原有動(dòng)畫中各幀持續(xù)時(shí)間不變的情況下去改變各幀的屬性值,將屬性值變的更大或者更小,這樣也能產(chǎn)生加速或者減速的效果。
插值器就可以幫助開發(fā)者通過第二種方式來實(shí)現(xiàn)各種動(dòng)畫效果。它能夠讓動(dòng)畫幀的屬性值與時(shí)間成各種線性關(guān)系。
如線型插值器,屬性值隨時(shí)間均勻變化。這樣在相同的時(shí)間間隔內(nèi)去取屬性值的話,得到的增量都是相同的。所以動(dòng)畫也是表現(xiàn)出勻速播放。
如這種曲線關(guān)系,在相同的時(shí)間間隔內(nèi)去取屬性值的話,剛開始得到的值之間變化較小,越往后得到的值的變化越來越大,則表現(xiàn)在動(dòng)畫的播放速度是從慢到快的。
?
?
?
下面是bada提供的插值器類型:
| 類型 | 功能說明 |
| ANIMATION_INTERPOLATOR_LINEAR? | 屬性值按照線性規(guī)律變化,動(dòng)畫播放則表現(xiàn)為勻速播放。 |
| ANIMATION_INTERPOLATOR_DISCRETE? | 屬性值在最后一幀時(shí)才發(fā)生變化,表現(xiàn)在動(dòng)畫上則是前段時(shí)間不變,最后突然發(fā)送一下變化??梢杂糜趯?shí)現(xiàn)那種突隱突現(xiàn),來回閃爍的效果。 |
| ANIMATION_INTERPOLATOR_EASE_IN? | 屬性值變化先小后大,動(dòng)畫播放則表現(xiàn)為先慢后快。 |
| ANIMATION_INTERPOLATOR_EASE_OUT? | 屬性值變化先大后小,動(dòng)畫播放則表現(xiàn)為先快后慢。 |
| ANIMATION_INTERPOLATOR_EASE_IN_OUT? | 屬性值變化前期是先小后大,后期先大后小,動(dòng)畫播放則是由慢到快,再由快到慢。 |
| ANIMATION_INTERPOLATOR_BEZIER? | 這個(gè)是按照貝塞爾曲線變化,可以實(shí)現(xiàn)進(jìn)行自定義變化。 |
?
4, 實(shí)例
接下來用代碼實(shí)現(xiàn)前面的金魚由小變大的例子。
Step 1,準(zhǔn)備動(dòng)畫圖片
只需要準(zhǔn)備一張圖片就可以了。圖片的尺寸為134×105像素。
?
?
Step 2,解析圖片
將圖片解析成系統(tǒng)支持的位圖。
AppResource* pAppRes = Application::GetInstance()->GetAppResource();
__pFishBmp =? pAppRes->GetBitmapN("fish.png");
?
Step 3,創(chuàng)建屬性動(dòng)畫
創(chuàng)建尺寸屬性動(dòng)畫,用于改變長度屬性值。動(dòng)畫的初始值為提供的原始圖片的1/3,結(jié)束值為原始圖片的2倍,動(dòng)畫持續(xù)的時(shí)間為1秒,采用的是線性插值器。
__pFishAni = new DimensionAnimation(Dimension(134/3,105/3),
Dimension(134*2,105*2),1000,ANIMATION_INTERPOLATOR_LINEAR);
?
Step 4,獲取屬性值
結(jié)合我們前面的文章用到的模塊代碼,采用“基于時(shí)間的固定間隔游戲循環(huán)”,只需要在UpdateLogic(int frameInterval) 函數(shù)中,根據(jù)時(shí)間值去獲取屬性值就可以了。
??? __aniDuration = __aniDuration + frameInterval;
??? if(__aniDuration <= 1000)
??? {
?????? __pFishAni->GetAnimatedValue(__aniDuration, __aniDimension);
??? }
??? else
??? {
?????? __aniDuration = 0;
??? }
?
Step 5,繪制圖片形成動(dòng)畫
在Form的OnDraw()函數(shù)中根據(jù)得到的屬性值去進(jìn)行繪制。
??? Canvas* pCanvas = this->GetCanvasN();
??? pCanvas->SetBackgroundColor(Color::COLOR_WHITE);
??? pCanvas->Clear();
??? pCanvas->DrawBitmap(Rectangle(100,100,__aniDimension.width,
__aniDimension.height), *__pFishBmp);
?
??? delete pCanvas;
?
這樣在游戲狀態(tài)的更加接口Draw()函數(shù)中調(diào)用RequestRedraw()去請求更新,然后OnDraw()函數(shù)不斷的被調(diào)用來進(jìn)行重新繪制就形成了動(dòng)畫。
?
?
?
轉(zhuǎn)載于:https://blog.51cto.com/badaeva/992747
總結(jié)
以上是生活随笔為你收集整理的bada 2D游戏编程之十——关键帧动画原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么学ai拼版
- 下一篇: 面向方面编程(Spring AOP)