520 likes | 645 Views
Chapter 19 遊戲動畫技巧. 本章重點. -1 基礎動畫展示 -2 動畫顯示問題 -3 背景動畫設計. 基礎動畫展示. 遊戲中展現動畫的方式有兩種:一種是直接播放影片檔案 ( 如: AVI 、 MPEG) ,常用在遊戲的片頭與片尾;另一種則是遊戲進行時利用連續貼圖的方式,製造動畫的效果。. 計時器的使用. 計時器 (Timer) 物件可以每隔一段時間發出一個時間訊息,而程式一旦接收到此一訊息之後便可以決定接下來要做那些事情。. 建立計時器. Windows API 的 SetTimer() 函式可為視窗建立一個計時器 。.
E N D
本章重點 • -1 基礎動畫展示 • -2 動畫顯示問題 • -3 背景動畫設計
基礎動畫展示 • 遊戲中展現動畫的方式有兩種:一種是直接播放影片檔案(如:AVI、MPEG),常用在遊戲的片頭與片尾;另一種則是遊戲進行時利用連續貼圖的方式,製造動畫的效果。
計時器的使用 • 計時器(Timer)物件可以每隔一段時間發出一個時間訊息,而程式一旦接收到此一訊息之後便可以決定接下來要做那些事情。
建立計時器 • Windows API的SetTimer()函式可為視窗建立一個計時器 。 UINT SetTimer( HWND接收計時器訊息的視窗, UINT 計時器代號, UINT 時間間隔, TIMERPROC 處理回呼函式);
底下是設定一每隔0.5秒發出WM_TIMER訊息計時器的程式碼:底下是設定一每隔0.5秒發出WM_TIMER訊息計時器的程式碼: SetTimer(hWnd,1,500,NULL);
刪除計時器 • 一旦建立了一個計時器後,它就一直自動的依設定的時間間隔發出WM_TIMER訊息,若我們要停用某個計時器,必須使用KillTimer函式
girl0.bmp girl1.bmp girl2.bmp girl3.bmp girl4.bmp girl5.bmp girl6.bmp
InitInstance( ) (續) 載入各人物圖 建立計時器,間隔0.5秒發出訊息
WndPro 呼叫MyPaint 刪除計時器
MyPaint( ) 判斷目前圖號是否已超過最大圖號 依照目前圖號 進行視窗貼圖
遊戲迴圈 • 遊戲本身要顯示順暢的遊戲畫面,使玩家感覺不到延遲的狀況,基本上遊戲畫面必須在一秒鐘之內更新至少25次以上 。
Exercise 06 • 將ch19_01程式改為每秒重畫25個畫面。 • 專案名稱為『學號_06』 • (例:8223582_06) • 編譯及執行無誤後,使用ftp將『學號_06.cpp』上傳至192.192.155.217的EX06目錄下,帳號:student5,密碼:student5
遊戲迴圈是將原先程式中的訊息迴圈加以修改,其中內容判斷目前是否有要處理的訊息,若有則進行處理;否則便依設定的時間間隔來重繪畫面。遊戲迴圈是將原先程式中的訊息迴圈加以修改,其中內容判斷目前是否有要處理的訊息,若有則進行處理;否則便依設定的時間間隔來重繪畫面。
//遊戲迴圈 while( msg.message!=WM_QUIT ) { if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } else { tNow = GetTickCount(); if(tNow-tPre >= 40) MyPaint(hdc); } } 偵測訊息 取得目前時間
透空動畫 • 「透空動畫」是遊戲中一定會運用到的基本技巧,它結合了圖案的連續顯示以及透空來產生背景圖上的動畫效果。
全域變數宣告 bg是背景圖 dra是恐龍連續跑動及遮罩圖
InitInstance( ) 建立一個空的點陣圖物件
InitInstance( ) (續) 載入恐龍圖及背景圖
MyPaint( ) 依照圖號取出跑動圖及 遮罩圖,進行透空繪圖
Exercise 07 • 下載並改寫ch19_02.cpp程式,利用Mouse移動偵測的方法,如果Mouse移動恐龍就會依照mouse的高度行走。 • 專案名稱為『學號_07』 • (例:8223582_07) • 編譯及執行無誤後,使用ftp將『學號_07.cpp』上傳至192.192.155.217的EX04目錄下,帳號:student5,密碼:student5
排序貼圖 • 「排序貼圖」的問題是源自於物體遠近呈現的一種貼圖概念。
氣泡排序法(Bubble sort) 1 2 3 5 7 2 1 3 5 7 7 5 2 1 3 5 2 1 3 7 5 7 2 1 3 2 5 1 3 7 1 2 3 5 7 1 2 3 5 7 5 2 7 1 3 2 1 5 3 7 1 2 3 5 7 5 2 1 7 3 2 1 3 5 7 5 2 1 3 7
Exercise 08 • 下載並改寫ch19_03.cpp程式,恐龍不改變方向的機率0.4,其他三個方向的機率都是0.5。 • 專案名稱為『學號_08』 • (例:8223582_08) • 編譯及執行無誤後,使用ftp將『學號_08.cpp』上傳至192.192.155.217的EX04目錄下,帳號:student5,密碼:student5
背景動畫設計 • 背景動畫的製作概念同樣是利用連續貼圖的原理,2D遊戲中經常運用到的動態背景表現手法大致有3種 : • 單一背景捲動 • 循環背景動畫 • 多循環背景動畫
單一背景捲動 • 單一背景捲動的方式是利用一張相當大的背景圖,當遊戲進行的時候,隨著畫面中人物的移動,背景的顯示區域便跟著移動 。
循環背景動畫 • 循環背景是不斷地進行背景圖的裁切與接合,然後顯示於視窗上所產生的一種背景畫面循環捲動的效果。
多背景循環動畫 • 以貼圖的方式製作多背景循環動畫時,我們必須要能夠決定不同背景貼圖的先後順序以及捲動的速度。
天空 山巒 草地 房屋
InitInstance( ) 載入各背景圖及前景圖