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

📄 gameclient.cpp

📁 HGE 2D游戏引擎制作的一个演示
💻 CPP
字号:
#pragma once

#include "extern.h"
#include <commctrl.h>

#define WINDOW_WIDTH	800
#define WINDOW_HEIGHT	600

#define WINDOWS_CLASS_NAME	"GameClient"

char g_szWindowsTitle[] = "GameClient";

// 全局变量:
HINSTANCE g_hInstance;								// 当前实例
HWND g_hEditWnd = NULL;
LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK LoadWndProc(HWND, UINT, WPARAM, LPARAM);

bool	InitCOREEngine(HWND hWnd,HINSTANCE hInstance,LONG lStyle,RECT &rcWindow);
bool	InitGameClient(HWND hWnd);
bool	ExitGameClient();
bool	ChangeWindows(HWND,bool);

// 时间片
enum TIMER_TYPE
{
	TIMER_EXIT = 0,
};

// 程序入口
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	ATLTRACE("===== Begin Run App: %s =====\n",g_szWindowsTitle);

	//_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
	//_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

	////第二次运行时根据内存号来定位有溢出的地方
	//_CrtSetBreakAlloc(35451);

	MSG msg;
	WNDCLASSEX wcex;
	wcex.cbSize = sizeof(WNDCLASSEX); 
	wcex.style			= CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= (WNDPROC)MainWndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_GAMECLIENT);
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)GetStockObject(BLACK_BRUSH/*WHITE_BRUSH*/);
	wcex.lpszMenuName	= NULL;
	wcex.lpszClassName	= WINDOWS_CLASS_NAME;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);

	RegisterClassEx(&wcex);
	g_hInstance = hInstance;

	RECT rcWindow;
	rcWindow.left	= (GetSystemMetrics(SM_CXSCREEN) - WINDOW_WIDTH)/2;
	rcWindow.top	= (GetSystemMetrics(SM_CYSCREEN) - WINDOW_HEIGHT)/2;
	rcWindow.right	= rcWindow.left + WINDOW_WIDTH;
	rcWindow.bottom	= rcWindow.top + WINDOW_HEIGHT;

	DWORD dwWindowStyle =
		WS_POPUP		|		// 窗口可绘制任意位置屏幕上
		WS_SYSMENU		|		// 窗口拥有系统菜单
		WS_CLIPSIBLINGS	|		// 被同级窗口挡住的部分不会重画
		WS_CLIPCHILDREN;		// 被子窗口挡住的部分不会重画

	HWND hWnd = CreateWindowEx(0, WINDOWS_CLASS_NAME, g_szWindowsTitle, dwWindowStyle,
		rcWindow.left,rcWindow.top, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);

	if (!hWnd)
		return FALSE;

	HWND hLoadWnd = CreateDialog(hInstance,(LPCTSTR)IDD_LOADING_DLG,hWnd,(DLGPROC)LoadWndProc);
	ResourceManager::m_hLoadWnd = hLoadWnd;
	RECT rcLoadWnd;
	SIZE sizeLoadWnd;
	::GetWindowRect(hLoadWnd,&rcLoadWnd);
	sizeLoadWnd.cx = rcLoadWnd.right - rcLoadWnd.left;
	sizeLoadWnd.cy = rcLoadWnd.bottom - rcLoadWnd.top;
	int nLoadX = (GetSystemMetrics(SM_CXSCREEN) - sizeLoadWnd.cx) / 2;
	int nLoadY = (GetSystemMetrics(SM_CYSCREEN) - sizeLoadWnd.cy) / 2;

	::SetWindowPos(hLoadWnd,NULL,nLoadX,nLoadY,0,0,SWP_NOZORDER|SWP_NOSIZE|SWP_SHOWWINDOW|SWP_DRAWFRAME);

	if(InitCOREEngine(hWnd,hInstance,dwWindowStyle,rcWindow))
	{
		ShowWindow(hWnd, SW_SHOW);
		//ShowWindow(g_hEditWnd, SW_SHOW);
		::DestroyWindow(hLoadWnd);

		while (GetMessage(&msg,NULL,0,0))
		{
			TranslateMessage(&msg);								//这句不能去掉,不然会收不到中文输入的回车键
			DispatchMessage(&msg);
		}
	}

	ExitGameClient();

	ATLTRACE("===== End App: %s =====\n",g_szWindowsTitle);

	return (int) 0;
}

