📄 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 + -