www.pudn.com > GameBasicLesson5.rar > MyGame.cpp


// MyGame.cpp : 定义应用程序的入口点。 
// 
 
#include "stdafx.h" 
#include "MyGame.h" 
#define MAX_LOADSTRING 100 
 
bool g_bActive = true; 
 
LP_BITMAPX		g_pBitmapBMP	= NULL; 
LP_BITMAPX		g_pBitmapTGA	= NULL; 
LP_BITMAPX		g_pBitmapJPG	= NULL; 
 
// GDI字体句柄 
HFONT			g_hFont			= NULL; 
 
// HoHo自处理字体句柄 
LP_FONT			g_pHoHoFont		= NULL; 
 
// 全局变量: 
HINSTANCE hInst;								// 当前实例 
TCHAR szTitle[MAX_LOADSTRING];					// 标题栏文本 
TCHAR szWindowClass[MAX_LOADSTRING];			// 主窗口类名 
 
// 此代码模块中包含的函数的前向声明: 
ATOM				MyRegisterClass(HINSTANCE hInstance); 
BOOL				InitInstance(HINSTANCE, int); 
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM); 
LRESULT CALLBACK	About(HWND, UINT, WPARAM, LPARAM); 
 
int APIENTRY _tWinMain(HINSTANCE hInstance, 
                     HINSTANCE hPrevInstance, 
                     LPTSTR    lpCmdLine, 
                     int       nCmdShow) 
{ 
 	// TODO: 在此放置代码。 
	MSG msg; 
	HACCEL hAccelTable; 
 
	// 初始化全局字符串 
	LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); 
	LoadString(hInstance, IDC_MYGAME, szWindowClass, MAX_LOADSTRING); 
	MyRegisterClass(hInstance); 
 
	// 执行应用程序初始化: 
	if (!InitInstance (hInstance, nCmdShow))  
	{ 
		return FALSE; 
	} 
 
	hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_MYGAME); 
 
	// 主消息循环: 
	while ( 1 )  
	{ 
		if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) 
		{ 
			if( GetMessage( &msg, NULL, 0, 0 ) ) 
			{ 
				TranslateMessage( &msg ); 
				DispatchMessage( &msg ); 
			} 
			else 
				break; 
		} 
 
		if( g_bActive )		// 激活状态 
		{ 
//			GetGraphics()->ClearScreenMMX(0);	// 用黑色清屏 
 
			// 绘制背景图 
			GetGraphics()->DrawBitmapMMX( 0, 0, g_pBitmapJPG, SCREENBUFFER ); 
 
 
			// 普通绘制 人物 
			GetGraphics()->DrawBitmapMMX( 100, 100, g_pBitmapBMP, SCREENBUFFER ); 
 
			// 颜色键(ColorKey)绘制 人物 
			GetGraphics()->DrawBitmapMMX( 250, 100, g_pBitmapBMP, SCREENBUFFER, true ); 
 
			// Alpha混合 人物 
			GetGraphics()->DrawBitmapAlphaMMX( 400, 100, g_pBitmapBMP, SCREENBUFFER, 16 ); 
 
			// Additive混合 人物 
			GetGraphics()->DrawBitmapAdditiveMMX( 550, 100, g_pBitmapBMP, SCREENBUFFER ); 
 
			// AlphaChannel混合 树 
			GetGraphics()->DrawBitmapAlphaChannelMMX( 300, 300, g_pBitmapTGA, SCREENBUFFER ); 
 
			// Rect裁减绘图 
			RECT rect = { 0, 0, 32, 48 }; 
			GetGraphics()->DrawBitmapMMX( 700, 100, g_pBitmapBMP, SCREENBUFFER, &rect ); 
			GetGraphics()->DrawBitmapMMX( 750, 100, g_pBitmapBMP, SCREENBUFFER, &rect, true ); 
			GetGraphics()->DrawBitmapAlphaMMX( 700, 160, g_pBitmapBMP, SCREENBUFFER, &rect, 16 ); 
			GetGraphics()->DrawBitmapAdditiveMMX( 750, 160, g_pBitmapBMP, SCREENBUFFER, &rect ); 
 
 
			GetGraphics()->DrawText( SCREENBUFFER, 30, 30, g_hFont, "GDI字体 Test 测试", RGB2Hi(255,255,255) ); 
 
			GetGraphics()->DrawFont( SCREENBUFFER, 30, 60, g_pHoHoFont, RGB2Hi(255,255,255), "HOHO字体 Test 测试" ); 
 
			GetGraphics()->UpdateScreen( );		// 更新屏幕缓冲 
			GetGraphics()->Present( );			// DDraw更新屏幕 
		} 
		else				// 非激活状态 
			Sleep( 1 ); 
	} 
 
	SAFE_DELETE( g_pDisplay ); 
	msReleaseFont( g_pHoHoFont ); 
 
	return (int) msg.wParam; 
} 
 
 
 
