超级玛丽游戏代码解读(VC,c++)

widows编程入门程序
整个游戏程序,其实是windows窗口的创建和消息处理的过程,主要知识点就是“windows编程”。

原作程序博客主及代码连接
如何读懂源代码,百度经验
如何看懂源代码,博客

windows窗口程序的入口和创建函数是WinMain,大概的过程框架是:
创建和设计窗口类(WNDCLASSEX结构体,包含窗口过程函数(WndPro)的入口的指定)->
注册窗口(RegisterClass()函数)->创建窗口(CreateWindow()函数)->显示窗口(ShowWindow()函数)
->更新窗口(UpdateWindow()函数)。

程序框架和程序资源结构梳理:

主体源文件是”mario01.cpp”,整个程序功能的实现都由该源文件调用相应函数完成。

包含的函数有:

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)                                        //入口函数
ATOM                MyRegisterClass(HINSTANCE hInstance);           //窗口类属性设置和注册
BOOL                InitInstance(HINSTANCE, int);                   //创建并显示主程序窗口
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);            //对程序消息的响应(绘图消
             息、窗口菜单消息、按键消息、游戏状态消息)
LRESULT CALLBACK    About(HWND, UINT, WPARAM, LPARAM);              //“关于”菜单消息响应

程序中函数的声明和所使用自定义类、结构的生成都放在”mario01.cpp”首部,从其对相应类生成的对象和结构的定义并结合资源视图、解决方案资源管理器、类视图来缕清整个程序的框架:(如下)
超级玛丽游戏代码解读(VC,c++)_第1张图片超级玛丽游戏代码解读(VC,c++)_第2张图片超级玛丽游戏代码解读(VC,c++)_第3张图片

#include "stdafx.h"
#include "resource.h"

#include "bitmaptool.h"
#include "texttool.h"
#include "gamemap.h"
#include "myclock.h"

#define MAX_LOADSTRING 100

char *pPreText[]={
    "制作: programking 2008年8月",
    "操作:   Z:子弹   X:跳   方向键移动  W:默认窗口大小",
    "x",
    "地图文件错误,请修正错误后重新启动程序。",
    "(上下键选择菜单,回车键确认)",
    "开始游戏",
    "操作说明",
    "博客: http://blog.csdn.net/programking",
    "(回车键返回主菜单)"
};

int mapani[2][10]={
{32,32,64,32,32,52,64,32,64,32},
{32,32,64,32,32,25,64,32,64,32},
};

int mapsolid[2][13]={
{32,32,32,32,32,32,32,32,32,64,64,20,100},
{32,32,32,32,32,32,32,32,32,64,64,10,12}
};

int mapanibk[2][4]={
{96,96,96,96},
{64,64,64,64},
};

int mapanimagic[2][1]={
{192},
{128}
};

//所有地图信息
struct MAPINFO allmapinfo[]={
{1,3,66,7,0,5},
{2,4,25,4,1,5},
{MAX_MATCH,-1,-1,-1,2,5},
{-1,0,3,8,3,1},
{-1,1,3,8,3,2}
};

//普通蘑菇兵
struct ROLE gl_enemy_normal=
{
    0,
    0,
    32,
    32,
    ID_ANI_ENEMY_NORMAL,
    0,
    2,
    0,
    0,
    -ENEMY_STEP_X,//speed
    1,
    1
};

//跟踪打印
//FILEREPORT f1;

MYCLOCK c1;

GAMEMAP gamemap;

MYBITMAP bmPre;
MYBKSKY bmSky;

MYANIOBJ bmMap;
MYANIOBJ bmMapBkObj;
MYANIOBJ bmAniObj;
MYROLE rmain;

MYANIMAGIC bmMagic;

MYFONT myfont;

HDC hwindow,hscreen,hmem,hmem2;
HBITMAP hmapnull;

int wwin,hwin;
int wwingame,hwingame;

HWND hWndMain;

// Global Variables:
HINSTANCE hInst;                                // current instance
TCHAR szTitle[MAX_LOADSTRING];                              // The title bar text
TCHAR szWindowClass[MAX_LOADSTRING];                                // The title bar text

首先包含的头文件有:”stdafx.h”,”resource.h”
“bitmaptool.h”,”texttool.h”,”gamemap.h”,”myclock.h”,结合管理器发现”filereport.h”,”tool01.h”不在内;
再搜索一下:”filereport.h”只在bitmaptool.h中;”tool01.h”只在gamemap.cpp中;

通过头文件的命名并查看代码:
1)struct ROLE gl_enemy_normal,GAMEMAP gamemap在”gamemap.h”中,是对游戏角色和游戏各关卡画面的加载、处理、控制,该头文件的GAMEMAP类还包含有 “bitmaptool.h”中的其他成员,是程序的主处理类;
2)MYCLOCK c1在”myclock.h”中,是程序的时间处理类;
3)MYBITMAP bmPre;MYBKSKY bmSky;MYANIOBJ bmMap,bmMapBkObj,bmAniObj;MYROLE rmain;MYANIMAGIC bmMagic;在”bitmaptool.h”中,分别是对游戏登录画面对象、 游戏天空背景对象、游戏陆地背景对象、游戏图形背景对象、游戏敌人图形对象、主角人物图形对象、攻击方式图形对象的加载和初始化;
4)MYFONT myfont;在”texttool.h”中,是对游戏字符类的处理;
5)”filereport.h”是对预设关卡文件的处理,嵌套在”bitmaptool.h”中,由”gamemap.h”相关函数调用处理;
6)”tool01.h”是对图形和关卡文件的辅助处理,和对按键的宏的定义,没有对应的.cpp文件;”stdafx.h”是编译器自动加载都文件,该程序中有对各种自定义宏的定义;

程序具体逻辑的实现和对应的API函数:

有了框架后先利用单步调试查看程序运行过程
超级玛丽游戏代码解读(VC,c++)_第4张图片
并借助编译器的查阅功能和MSDN缕清逻辑关系。(用官网比第三方网站查阅API函数要好,养成习惯)
msdn网站

你可能感兴趣的:(学习笔记)