動畫播放的原理,是快速播放每一張連續分解動作的畫面,由於每一張圖片的差異小,加上利用人類的視覺暫留,使得看起來動作想是連續,電影或卡通的播放原理就是如此,例如將下圖的四個影格(Frame)連續播放,看起來就會像是挖土機由遠而近的開過來。
動畫播放速度
動畫播放速度是由每秒鐘影格數來決定,又稱FPS(Frame per second),FPS越高,影片連續動作的細緻度越高,但所使用的圖片數就越多,通常10到12FPS就可以產生差強人意動畫的效果,一般的話會設定為 24FPS以達到較流暢的播放效果。FPS的倒數是SPF(Second per frame),也就是每個影格的播放時間,對於程式設計來說,SPF就影響了動畫迴圈每次必須暫停的時間,例如要播放24FPS的動畫,我們在播放完一個影格之後,就必須暫停動畫迴圈1/24秒,也就是46毫秒。
動畫迴圈
在程式設計中,是使用一個不斷執行的迴圈來進行動畫繪製,一個典型的動畫迴圈如下所示: while(true) {
繪製影像
暫停指定秒數
改變動畫狀態
}
繪製影像
暫停指定秒數
改變動畫狀態
}
其中改變動畫狀態視不同的程式而有所不同,也許只是單純的載入下一張影像,也許是由於使用者的操作而改變狀態。
暫停指定秒數部份,不同的程式語言工具會有不同的處理方式,不過多不離「執行緒」(Thread)或Timer的使用,在這個主題的介紹中都是使用Java實作,所以會使用執行緒的觀念來製作動畫。
執行緒的使用是在需要同時處理兩件事時才會使用,例如同時處理事件與動畫播放時,會將動畫播放交由執行緒來處理,而事件處理又是另一個執行緒。
動畫分類
這邊簡單的將動畫分為兩類,一種是所謂「畫框動畫」,每次繪製時都載入一張畫框大小的圖片,電影或卡通製作都是屬於此類,這種動畫的好處是只要繪製好每一張圖片,然後再依序播放即可,但缺點是缺乏彈性,只適用於一些固定播放的畫面,例如背景畫面。另一種是「角色動畫」,在繪製動畫時,只改變畫框中局部區域的繪製,例如數位小時鐘的繪製時,我們可以只改變秒鐘部份的動畫,只有在需要進位一分鐘時,才 改變分鐘部份的動畫;這種動畫播放方式的彈性很大,可以製作隨機的地圖或人物移動等動畫,不過就是在程式計時,要花多一些心思在邏輯設計上。
即使在不使用執行緒時,也可以由流程控制來製作動畫,例如在Turbo C的繪圖模式時,我們可以使用sleep()函式來處理程式的暫停,而使用者的操作處理則直接撰寫在動畫迴圈當中。