日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bada 2D游戏编程之十——关键帧动画原理

發(fā)布時間:2025/5/22 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bada 2D游戏编程之十——关键帧动画原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

bada 2D游戲編程之十——關(guān)鍵幀動畫原理

?

前面提到的逐幀動畫有一個關(guān)鍵的缺點就是需要為動畫中的每一幀都提供一張單獨的圖片,由于每一幀的圖片都需要單獨提供,制作起來比較麻煩,圖片量也比較大。用關(guān)鍵幀動畫可以很好的解決這個問題,下面就給大家進行講解bada平臺的關(guān)鍵幀動畫。

?

1, 什么是關(guān)鍵幀動畫

關(guān)鍵幀動畫的原理是只需要提供一張圖片(或者對象),然后對這張圖片(或者對象)進行處理產(chǎn)生出不同的效果,例如進行放縮處理產(chǎn)生出大小不同的效果,還有進行透明度處理產(chǎn)生出透明度不同的效果等,連續(xù)播放處理出來的效果就形成了動畫。

往往這種處理的效果有限,只能進行一些常規(guī)的處理,如改變大小、透明度、位置、角度等,所以關(guān)鍵幀動畫不適合表現(xiàn)復(fù)雜的變形,例如在逐幀動畫中提到的描述一株向日葵從苗芽狀態(tài)成長到綻放花朵的過程動畫就不能用關(guān)鍵幀動畫來完成,因為這個動畫中的效果不是僅僅通過變形就能實現(xiàn)的,而是需要對圖片中內(nèi)容的改變,這種情況下就只有采用逐幀動畫了。

下面給大家描述如何用一張圖片來實現(xiàn)一個動畫。

這是提供的一張金魚的圖片,

?

然后用關(guān)鍵幀動畫來實現(xiàn)這條金魚從小長到大的變化過程,

?

?

?

這個動畫就是對提供的圖片進行大小的改變來實現(xiàn)的,不需要對每個大小的圖片都提供一張圖片,中間圖片的產(chǎn)生交給系統(tǒng)去處理,節(jié)省了很多的工作量。

?

2, 相關(guān)概念

關(guān)鍵幀動畫是對圖片(或者對象)的屬性值進改變,一般可以改變的屬性為大小、透明度、位置坐標(biāo)和旋轉(zhuǎn)角度等,這樣來理解的話,關(guān)鍵幀動畫也可以稱為屬性動畫。下面要介紹的這些概念都是和屬性值相關(guān)的:

開始值:起始幀中的的屬性值;

結(jié)束值:結(jié)束幀中的的屬性值;

關(guān)鍵值:在起始幀和結(jié)束幀之間產(chǎn)生的屬性值,這些值都是按照一定的方式計算出來的;

持續(xù)時間:動畫持續(xù)的時間;

關(guān)鍵幀:開始值和結(jié)束值表示的幀都稱為關(guān)鍵幀;

過渡幀:關(guān)鍵值表示的幀稱為過渡幀;

插值器:可以理解為關(guān)鍵值產(chǎn)生的計算方式;

?

3, 相關(guān)類

在關(guān)鍵幀動畫中最重要的是如何得到關(guān)鍵值,因為關(guān)鍵值得依靠各種復(fù)雜的計算來得到。bada在這方面提供了為開發(fā)者提供了很大的幫助,來幫助開發(fā)者很方便的獲取關(guān)鍵值。

?

3.1 屬性動畫

下面的這些屬性動畫都是用于模擬從一個屬性值變化到另一個屬性值的變化過程的,都提供了GetAnimatedValue ()或者其它函數(shù)來根據(jù)時間獲取屬性值。這樣將得到的屬性值作為幀屬性進行播放就可以形成動畫了。

功能說明

IntegerAnimation

用于計算整數(shù)型的屬性值,如用于計算旋轉(zhuǎn)角度屬性值

FloatAnimation

用于計算浮點型的屬性值,如用于計算旋轉(zhuǎn)角度屬性值。可以得到浮點值,更加精確

PointAnimation

用于計算位置屬性

DimensionAnimation

用于計算大小屬性

RectangleAnimation

用于同時計算位置和大小屬性

RotateAnimation

用于計算旋轉(zhuǎn)角度屬性

這些類都可以通過傳入開始值、結(jié)束值、持續(xù)時間和插值器來進行初始化。

?

3.2 插值器

