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

📄 gameengine.cpp

📁 一个MFC实例
💻 CPP
字号:
#include "GameEngine.h"
//==========================================================================

//静态变量初始化

//==========================================================================
GameEngine *GameEngine::m_pGameEngine = NULL;

//==========================================================================

//window 函数

//==========================================================================
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
				   PSTR szCmdLine,int iCmdShow)
{
	MSG			msg;
	

	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())
				{
					//查看是否过了一个游戏周期
					Sleep(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);
}

//============================================================================

//construction and distruction 

//============================================================================
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;
	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;
	int 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;
	int 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)
{
	switch(msg)
	{
	case WM_CREATE:						//创建Windows 游戏开始
		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_LBUTTONDOWN:				//处理鼠标左键单击

		MouseButtonDown(LOWORD(lParam),HIWORD(lParam),MOUSELEFT);
		return 0;
	case WM_KEYDOWN:
		//HandleKeys();
		return 0;
	case WM_DESTROY:
		GameEnd();
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hWindow, msg,wParam,lParam);
}

⌨️ 快捷键说明

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