作者首嘗 DirectX 遊戲開發 (學習 10 天),參考網路「英雄救美」RPG 素材自行重寫核心邏輯。本文記錄核心渲染迴圈、角色移動狀態機、對話觸發機制,供初學者參考。
負責單幀繪製:背景、NPC、主角、對話框、翻轉雙緩衝。
void bmove(int& zhi) {
// 1. 繪製背景 (全螢幕 640x480)
pBBuf->BltFast(0, 0, pOPla[zai], CRect(0,0,640,480), DDBLTFAST_WAIT);
// 2. 對話框顯示 (空白鍵觸發 tab=true)
if (tab) {
pBBuf->BltFast(0, 380, pOPla[13], CRect(0,0,640,100),
DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
pBBuf->BltFast(5, 385, pOPla[14], CRect(0,0,85,85),
DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY); // 主角頭像
}
// 3. NPC 與主角重疊順序判斷 (依 Y 軸決定繪製先後)
if (hero.y1 > whero.y1) { // 主角在 NPC 下方 → 先畫 NPC 再畫主角
pBBuf->BltFast(whero.x1, whero.y1, pOPla[zhi], CRect(0,0,40,40),
DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
pBBuf->BltFast(hero.x1, hero.y1, pOPla[hero.control], CRect(0,0,40,40),
DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
} else { // 主角在 NPC 上方或同高
pBBuf->BltFast(hero.x1, hero.y1, pOPla[hero.control], CRect(0,0,40,40),
DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
pBBuf->BltFast(whero.x1, 150, pOPla[zhi], CRect(0,0,40,40),
DDBLTFAST_WAIT | DDBLTFAST_SRCCOLORKEY);
}
// 4. 雙緩衝翻轉
pPSur->Flip(NULL, DDFLIP_WAIT);
}
IDirectDrawSurface7 (pBBuf 後緩衝、pPSur 主表面、pOPla 材質表面陣列)。DDBLTFAST_SRCCOLORKEY 實現 Sprite 透明背景 (素材預留魔術粉色 0xFF00FF 為透明色)。hero.control 記錄朝向/動作幀 (上下左右走路循環),zhi 為 NPC 當前幀。OnTimer 中檢測 abs(hero.x - npc.x) < 30 && hero.y == npc.y 觸發 numx=1 進入對話模式。hero.x1/y1 並切換 hero.control;空白鍵切換 tab 顯示對話。
// WinMain → 初始化 DirectDraw → 載入素材 → 設定 Timer (約 30fps)
void OnTimer(UINT nIDEvent) {
// 1. 處理輸入 (GetAsyncKeyState)
// 2. 更新邏輯 (移動、碰撞、對話狀態)
// 3. bmove(current_npc_frame);
}
圖片素材來源於網路免費 RPG 專案「英雄救美」,僅供學習研究使用。商業專案請自行繪製或購買授權素材。
Email: xieyuntian1981@21cn.com | QQ: 109021029
歡迎遊戲開發愛好者交流指正。