插值器定義了屬性值的計算方式,能夠讓關(guān)鍵值呈一定的規(guī)律進行變化。這種變化最終體現(xiàn)在動畫的播放速度上,可以產(chǎn)生勻速播放、加速播放和減速播放等各種效果。

其實改變動畫的播放速度有兩種方式,第一種是在動畫中各幀的屬性值保持不變的情況下去改變幀的持續(xù)時間,如原有每幀的持續(xù)時間是40ms,先進將這值改為20ms,這樣播放速度就明顯加快了;第二種就是在保持原有動畫中各幀持續(xù)時間不變的情況下去改變各幀的屬性值,將屬性值變的更大或者更小,這樣也能產(chǎn)生加速或者減速的效果。

插值器就可以幫助開發(fā)者通過第二種方式來實現(xiàn)各種動畫效果。它能夠讓動畫幀的屬性值與時間成各種線性關(guān)系。

如線型插值器,屬性值隨時間均勻變化。這樣在相同的時間間隔內(nèi)去取屬性值的話,得到的增量都是相同的。所以動畫也是表現(xiàn)出勻速播放。

如這種曲線關(guān)系,在相同的時間間隔內(nèi)去取屬性值的話,剛開始得到的值之間變化較小,越往后得到的值的變化越來越大,則表現(xiàn)在動畫的播放速度是從慢到快的。

?

?

?

下面是bada提供的插值器類型:

類型

功能說明

ANIMATION_INTERPOLATOR_LINEAR?

屬性值按照線性規(guī)律變化,動畫播放則表現(xiàn)為勻速播放。

ANIMATION_INTERPOLATOR_DISCRETE?

屬性值在最后一幀時才發(fā)生變化,表現(xiàn)在動畫上則是前段時間不變,最后突然發(fā)送一下變化。可以用于實現(xiàn)那種突隱突現(xiàn),來回閃爍的效果。

ANIMATION_INTERPOLATOR_EASE_IN?

屬性值變化先小后大,動畫播放則表現(xiàn)為先慢后快。

ANIMATION_INTERPOLATOR_EASE_OUT?

屬性值變化先大后小,動畫播放則表現(xiàn)為先快后慢。

ANIMATION_INTERPOLATOR_EASE_IN_OUT?

屬性值變化前期是先小后大,后期先大后小,動畫播放則是由慢到快,再由快到慢。

ANIMATION_INTERPOLATOR_BEZIER?

這個是按照貝塞爾曲線變化,可以實現(xiàn)進行自定義變化。

?

4, 實例

接下來用代碼實現(xiàn)前面的金魚由小變大的例子。

Step 1,準(zhǔn)備動畫圖片

只需要準(zhǔn)備一張圖片就可以了。圖片的尺寸為134×105像素。

?

?

Step 2,解析圖片

將圖片解析成系統(tǒng)支持的位圖。

AppResource* pAppRes = Application::GetInstance()->GetAppResource();

__pFishBmp =? pAppRes->GetBitmapN("fish.png");

?

Step 3,創(chuàng)建屬性動畫

創(chuàng)建尺寸屬性動畫,用于改變長度屬性值。動畫的初始值為提供的原始圖片的1/3,結(jié)束值為原始圖片的2倍,動畫持續(xù)的時間為1秒,采用的是線性插值器。

__pFishAni = new DimensionAnimation(Dimension(134/3,105/3),

Dimension(134*2,105*2),1000,ANIMATION_INTERPOLATOR_LINEAR);

?

Step 4,獲取屬性值

結(jié)合我們前面的文章用到的模塊代碼,采用“基于時間的固定間隔游戲循環(huán)”,只需要在UpdateLogic(int frameInterval) 函數(shù)中,根據(jù)時間值去獲取屬性值就可以了。

??? __aniDuration = __aniDuration + frameInterval;

??? if(__aniDuration <= 1000)

??? {

?????? __pFishAni->GetAnimatedValue(__aniDuration, __aniDimension);

??? }

??? else

??? {

?????? __aniDuration = 0;

??? }

?

Step 5,繪制圖片形成動畫

FormOnDraw()函數(shù)中根據(jù)得到的屬性值去進行繪制。

??? 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)用來進行重新繪制就形成了動畫。

?

?

?

轉(zhuǎn)載于:https://blog.51cto.com/badaeva/992747

總結(jié)

以上是生活随笔為你收集整理的bada 2D游戏编程之十——关键帧动画原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。