Win32 SDK 打砖块游戏
前一阵子学习Win32 SDK 时自己写过一个拼图游戏作为练习,基本功能是都完成了,但到后来随着代码量的增多,代码的组织上有点混乱。考虑到是第一次独立用Win32 SDK编写程序,就先放过了。但总觉的不爽。
最近看到一本名为《Windows 游戏编程易做图技巧》的牛书,看到第一章打砖块的示例,欲效仿其组织代码的技巧,故将其源代码分拆成容易理解的若干部分,修改抄录于下,供他日重读或供无缘见到此书者查阅。
程序版权归原作者所有,吾仅是学习模仿,不敢掠美。
但源程序使用到了DirectX SDK,由于暂时不想涉及D3D,故改为用Win32 API 绘图。当然以后有空,或会学习一下DirectX SDK~
我们需要的是下面几个功能:
1)切换至任意图像模式
2)在屏幕上绘制各种颜色的矩形
3)获取键盘输入
4)使用一些定时函数同步游戏循环
5)在屏幕上画彩色字符串
1. 程序主框架(原程序为全屏隐藏鼠标,为调试简单,暂时改为非全屏不隐藏鼠标)
[cpp]
/*
* FreakOut.cpp (改编自《Windows 游戏编程易做图技巧》第一章示例程序)
* 2012-11-29
*/
/* INCLUDES *****************************************************************************/
#include <windows.h>
/* DEFINES ******************************************************************************/
// defines for windows
#define WINDOW_CLASS_NAME TEXT("WIN32CLASS")
#define WINDOW_WIDTH 640
#define WINDOW_HEIGHT 480
// states for game loop
#define GAME_STATE_INIT 0
#define GAME_STATE_START_LEVEL 1
#define GAME_STATE_RUN 2
#define GAME_STATE_SHUTDOWN 3
#define GAME_STATE_EXIT 4
/* GLOBALS *******************************************************************************/
HWND main_window_handle = NULL; // save the window handle
HINSTANCE main_instance = NULL; // save the instance
int game_state = GAME_STATE_INIT; // starting state
/* WINDPROC ******************************************************************************/
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
// this is the main message handler of the system
PAINTSTRUCT ps;
HDC hdc;
switch (msg)
{
case WM_CREATE:
{
return 0;
}
case WM_PAINT:
{
hdc = BeginPaint(hwnd, &ps);
EndPaint(hwnd, &ps);
return 0;
}
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
default:
break;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}
/* WINMAIN *******************************************************************************/
int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
WNDCLASS winclass;
HWND hwnd;
MSG msg;
HDC hdc;
PAINTSTRUCT ps;
/* CS_DBLCLKS Specifies that the window should be notified of double clicks with
* WM_xBUTTONDBLCLK messages
* CS_OWNDC标志,属于此窗口类的窗口实例都有自己的DC(称为私有DC),私有DC仅属于该窗口实例,
* 所以程序只需要调用一次GetDC或BeginPaint获取DC,系统就为窗口初始化一个DC,并且保存程序
* 对其进行的改变。ReleaseDC和EndPaint函数不再需要了,因为其他程序无法访问和改变私有DC。
*/
winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
// register the window class
if (!RegisterClass(&winclass))
return 0;
// Create the window, note
补充:软件开发 , C++ ,