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

📄 piratemain.cpp

📁 一个类似坦克大战的小小游戏
💻 CPP
字号:

/**************************************************************************************
	Project  Name			: Pirates Of The Caribbean
	Module Name				: Win Main
	File Name				: PirateMain.cpp
	Create					: 2007-7-13, by Vigame
	Completed				: 
	Update					: 
	Copyright				: o(∩_∩)o
	Reference				: 
	Abstrct					: You may do whatever you want with this code, as long as 
							 you include this copyright notice in your implementation
							 files.Comments and bug Reports: vigor1985@gmail.com,
							  QQ:15061260, I'll right here wait for you, ^_^
																by Vigame, 2007-7-12
 **************************************************************************************/

#include <windows.h>
#include "resource.h"
#include "Game.h"

const int WIDTH = 960;
const int HEIGHT = 540;

bool g_bActive = false;
CGame *g_pGame = NULL;
HINSTANCE hInst = NULL;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK HelpProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
	char ClassName[] = "pirate";
	char WindowName[] = "Pirates of the Caribbean";
	WNDCLASSEX wc;
	HWND hWnd;
	MSG	msg; 
	hInst = hInstance;

	// Register
	wc.cbClsExtra = 0;
	wc.cbSize = sizeof(WNDCLASSEX);
	wc.cbWndExtra = 0;
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.hCursor = (HCURSOR)::LoadCursor(NULL, IDC_ARROW);
	wc.hIcon = ::LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
	wc.hIconSm = ::LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1));
	wc.hInstance = hInstance;
	wc.lpfnWndProc = WndProc;
	wc.lpszClassName = ClassName;
	wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
	wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;

	if (0 == RegisterClassEx(&wc))
	{
		return -1;
	}

	// Create Window
	hWnd = ::CreateWindowEx(NULL, ClassName, WindowName, 
						WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX, 
						(GetSystemMetrics(SM_CXFULLSCREEN) - WIDTH) / 2,
						(GetSystemMetrics(SM_CYFULLSCREEN) - HEIGHT) / 2, 
							WIDTH, HEIGHT + 100, NULL, NULL, hInstance, NULL);

	if (NULL == hWnd)
	{
		return -1;
	}

	// Show Window
	::ShowWindow(hWnd, SW_SHOWDEFAULT);
	::UpdateWindow(hWnd);

	//Init Game
	g_pGame = new CGame;
	if (NULL != g_pGame)
	{
		if (!g_pGame->Init(hWnd, hInstance))
		{
			g_pGame->m_gameType = GT_SinglePlayer;
			return -1;
		}
	}

	// Message loop
	::PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
	while (msg.message != WM_QUIT)
	{
		if(::PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
		{
			// Process message
			::TranslateMessage(&msg);
			::DispatchMessage(&msg);
		}
		else if(GS_Run == g_pGame->m_gameState)
		{
			// Game loop
			g_pGame->Run();
			g_pGame->Render();
		}
		else if (GS_Title == g_pGame->m_gameState)
		{
			g_pGame->DrawGameState(0);
		}
		else if (GS_Over == g_pGame->m_gameState)
		{
			g_pGame->DrawGameState(1);
		}
	}
	
	// Release Game resources.
	SAFE_DELETE(g_pGame);

	UnregisterClass(ClassName,hInstance);

	return (int)msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	case WM_KEYDOWN:
		switch (wParam)
		{
		case VK_RETURN:
			{
				if (NULL != g_pGame)
				{
					if (GS_Title == g_pGame->m_gameState)
					{
						g_pGame->ResetGame();
						g_pGame->m_gameState  = GS_Run;
					}
				}
			}
			break;
		default:
			break;
		}
	case WM_COMMAND:		// Process menu command
		{
			if (NULL != g_pGame)
			{
				switch (LOWORD(wParam))
				{
				case START_GAME:
					{
						g_pGame->ResetGame();
						g_pGame->m_gameState = GS_Run;
						break;
					}
				case RESET_GAME:
					{
						g_pGame->ResetGame();
						g_pGame->m_gameState = GS_Run;
						break;
					}
				case LOAD_MAP:
					{
						if (g_pGame->LoadMap())
						{
							g_pGame->ResetMap();
							g_pGame->m_gameState = GS_Run;
						}
						break;
					}
				case EXIT_GAME:
					{
						PostQuitMessage(0);
						break;
					}
				case SINGLE_MODE:
					{
						g_pGame->m_gameType = GT_SinglePlayer;
						break;
					}
				case MULTI_MODE:
					{
						g_pGame->m_gameType = GT_MultiPlayer;
						break;
					}
				case FREEFORALL_MODE:
					{
						g_pGame->m_gameType = GT_FreeForAll;
						break;
					}
				case LOAD_MUSIC:
					{
						g_pGame->LoadBackgroundMusic();
						break;
					}
				case STOP_MUSIC:
					{
						g_pGame->StopBackgroundMusic();
						break;
					}
				case HELP:
					{
						DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_HELP), 
											 hWnd, (DLGPROC)HelpProc);
						break;
					}
				case ABOUT:
					{
						DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG_ABOUT), 
											 hWnd, (DLGPROC)HelpProc);
						break;
					}
				} // End switch (LOWORD(wParam))
			} // End if
		}
	case WM_GRAPHNOTIFY:	// Message private
		{
			if (NULL != g_pGame)
			{
				// Replay backgroun music
				/* DELETE by Vigame, 2007-7-27, use the CGame::ProcessEvent()
				   Function to process the event
				LONG eventCode;
				LONG param1, param2;
				while (SUCCEEDED(g_pGame->m_pMp3->GetEvnetInterface()->GetEvent(&eventCode, &param1, &param2, 0)))
				{
					g_pGame->m_pMp3->GetEvnetInterface()->FreeEventParams(eventCode, param1, param2);
					if (EC_COMPLETE == eventCode )
					{
						g_pGame->PlayBackgroundMusic();
						break; 
					}
				}*/
				g_pGame->ProcessEvent();
			}
			break;
		}
	case WM_MOVE:
		break;
	case WM_SIZE:
		break;
	case WM_PAINT:
		{
			if (NULL != g_pGame)
			{
				if (GS_Run == g_pGame->m_gameState)
				{
					g_pGame->Render();
				}
				else if (GS_Title == g_pGame->m_gameState)
				{
					g_pGame->DrawGameState(0);
				}
				else if (GS_Over == g_pGame->m_gameState)
				{
					g_pGame->DrawGameState(1);
				}
			}
			break;
		}
	}

	return DefWindowProc(hWnd, message, wParam, lParam);
}

BOOL CALLBACK HelpProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 
        case WM_COMMAND: 
            switch (LOWORD(wParam)) 
			{ 
			case IDOK: 
				{
					EndDialog(hwndDlg, wParam); 
					break;
				}
			default:
				break;
            } 
    } 
    return FALSE; 
} 

⌨️ 快捷键说明

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