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”首部,从其对相应类生成的对象和结构的定义并结合资源视图、解决方案资源管理器、类视图来缕清整个程序的框架:(如下)
#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",
"地图文件错误,请修正错误后重新启动程序。",
"(上下键选择菜单,回车键确认)",
"开始游戏",
"操作说明",
"博客: ",
"(回车键返回主菜单)"
};
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函数:
有了框架后先利用单步调试查看程序运行过程
并借助编译器的查阅功能和MSDN缕清逻辑关系。(用官网比第三方网站查阅API函数要好,养成习惯)