160 likes | 346 Views
動畫程式 撰寫流程與範例. 動畫程式待處理問題 (1). 定義分析問題 以文字模式產生8*8之行人原地蹋步動畫 功能分項列表 動畫分解動作分析, 1~ N 張分解動作 8*8 點圖型之產生與顯示 動畫分解動作之控制 動畫(4) 顯示位置 與軌跡( 原地踏步故無移動軌跡 ). 問題分類. 概念與資料部份 處理功能 流程規劃. 動畫程式待處理問題 (2). 動畫分解動作分析, 1~ N 張分解動作 8*8 點圖型之產生與顯示 圖案資料 ,(1) 顯示輸出 動畫分解動作之控制 圖片(2) 轉換與顯示 (1~ N 依序), (3) 動作速度控制
E N D
動畫程式待處理問題(1) • 定義分析問題 • 以文字模式產生8*8之行人原地蹋步動畫 • 功能分項列表 • 動畫分解動作分析, 1~N張分解動作 • 8*8點圖型之產生與顯示 • 動畫分解動作之控制 • 動畫(4)顯示位置與軌跡(原地踏步故無移動軌跡)
問題分類 概念與資料部份 處理功能 流程規劃 動畫程式待處理問題(2) • 動畫分解動作分析, 1~N張分解動作 • 8*8點圖型之產生與顯示 • 圖案資料,(1)顯示輸出 • 動畫分解動作之控制 • 圖片(2)轉換與顯示(1~N依序), (3)動作速度控制 • 動畫模式: 循環1~N~1~N…, 一次1~N • 動畫(4)顯示位置與軌跡(原地踏步故無移動軌跡)
範例:動畫模式 一次1~N程式流程規劃 開始 (4)設定顯示位置 圖形資料設定 設定顯示圖片I=1 (1)顯示圖片I (2)切換下一張圖片 I=I+1 是最後一張? (3)顯示速度控制 end
分析功能(1)顯示圖片 • 文字模式產生8*8圖形, 於特定位置顯示 • 如何顯示符號? 以字串顯示一次8字元 • 如何定位? 定義顯示位址座標X,Y, 使用GOTOXY • 圖形資料如何設定呢? 以8行8字元字串設定 根據上述設定撰寫display副程式
分析功能(2)圖片轉換 • 8*8圖形轉換 • 如何清除舊圖案? 在原位置顯示8*8空白鍵(space)資料 • 如何讀取新圖案資料? 透過連續定義之資料區每一圖片為8*(8+1(字串結束0))=72 之長度, 每改一次分解動作圖片位置加72 • 顯示位置(是否改變)? 根據座標X,Y顯示
分析功能(3)動作速度控制 • 分解動作之速度控制 • 動作速率=圖片切換速率 每次切換圖片, 會有圖片移動之感覺(圖形有變動) 於顯示後 延遲 數 ms, 再顯示下一圖形 • 如何計時? 使用delay,延遲 數 ms
分析功能(4)顯示位置與軌跡 • 動畫之顯示位置與軌跡 • 顯示位置之設定 改變位址座標X,Y • 軌跡隨時間改變之軌跡 根據移動之軌跡公式計算X,Y座標, (本範例以直線計算)
程式功能加強與改進 • 完整程式 movie.asm • 上述程式有那些待改進? • 可再加強擴充何功能?
如何顯示符號 .data pattern byte " **** ",0 byte " ** ",0 byte " ** ",0 byte " * ** ",0 byte " ** ** ",0 byte " *** ",0 byte " ** * ",0 byte "* * ",0 .code mov edx, offset pattern call writestring
Display 副程式 ; eax 為顯示圖形之偏 ; 移位址 mov edx, eax call WriteString add eax,9 loop d2 popad ret display ENDP display PROC pushad ; mov ECX, 8 d2: mov dh,y ;x mov dl,x ;y add dh,8 sub dh,cl call gotoxy
如何清除舊圖案 ; cp 為“ ”,0 mov edx, offset cp call WriteString add eax,9 loop d2 popad ret clear_p ENDP clear_p PROC pushad ; mov ECX, 8 d1: mov dh,y ;x mov dl,x ;y add dh,8 sub dh,cl call gotoxy
如何讀取新圖案資料 add ebx, 8*9 ;下一張圖位置在ebx+72 mov eax, ebx call display
動作速率=圖片切換速率 mov eax, D_time ; control display rate (3) call delay
顯示位置與軌跡 mov al, x inc al ; 每次向左移一格 mov x,al cmp al,65 ; 銀幕最左邊 jne _s2 mov al,10 ; 銀幕最右邊 mov x,al _s2:
TITLE (.asm) ; This program ; Last update: ; Include Irvine32.inc .data cp byte 8 DUP(' '),0 pattern byte " **** ",0 byte " ** ",0 byte " ** ",0 byte " * ** ",0 byte " ** ** ",0 byte " *** ",0 byte " ** * ",0 byte "* * ",0 p1 byte " **** ",0 byte " ** ",0 byte " ** ",0 byte " *** ",0 byte " ** * ",0 byte " *** ",0 byte " * * ",0 byte " * * ",0 p2 byte " **** ",0 byte " ** ",0 byte " ** ",0 byte " *** ",0 byte " ** ",0 byte " ** ",0 byte " ** ",0 byte " *** ",0 p3 byte " **** ",0 byte " ** ",0 byte " ** ",0 byte " *** ",0 byte " *** ",0 byte " ** ",0 byte " * ",0 byte " * * ",0 p4 byte " **** ",0 byte " ** ",0 byte " ** ",0 byte " *** ",0 byte " ** * ",0 byte " *** ",0 byte " * * ",0 byte " ** * ",0 pattern_no dword 5 ; x byte 10 y byte 10 D_time dword 500 .code main PROC call clrscr _start: ; setup the patten parameter mov ecx, pattern_no mov ebx, OFFSET pattern _s1: ; draw the pattern (1) mov eax, ebx call display mov eax, D_time ; control display rate (3) call delay ; clear previous pattern (1) call clear_p ; change to next pattern (2) add ebx,8*9 ; calculate positioin (4) mov al, x inc al mov x,al cmp al,65 jne _s2 mov al,10 mov x,al _s2: loop _s1 jmp _start exit main ENDP clear_p PROC pushad mov ECX, 8 d1: mov dh,y ;x mov dl,x ;y add dh,8 sub dh,cl call gotoxy mov edx,OFFSET cp call WriteString loop d1 popad ret clear_p ENDP display PROC pushad mov ECX, 8 d2: mov dh,y ;x mov dl,x ;y add dh,8 sub dh,cl call gotoxy mov edx, eax call WriteString add eax,9 loop d2 popad ret display ENDP ; END main 動畫程式