// 
//  函数: MyRegisterClass() 
// 
//  目的: 注册窗口类。 
// 
//  注释:  
// 
//    仅当希望在已添加到 Windows 95 的 
//    “RegisterClassEx”函数之前此代码与 Win32 系统兼容时, 
//    才需要此函数及其用法。调用此函数 
//    十分重要,这样应用程序就可以获得关联的 
//   “格式正确的”小图标。 
// 
ATOM MyRegisterClass(HINSTANCE hInstance) 
{ 
	WNDCLASSEX wcex; 
 
	wcex.cbSize = sizeof(WNDCLASSEX);  
 
	wcex.style			= CS_HREDRAW | CS_VREDRAW; 
	wcex.lpfnWndProc	= (WNDPROC)WndProc; 
	wcex.cbClsExtra		= 0; 
	wcex.cbWndExtra		= 0; 
	wcex.hInstance		= hInstance; 
	wcex.hIcon			= LoadIcon(hInstance, (LPCTSTR)IDI_MYGAME); 
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW); 
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1); 
	wcex.lpszMenuName	= NULL;//(LPCTSTR)IDC_MYGAME; 
	wcex.lpszClassName	= szWindowClass; 
	wcex.hIconSm		= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); 
 
	return RegisterClassEx(&wcex); 
} 
 
// 
//   函数: InitInstance(HANDLE, int) 
// 
//   目的: 保存实例句柄并创建主窗口 
// 
//   注释:  
// 
//        在此函数中,我们在全局变量中保存实例句柄并 
//        创建和显示主程序窗口。 
// 
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) 
{ 
	HWND hWnd; 
 
	hInst = hInstance; // 将实例句柄存储在全局变量中 
 
	hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP,//WS_OVERLAPPEDWINDOW, 
		CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 
 
	if (!hWnd) 
	{ 
		return FALSE; 
	} 
 
	ShowWindow(hWnd, nCmdShow); 
	UpdateWindow(hWnd); 
 
	g_pDisplay = CreatePlane2D( hWnd, 800, 600, true ); 
 
	g_pBitmapJPG = GetGraphics()->CreateBitmapFromJPG( "background.jpg" ); 
	g_pBitmapTGA = GetGraphics()->CreateBitmapFromTGA( "tree.tga" ); 
	g_pBitmapBMP = GetGraphics()->CreateBitmapFromBMP( "character.bmp" ); 
 
	g_pBitmapBMP->SetColorKey( RGB2Hi(255,0,255) ); 
 
	// 初始化GDI字体 
	g_hFont = CreateFont(12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, GB2312_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, "宋体"); 
 
	// 初始化HOHO字体 
	g_pHoHoFont = msCreateFont( "Font12.dat" ); 
 
	return TRUE; 
} 
 
// 
//  函数: WndProc(HWND, unsigned, WORD, LONG) 
// 
//  目的: 处理主窗口的消息。 
// 
//  WM_COMMAND	- 处理应用程序菜单 
//  WM_PAINT	- 绘制主窗口 
//  WM_DESTROY	- 发送退出消息并返回 
// 
// 
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	int wmId, wmEvent; 
	PAINTSTRUCT ps; 
	HDC hdc; 
 
	switch (message)  
	{ 
	case WM_MOVE:		// 窗口移动时的位置更新 
		{ 
			if( GetGraphics() != NULL) 
				GetGraphics()->UpdateBounds(); 
		} 
		break; 
	case WM_ACTIVATE:	// 窗口的活動狀態 
		{ 
			switch((LOWORD(wParam))) 
			{ 
			case WA_ACTIVE: 
			case WA_CLICKACTIVE: 
				g_bActive = true; 
				break; 
			case WA_INACTIVE: 
				g_bActive = false; 
				break; 
			default: 
				break; 
			} 
 
			if( GetGraphics() != NULL ) 
				GetGraphics()->Restore(); 
		} 
		break; 
	case WM_COMMAND: 
		wmId    = LOWORD(wParam);  
		wmEvent = HIWORD(wParam);  
		// 分析菜单选择: 
		switch (wmId) 
		{ 
		case IDM_ABOUT: 
			DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); 
			break; 
		case IDM_EXIT: 
			DestroyWindow(hWnd); 
			break; 
		default: 
			return DefWindowProc(hWnd, message, wParam, lParam); 
		} 
		break; 
	case WM_PAINT: 
		hdc = BeginPaint(hWnd, &ps); 
		// TODO: 在此添加任意绘图代码... 
		EndPaint(hWnd, &ps); 
		break; 
	case WM_DESTROY: 
		PostQuitMessage(0); 
		break; 
	default: 
		return DefWindowProc(hWnd, message, wParam, lParam); 
	} 
	return 0; 
} 
 
// “关于”框的消息处理程序。 
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
	switch (message) 
	{ 
	case WM_INITDIALOG: 
		return TRUE; 
 
	case WM_COMMAND: 
		if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)  
		{ 
			EndDialog(hDlg, LOWORD(wParam)); 
			return TRUE; 
		} 
		break; 
	} 
	return FALSE; 
}