void OnCreate(HWND hWnd)
{
	DWORD dwStyle = WS_POPUP | WS_TABSTOP | ES_LEFT | ES_AUTOHSCROLL;
	DWORD dwStyleEx = WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR | WS_EX_NOPARENTNOTIFY;
	g_hEditWnd = CreateWindowEx(dwStyleEx,"edit","按钮",dwStyle,10,10,100,50,hWnd,NULL,g_hInstance,NULL);
}

LRESULT CALLBACK MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	static bool bMouseLeave = false;
	int			xPos,yPos;
	RECT		rcWnd;

	static int abc = 0;

	switch (message) 
	{
	//case WM_ACTIVATEAPP:
	//	if (wParam == TRUE && g_pMainThread)
	//	{
	//		EnterCriticalSection(&g_pMainThread->m_CS);	
	//		GetWindowRect(hWnd,&rcWnd);
	//		GUI::GUIResize(rcWnd);
	//		LeaveCriticalSection(&g_pMainThread->m_CS);	
	//	}
	//	return FALSE;
	//case WM_SIZE:
	//	if (wParam == SIZE_RESTORED && g_pMainThread)
	//	{
	//		EnterCriticalSection(&g_pMainThread->m_CS);	
	//		GetWindowRect(hWnd,&rcWnd);
	//		GUI::GUIResize(rcWnd);
	//		LeaveCriticalSection(&g_pMainThread->m_CS);	
	//	}
	//	break;
	case WM_CTLCOLOREDIT:
		{
			::SetTextColor((HDC)wParam,RGB(255,0,255));
			::SetBkColor((HDC)wParam,RGB(0,0,0));
			::SetBkMode((HDC)wParam,TRANSPARENT);
			return (LRESULT)GetStockObject(BLACK_BRUSH);
		}
		break;
	case WM_CREATE:
		OnCreate(hWnd);
		break;
	case WM_SYSKEYDOWN:if(wParam==VK_F4){break;}
	case WM_SYSKEYUP:
	case WM_KEYUP:
	case WM_KEYDOWN:
	case WM_CHAR:
		EnterCriticalSection(&g_pMainThread->m_CS);	
		g_pGUIRoot->OnKeyboardMsg(message,wParam,lParam);
		LeaveCriticalSection(&g_pMainThread->m_CS);	
		return 0;
	// 添加鼠标离开主窗口通知消息
	case WM_MOUSELEAVE:
		EnterCriticalSection(&g_pMainThread->m_CS);	
		g_pGUIRoot->DefMouseMoveOut();
		LeaveCriticalSection(&g_pMainThread->m_CS);	
		bMouseLeave =false;
		break;
	case WM_MOUSEMOVE:		///鼠标移动
		if (bMouseLeave == false)
		{
			bMouseLeave = true;
			// 鼠标第一次移入窗口时, 请求一个WM_MOUSELEAVE 消息
			TRACKMOUSEEVENT tme;
			tme.cbSize = sizeof(tme);
			tme.hwndTrack = hWnd;
			tme.dwFlags = TME_LEAVE;
			_TrackMouseEvent(&tme);
		}
	case WM_LBUTTONDOWN:	///鼠标左键按下
	case WM_LBUTTONUP:		///鼠标左键松开
	case WM_LBUTTONDBLCLK:	///鼠标左键双击
	case WM_MBUTTONDOWN:	///鼠标左键按下
	case WM_MBUTTONUP:		///鼠标左键松开
	case WM_MBUTTONDBLCLK:	///鼠标左键双击
	case WM_RBUTTONDOWN:	///鼠标左键按下
	case WM_RBUTTONUP:		///鼠标左键松开
	case WM_RBUTTONDBLCLK:	///鼠标左键双击
		EnterCriticalSection(&g_pMainThread->m_CS);
		g_pGUIRoot->OnMouseMessage(message,wParam,lParam);
		LeaveCriticalSection(&g_pMainThread->m_CS);
		return 0;
	case WM_MOUSEWHEEL:		///鼠标滚轮
		xPos = (short) LOWORD(lParam);		//注意:滚轮消息的坐标和其他鼠标消息不一样,它是屏幕坐标,要用的话先换算
		yPos = (short) HIWORD(lParam);
		GetWindowRect(hWnd,&rcWnd);
		xPos -= rcWnd.left;
		yPos -= rcWnd.top;
		lParam = xPos + (yPos << 16);		//换算成窗口坐标
		EnterCriticalSection(&g_pMainThread->m_CS);
		g_pGUIRoot->OnMouseMessage(message,wParam,lParam);
		LeaveCriticalSection(&g_pMainThread->m_CS);
		return FALSE;
	case CMD_BTN_MIN:
		ShowWindow(hWnd,SW_MINIMIZE);
		return FALSE;
	case CMD_BTN_CLOSE:
		GUI::EndGUIEngine();
		return FALSE;
	case WM_CLOSE:
		// 中止线程,进入定时器检查
		g_pMainThread->SetActive(false);
		g_pMainThread->EndThread();
		SetTimer(hWnd,TIMER_EXIT,100,NULL);
		return FALSE;
	case WM_TIMER:
		if (wParam == TIMER_EXIT)
		{
			// 用定时器检测线程是否真的结束了
			if (g_pMainThread->IsEndDone())
			{
				KillTimer(hWnd,TIMER_EXIT);
				DestroyWindow(hWnd);
			}
		}
		return FALSE;
	case WM_DESTROY:			//销毁
		PostQuitMessage(0);
		return FALSE;
	case WM_MOVE:
		{
			GetWindowRect(hWnd,&rcWnd);
			xPos = rcWnd.left;
			yPos = rcWnd.top;
			::SetWindowPos(g_hEditWnd,NULL,xPos + 10,yPos + 10,0,0,SWP_NOSIZE/* | SWP_NOZORDER*/);
		}
		break;
	case WM_PAINT:
		{
			GetWindowRect(hWnd,&rcWnd);
			HRGN hRgn = CreateRoundRectRgn(0,0,rcWnd.right-rcWnd.left+1,rcWnd.bottom-rcWnd.top+1,20,20);
			SetWindowRgn(hWnd,hRgn,TRUE);
			DeleteObject(hRgn);
		}
		break;
	}
	return DefWindowProc(hWnd, message, wParam, lParam);
}

