如何將hge遊戲引擎移植到Win32子窗口?

Tags: 職業, 引擎, 示例,

Hge遊戲引擎是著名的基於DirectX8.0開發的2D遊戲引擎,開發基於Windows的2D桌面遊戲是不二之選。但是有些場合設計到複雜的界面,或者需要添加配置菜單,單靠引擎本身是不夠的,本文示例將Hge引擎移植到win32子窗口中。

工具/原料

Hge遊戲引擎包

VC編譯器(VC6以上版本,本文使用VC2010)

方法/步驟

官方下載Hge遊戲引擎包,裡面含有示例代碼,可運行的示例,開發所需頭文件和庫文件。

如何將hge遊戲引擎移植到Win32子窗口

打開VC編譯器,新建Win32項目工程,輸入工程名稱,本示例為HgeWin32,注意在想到中選擇應用程序類型為“windows應用程序”。

如何將hge遊戲引擎移植到Win32子窗口

如何將hge遊戲引擎移植到Win32子窗口

按快捷鍵F7,運行程序,或者直接(Ctrl+F5) ,運行嚮導產生的程序代碼,如環境無問題,可產生windows窗口。

如何將hge遊戲引擎移植到Win32子窗口

設置當前工程屬性,添加頭文件和庫文件

如何將hge遊戲引擎移植到Win32子窗口

如何將hge遊戲引擎移植到Win32子窗口

如何將hge遊戲引擎移植到Win32子窗口

按照官方說明,要講Hge使用到子窗口中,需要做以下6個步驟:

a.設置窗口

hge->System_SetState(HGE_HWNDPARENT, hwnd);

b. 設置鼠標

hge->System_SetState(HGE_HIDEMOUSE, false);

c. 重新定義windows消息循環

for(;;){

if(hge->System_GetState(HGE_HWND))

hge->System_Start();

if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{

if(msg.message == WM_QUIT) break;

DispatchMessage(&msg);

}

}

d.如果窗口大小變化,需要調用

MoveWindow(hge->System_GetState(HGE_HWND), x, y, width, height, true);

e. 添加窗口關閉處理代碼

case WM_DESTROY:

FreeLoadedHGEResources();

hge->System_Shutdown();

PostQuitMessage(0);

return FALSE;

f. 如果Hge子窗口需要相應鍵盤和鼠標消息,請設置窗口焦點。

SetFocus(hge->System_GetState(HGE_HWND));

完整示例代碼如下:

// HgeWin32.cpp : 定義應用程序的入口點。

//

#include "stdafx.h"

#include "HgeWin32.h"

#include

#define MAX_LOADSTRING 100

#pragma comment(lib,"hge.lib")

// 全局變量:

HINSTANCE hInst; // 當前實例

TCHAR szTitle[MAX_LOADSTRING]; // 標題欄文本

TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口類名

HGE *hge=0;

// 此代碼模塊中包含的函數的前向聲明:

ATOM MyRegisterClass(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);

bool FrameFunc()

{

if(hge->Input_GetKeyState(HGEK_ESCAPE)) return true;

return false;

}

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: 在此放置代碼。

MSG msg;

HACCEL hAccelTable;

ZeroMemory(&msg,sizeof(MSG));

// 初始化全局字符串

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_HGEWIN32, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

hge=hgeCreate(HGE_VERSION);

hge->System_SetState(HGE_FRAMEFUNC,FrameFunc);

hge->System_SetState(HGE_WINDOWED,true);

hge->System_SetState(HGE_USESOUND,false);

hge->System_SetState(HGE_TITLE,"hge in win32");

// 執行應用程序初始化:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_HGEWIN32));

while(msg.message!=WM_QUIT)

{

if(PeekMessage(&msg,0,0,0,PM_REMOVE))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

else

{

if(hge->System_GetState(HGE_HWND))

{

hge->System_Start();

}

}

}

// 主消息循環:

//while (GetMessage(&msg, NULL, 0, 0))

//{

// if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

// {

// TranslateMessage(&msg);

// DispatchMessage(&msg);

// }

//}

return (int) msg.wParam;

}

//

// 函數: MyRegisterClass()

//

// 目的: 註冊窗口類。

//

// 註釋:

//

// 僅當希望

// 此代碼與添加到 Windows 95 中的“RegisterClassEx”

// 函數之前的 Win32 系統兼容時,才需要此函數及其用法。調用此函數十分重要,

// 這樣應用程序就可以獲得關聯的

// “格式正確的”小圖標。

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style = CS_HREDRAW CS_VREDRAW;

wcex.lpfnWndProc = WndProc;

wcex.cbClsExtra = 0;

wcex.cbWndExtra = 0;

wcex.hInstance = hInstance;

wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_HGEWIN32));

wcex.hCursor = LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName = MAKEINTRESOURCE(IDC_HGEWIN32);

wcex.lpszClassName = szWindowClass;

wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);

}

//

// 函數: InitInstance(HINSTANCE, int)

//

// 目的: 保存實例句柄並創建主窗口

//

// 註釋:

//

// 在此函數中,我們在全局變量中保存實例句柄並

// 創建和顯示主程序窗口。

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // 將實例句柄存儲在全局變量中

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)

{

return FALSE;

}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;

}

//

// 函數: WndProc(HWND, UINT, WPARAM, LPARAM)

//

// 目的: 處理主窗口的消息。

//

// WM_COMMAND - 處理應用程序菜單

// WM_PAINT - 繪製主窗口

// WM_DESTROY - 發送退出消息並返回

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

int width,height;

switch (message)

{

case WM_CREATE:

hge->System_SetState(HGE_HWNDPARENT,hWnd);

hge->System_SetState(HGE_HIDEMOUSE,false);

hge->System_Initiate();

SetFocus(hge->System_GetState(HGE_HWND));

hge->System_Start();

break;

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// 分析菜單選擇:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

break;

case IDM_EXIT:

DestroyWindow(hWnd);

break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

break;

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: 在此添加任意繪圖代碼...

EndPaint(hWnd, &ps);

break;

case WM_SIZE:

width=LOWORD(lParam);

height=HIWORD(lParam);

MoveWindow(hge->System_GetState(HGE_HWND),

0, 0, width, height, true);

break;

case WM_DESTROY:

hge->System_Shutdown();

PostQuitMessage(0);

return FALSE;

//PostQuitMessage(0);

//break;

default:

return DefWindowProc(hWnd, message, wParam, lParam);

}

return 0;

}

// “關於”框的消息處理程序。

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

UNREFERENCED_PARAMETER(lParam);

switch (message)

{

case WM_INITDIALOG:

return (INT_PTR)TRUE;

case WM_COMMAND:

if (LOWORD(wParam) == IDOK LOWORD(wParam) == IDCANCEL)

{

EndDialog(hDlg, LOWORD(wParam));

return (INT_PTR)TRUE;

}

break;

}

return (INT_PTR)FALSE;

}

編譯完成結果如圖

如何將hge遊戲引擎移植到Win32子窗口

相關問題答案