版本:VS2015 语言:C++
书的第八章是一些数学的知识,以及一个图形库的创建。数学知识是有必要看一看的,我这里就不做多的介绍了,图形库的话反正你现在的win7+系统上也运行不了,看看就好。因为虽然这本书(《Windows游戏编程大师技巧》)非常的经典,但是代码都是比较老的,很多都已经过时了不能运行,所以我们要明确我们的目的,学好基础知识,编写一下程序练练手,熟悉熟悉Direct的流程以及原理,至于正真的想要运用的话,凭着这些知识学习最新的dx,或者直接上引擎,研究引擎中的代码。
好了,说了这么多,其实这本书就是为了入门。
今天讲的是第九章的内容,主要实现使用键盘和鼠标控制。
首先是基础的代码:
#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0) //判断当前的按键是否被按下
#define DDRAW_INIT_STRUCT(ddsd) { memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); }
#define _RGB32BIT(a, r, g, b) ((b) + (g << 8) + (r << 16) + (a << 24))
HWND main_window_handle = NULL; //当前窗口
LPDIRECTDRAW7 lpdd = NULL; //Direct7对象,下称d7
LPDIRECTDRAWSURFACE7 lpddsprimary = NULL; //主显示表面指针
LPDIRECTDRAWSURFACE7 lpddsback = NULL; //后备显示表面
DDSURFACEDESC2 ddsd; //主显示表面的描述
int SCREEN_WIDTH = 640; //显示宽度
int SCREEN_HEIGHT = 480; //显示高度
int SCREEN_BPP = 32; //色深,现在的机子只能设置为32位,书上可能还是8位的
int CharPosX = 200; //当前显示人物的x坐标
int CharPosY = 200; //当前任务显示的y坐标
// 弹出消息
void popMessage(LPWSTR str)
{
MessageBox(main_window_handle, str, TEXT("提示"), MB_OK);
}
// 32位像素上色
void Plot_Pixel_Fast32_2(int x, int y, int red, int green, int blue, int alpha, UINT* video_buffer, int lpitch)
{
video_buffer[x + y * (lpitch >> 2)] = (UINT)(_RGB32BIT(alpha, red, green, blue)); //使用宏直接写,有点区别的是lpitch需要除以4,因为lpitch算的是横向的字节数,而我们把主界面的内存弄成UINT型,是32位、4个字节的,上一节中是我理解的不够深刻
}
// 游戏初始化
int Game_Init(void* params = NULL)
{
// 基础设置
if (FAILED(DirectDrawCreateEx(NULL, (void**)&lpdd, IID_IDirectDraw7, NULL))) //获取d7对象
return 0;
if (FAILED(lpdd->SetCooperativeLevel(main_window_handle,
DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT
))) //跟windows协