⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asl_winapp.cpp

📁 泡泡堂单机版(含ASL游戏引擎源码 泡泡堂单机版(含ASL游戏引擎源码
💻 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 + -