LRESULT CALLBACK LoadWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch (message) 
	{
	case WM_INITDIALOG:
		UpdateWindow(hWnd);
		return TRUE;
	case WM_CORE_LOADING:
		sprintf(g_pBuf,"%s LOADING:%d%%",wParam==0?"TEX":(wParam==1?"SND":"ANI"),lParam);
		SetDlgItemText(hWnd,IDC_STATIC_LOADING,g_pBuf);
		break;
	}
	return FALSE;//DefWindowProc(hWnd, message, wParam, lParam);
}

bool InitCOREEngine(HWND hWnd,HINSTANCE hInstance,LONG lStyle,RECT &rcWindow)
{
	bool bRet = false;
	RECT rcClient;
	GetClientRect(hWnd,&rcClient);

	///创建引擎核心
	g_pCORE = (CORE*)CoreCreate(CORE_VERSION);
	if (!g_pCORE)
		return false;

	ANIObject::InitANIObject(g_pCORE);

	///初始化引擎核心
	BASECORE init;
	init.hWnd = hWnd;
	init.nWidth = rcWindow.right - rcWindow.left;
	init.nHeight = rcWindow.bottom - rcWindow.top;
	init.nBPP = 32;
	init.rcWnd = rcWindow;
	init.lStyleWnd = lStyle;
	BOOL bInit = CoreInitialize(init,"config.ini");
	if (!bInit)
		return false;

	///创建资源管理器
	bRet = CreateResourceManager(g_pCORE);
	if (!bRet)
		return false;


	// 加载资源包
	char *_lpszResourcePack = g_pCORE->Ini_GetString("CONFIG","PACK","");
	bRet = g_pCORE->Resource_AttachPack(_lpszResourcePack);
	if (!bRet)
		return false;

	char *_lpszResourceFile = g_pCORE->Ini_GetString("CONFIG","SCRIPT","");
	bRet = LoadResourceFromScript(_lpszResourceFile);
	if (!bRet)
		return false;

	// 卸载资源包
	g_pCORE->Resource_RemoveAllPacks();

	///创建系统字体(加载项目内部字体纹理资源)
	g_pResourceManager->LoadTexFromRC(IDR_SYSFONT_PNG_12,TEXT("SYSFONT"),"font_12.png");
	char *_lpszFontCNFile = g_pCORE->Ini_GetString("CONFIG","FONTCN","");
	bRet = CreateGUIFont(g_pCORE,_lpszFontCNFile);
	if (!bRet)
		return bRet;

	//if(!ClientSocketInit())
	//{
	//	WriteLog(TRUE,"初始化网络失败,请检查您的网络配置是否正常!");
	//	return FALSE;
	//}

	///创建线程
#ifdef _DEBUG
	WriteLog(FALSE,"创建工作线程");
#endif
	g_pMainThread = new MainThread();
	if(NULL == g_pMainThread)
	{
		WriteLog(TRUE,"无法创建主线程,游戏结束!");
		return false;
	}
	g_pMainThread->SetMainWnd(hWnd);

	return InitGameClient(hWnd);
}

