?? asl_winapp.cpp
字號:
//-----------------------------------------------------------------------------
//
// ____ Azure Star Game Engine 藍星游戲引擎 ____
//
// Copyright (c) 2006, 藍星工作室
// All rights reserved.
//
// 文件名稱: asl_winapp.cpp
// 摘 要: 應用程序框架類實現
//
// 當前版本: 1.0
// 作 者: 湯 祺
// 創建日期: 2006-7-23
//
//-----------------------------------------------------------------------------
#include "asl_winapp.h"
#include "asl_timer.h"
namespace ASL
{
// 全局變量, 指向全局唯一的應用程序對象
ASLWinApp *Application = 0;
//-----------------------------------------------------------------------------
// 函數名: ASLWinApp::ASLWinApp()
// 功 能: 構造函數
// 參 數: [void] - 無
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
ASLWinApp::ASLWinApp(void)
: m_hWnd(NULL)
, m_hInst(GetModuleHandle(0))
, m_dwFixedDelta(0)
, m_Timer(TIMER_PRECISION, false)
, m_nFps(0)
, m_fDelta(0.0f)
, m_bActive(false)
, m_bShowCursor(false)
{
Application = this;
EnableMemoryLeakCheck();
}
//-----------------------------------------------------------------------------
// 函數名: ASLWinApp::~ASLWinApp()
// 功 能: 析構函數
// 參 數: [void] - 無
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
ASLWinApp::~ASLWinApp(void)
{
}
//-----------------------------------------------------------------------------
// 函數名: ASLWinApp::Run()
// 功 能: 運行應用程序
// 參 數: [void] - 無
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void ASLWinApp::Run(void)
{
ASSERT(m_hWnd != NULL);
MSG msg;
m_Timer.Play();
m_bActive = true;
while (true)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage( &msg, NULL, 0, 0))
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else if (m_bActive)
{
DWORD dwTime = m_Timer.GetTime();
// 間隔達到要求
if (dwTime >= m_dwFixedDelta)
{
// 重置計時器
m_Timer.Stop();
m_Timer.Play();
// 計算FPS
if (dwTime != 0) // 防止除0錯誤
{
m_nFps = TIMER_PRECISION / dwTime;
}
else
{
m_nFps = TIMER_PRECISION;
}
// 計算間隔
m_fDelta = (float)dwTime / TIMER_PRECISION;
// 執行程序邏輯
INPUT.Update();
GUI.Update(m_fDelta);
OnIdle();
SCREEN.Update();
}
}
else
{
WaitMessage();
}
}
}
//-----------------------------------------------------------------------------
// 函數名: ASLWinApp::Create()
// 功 能: 創建應用程序, 必須在Init()中調用
// 參 數: [width] - 窗口寬度
// [height] - 窗口高度
// [wndName] - 窗口名
// [fullScreen] - 是否全屏
// [showCursor] - 是否顯示鼠標指針
// [waitVSync] - 是否等待垂直刷新
// [iconName] - 圖標名
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void ASLWinApp::Create(int width, int height, LPCSTR wndName, bool fullScreen,
bool showCursor, bool waitVSync, LPCSTR iconName)
{
// 檢測是否支持MMX指令
if (!IsMMX())
{
MessageBox(0, "CPU不支持MMX指令,程序無法執行!", "錯誤", MB_OK | MB_ICONSTOP);
exit(1);
}
// 注冊窗口
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)_WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = m_hInst;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;//(HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = wndName;
wc.hIcon = iconName == NULL ? LoadIcon(NULL, IDI_APPLICATION)
: LoadIcon(m_hInst, iconName);
RegisterClass(&wc);
// 創建窗口
DWORD style;
RECT rc;
if (fullScreen)
{
style = WS_POPUP;
}
else
{
style = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
}
SetRect(&rc, 0, 0, width, height);
AdjustWindowRect(&rc, style, NULL);
int w = rc.right - rc.left;
int h = rc.bottom - rc.top;
SystemParametersInfo(SPI_GETWORKAREA, NULL, &rc, NULL);
int x = rc.left + (rc.right - rc.left - w) / 2;
int y = rc.top + (rc.bottom - rc.top - h) / 2;
m_hWnd = CreateWindow(wndName, wndName, style,
x, y, w, h, NULL, NULL, m_hInst, NULL);
// 顯示窗口
ShowWindow(m_hWnd, SW_SHOW);
m_bShowCursor = showCursor;
SCREEN.Init(m_hWnd, width, height, fullScreen, waitVSync);
INPUT.Init(m_hWnd);
AUDIO.Init(m_hWnd);
GUI.Init(SCREEN);
}
//-----------------------------------------------------------------------------
// 函數名: CALLBACK ASLWinApp::_WndProc()
// 功 能: 窗口消息處理函數
// 參 數: [hWnd] - 窗口句柄
// [message] - 消息類型
// [wParam] - 第1輔助參數
// [lParam] - 第2輔助參數
// 返回值: [LRESULT] - 處理結果
//-----------------------------------------------------------------------------
LRESULT CALLBACK ASLWinApp::_WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
if (Application == NULL)
{
return DefWindowProc(hWnd, message, wParam, lParam);
}
INPUT.MsgProc(message, wParam, lParam);
switch (message)
{
case WM_SETCURSOR:
if (Application->m_bActive && LOWORD(lParam) == HTCLIENT)
{
if (Application->m_bShowCursor)
{
SetCursor(LoadCursor(NULL, IDC_ARROW));
}
else
{
SetCursor(NULL);
}
}
else
{
SetCursor(LoadCursor(NULL, IDC_ARROW));
}
break;
case WM_ACTIVATEAPP:
Application->m_bActive = wParam == TRUE ? true : false;
Application->OnActivate(Application->m_bActive);
if (Application->m_bActive)
{
Application->m_Timer.Play();
}
else
{
Application->m_Timer.Stop();
}
break;
case WM_PAINT:
ValidateRect(hWnd, NULL);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_CLOSE:
if (Application->OnClose())
{
Application->m_bActive = false;
DestroyWindow(hWnd);
}
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
} // namespace ASL
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -