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

📄 gameengine.cpp

📁 [简介] 名称: 《拼图》-附源代码 (代码行数:747 注释行数:164) 开发环境:WinXp+VC.Net2005+Win32 API 作者:mj 联系方式:mj055@yahoo.
💻 CPP
字号:
#include "GameEngine.h"

//----------------------------------------------------------------
//静态变量初始化
//----------------------------------------------------------------
GameEngine *GameEngine::m_pGameEngine = NULL;

//----------------------------------------------------------------
//Windows函数
//----------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
{
	MSG			msg;
	static int  iTickTrigger = 0;
	int			iTickCount;
	
	if (GameInitialize(hInstance))
	{
		//-------------初始化游戏引擎-------------
		if (!GameEngine::GetEngine()->Initialize(iCmdShow))
			return FALSE;

		//-------------进入主游戏循环-------------
		while(TRUE)
		{
			if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
			{
				//----------处理消息------------
				if(msg.message == WM_QUIT)
					break;
				TranslateMessage(&msg);
				DispatchMessage(&msg);
			}
			else
			{
				//----------确保游戏引擎没有休眠--------
				if(!GameEngine::GetEngine()->GetSleep())
				{
					//------检查滴答计数--------l
					iTickCount = GetTickCount();
					if(iTickCount > iTickTrigger)
					{
						iTickTrigger = iTickCount + GameEngine::GetEngine()->GetFrameDelay();
						HandleKeys();
						GameCycle();
					}
				}
			}
		}
		return  (int)msg.wParam;
	}

	//结束游戏
	GameEnd();

	return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWindow,UINT msg,WPARAM wParam,LPARAM lParam)
{
	//-----------将所有windows消息都传递给游戏引擎----------------
	return GameEngine::GetEngine()->HandleEvent(hWindow,msg,wParam,lParam);
}

//-------------------------------------------------------------------------------------------------------------------------
//GameEngine的构造函数/析构函数
//-------------------------------------------------------------------------------------------------------------------------
GameEngine::GameEngine(HINSTANCE hInstance,LPTSTR szWindowClass,LPTSTR szTitle,WORD wIcon,WORD wSmallIcon,int iWidth,int iHeight)
{
	//---------设置游戏引擎的成员变量-----------
	m_pGameEngine = this;
	m_hInstance = hInstance;
	m_hWindow = NULL;
	if(lstrlen(szWindowClass) > 0)
		lstrcpy(m_szWindowClass,szWindowClass);
	if(lstrlen(szTitle) > 0)
		lstrcpy(m_szTitle,szTitle);
	m_wIcon = wIcon;
	m_wSmallIcon = wSmallIcon;
	m_iWidth = iWidth;
	m_iHeight = iHeight;
	m_iFrameDelay = 50;//默认为20帧/秒
	m_bSleep = TRUE;
}

GameEngine::~GameEngine()
{
}

//--------------------------------------------------------------------------------------------------
//游戏引擎常规方法
//--------------------------------------------------------------------------------------------------
BOOL GameEngine::Initialize(int iCmdShow)
{
	WNDCLASSEX wndclass;

	//----------------创建主窗口的窗口类--------------------
	wndclass.cbSize			= sizeof(wndclass);
	wndclass.style			= CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc	= WndProc;
	wndclass.cbClsExtra		= 0;
	wndclass.cbWndExtra		= 0;
	wndclass.hInstance		= m_hInstance;
	wndclass.hIcon			= LoadIcon(m_hInstance,MAKEINTRESOURCE(GetIcon()));
	wndclass.hIconSm		= LoadIcon(m_hInstance,MAKEINTRESOURCE(GetSmallIcon()));
	wndclass.hCursor		= LoadCursor(NULL,IDC_ARROW);
	wndclass.hbrBackground	= (HBRUSH)(COLOR_WINDOW + 1);
	wndclass.lpszMenuName	= NULL;
	wndclass.lpszClassName	= m_szWindowClass;

	//------------------注册窗口类---------------------
	if (!RegisterClassEx(&wndclass))
		return FALSE;

	//------------------根据游戏大小计算窗口大小和位置-------------------------
	int iWindowWidth = m_iWidth + GetSystemMetrics(SM_CXFIXEDFRAME) * 2,
		iWindowHeight = m_iHeight + GetSystemMetrics(SM_CYFIXEDFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION);

	if(wndclass.lpszMenuName != NULL)
		iWindowHeight += GetSystemMetrics(SM_CYMENU);
	int iXWindowPos = (GetSystemMetrics(SM_CXSCREEN) - iWindowWidth) /2,
		iYWindowPos = (GetSystemMetrics(SM_CYSCREEN) - iWindowHeight) /2;

	//------------------创建窗口------------------------
	m_hWindow = CreateWindow(m_szWindowClass,m_szTitle,WS_POPUPWINDOW | WS_CAPTION | WS_MINIMIZEBOX,iXWindowPos,iYWindowPos,iWindowWidth,iWindowHeight,NULL,NULL,m_hInstance,NULL);
	if(!m_hWindow)
		return FALSE;

	//------------------显示和更新窗口-------------------
	ShowWindow(m_hWindow,iCmdShow);
	UpdateWindow(m_hWindow);

	return TRUE;

}

LRESULT GameEngine::HandleEvent(HWND hWindow,UINT msg,WPARAM wParam,LPARAM lParam)
{
	//-------------将Windows消息传递给游戏引擎成员函数-------------
	switch (msg)
	{
		case WM_CREATE:
			//---------设置游戏窗口并开始游戏-------------
			SetWindow(hWindow);
			GameStart(hWindow);
			return 0;

		case WM_SETFOCUS:
			//---------激活游戏并更新休眠状态-------------
			GameActivate(hWindow);
			SetSleep(FALSE);
			return 0;

		case WM_KILLFOCUS:
			//---------停用游戏并更新休眠状态-------------
			GameDeactivate(hWindow);
			SetSleep(TRUE);
			return 0;

		case WM_PAINT:
			HDC hDC;
			PAINTSTRUCT ps;
			hDC = BeginPaint(hWindow,&ps);
			//--------绘制游戏-------
			GamePaint(hDC);
			EndPaint(hWindow,&ps);
			return 0;

		case WM_DESTROY:
			//---------结束游戏并退出应用程序----------
			GameEnd();
			PostQuitMessage(0);
			return 0;

		case WM_LBUTTONDOWN:
		// Handle left mouse button press
		MouseButtonDown(LOWORD(lParam), HIWORD(lParam), TRUE);
		return 0;

		case WM_LBUTTONUP:
		// Handle left mouse button release
		MouseButtonUp(LOWORD(lParam), HIWORD(lParam), TRUE);
		return 0;

		case WM_RBUTTONDOWN:
		// Handle right mouse button press
		MouseButtonDown(LOWORD(lParam), HIWORD(lParam), FALSE);
		return 0;

		case WM_RBUTTONUP:
		// Handle right mouse button release
		MouseButtonUp(LOWORD(lParam), HIWORD(lParam), FALSE);
		return 0;

		case WM_MOUSEMOVE:
		// Handle mouse movement
		MouseMove(LOWORD(lParam), HIWORD(lParam));
		return 0;
	}
	return DefWindowProc(hWindow,msg,wParam,lParam);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -