等軸測地圖渲染的本質是解決四個座標系之間的轉換:
mapInfo[400] 儲存 20×20 地圖塊類型 (0~3)sceneInfo[400] 儲存景物 (樹、房屋等)
; i = 索引, 20 列
xor edx, edx
mov eax, i
mov ebx, 20
div ebx ; eax = 行, edx = 列
mov row, eax
mov col, edx
; xAbs = row * 32 - col * 32 + xstart
mov eax, row
mov ebx, 32 ; 64/2
mul ebx
mov xAbs, eax
mov eax, col
mul ebx
sub xAbs, eax
add xAbs, xstart
; yAbs = col * 16 + row * 16 + ystart
mov eax, col
mov ebx, 16 ; 32/2
mul ebx
mov yAbs, eax
mov eax, row
mul ebx
add yAbs, eax
add yAbs, ystart
mov eax, xAbs
sub eax, viewRect.left
mov vx, eax
mov eax, yAbs
sub eax, viewRect.top
mov vy, eax
; 地圖塊
mov eax, i
cmp mapInfo[eax], 0
je draw_tile0
cmp mapInfo[eax], 1
je draw_tile1
; ...
draw_tile0:
invoke BitBlt, buffer, vx, vy, 64, 32, tile0, 64, 0, SRCAND ; 遮罩
invoke BitBlt, buffer, vx, vy, 64, 32, tile0, 0, 0, SRCPAINT ; 圖案
jmp next_tile
; 變數
timeOld dd ? ; 上次幀率統計時間
timeNew dd ? ; 目前時間
timeCur dd ? ; 上次畫面更新時間
frameCount dd ? ; 幀計數
; 主迴圈
invoke GetTickCount
mov timeNew, eax
; 幀率統計 (每秒一次)
mov eax, timeNew
sub eax, timeOld
cmp eax, 1000
jle skip_fps
; 計算 FPS = frameCount
mov timeOld, timeNew
mov frameCount, 0
skip_fps:
; 幀率限制 (最多 100 FPS = 10ms/幀)
mov eax, timeNew
sub eax, timeCur
cmp eax, 10
jle skip_frame
mov timeCur, timeNew
inc frameCount
; 執行繪圖與邏輯
skip_frame:
GetStatus 取得輸入狀態SetDir 依狀態設定方向DrawSprite 繪製主角動畫vx, vy 在螢幕範圍內的塊buffer DC 避免閃爍等軸測地圖滾動的核心在於 索引→行列→絕對座標→視口座標 的數學轉換。組語雖非現代主流,但展示了座標轉換的本質邏輯。現代引擎 (Unity, Godot, Cocos2d-x) 內建等軸測支援,開發者只需設定 Tilemap 與 Camera,底層原理一致。