bool InitGameClient(HWND hWnd)
{
	///创建根对象
	g_pGUIRoot = new GUIRoot;
	if (!g_pGUIRoot->CreateGUIRoot("RootGUI",0,0,WINDOW_WIDTH,WINDOW_HEIGHT))
	{
		WriteLog(FALSE,"创建GUIRoot失败");
		return false;
	}

	GUI::InitGUIEngine(g_pCORE,g_pGUIRoot);

	if (!g_pGUIRoot->InitGUIRoot())
	{
		WriteLog(FALSE,"初始化GUIRoot失败");
		return false;
	}
	g_pGUIRoot->ShowTitleBarButton(false,true);

	float ClientWidth = g_pGUIRoot->GetClientFrameWidth();
	float ClientHeight = g_pGUIRoot->GetClientFrameHeight();

	//客户绘制区,游戏中所有的绘制均在此区域中进行
	g_pWindowFrame = new WindowFrame;
	if (!g_pWindowFrame)
		return false;
	if (!g_pWindowFrame->CreateWindowFrame("mainback",ClientWidth,ClientHeight,g_pGUIRoot))
		return false;
	g_pGUIRoot->SetClientFrame(g_pWindowFrame);

	///启动线程
	g_pMainThread->StartThread();
	g_pMainThread->SetActive(TRUE);

	return true;
}

bool ExitGameClient()
{
	DELETE_OBJECT(g_pGUIRoot);
	DELETE_OBJECT(g_pFontCN);
	DELETE_OBJECT(g_pResourceManager);
	DELETE_OBJECT(g_pMainThread);
	CoreDestroy(CORE_VERSION);
	return true;
}

⌨️ 快捷键说明

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