当前位置:编程学习 > C/C++ >>

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++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,