Q&A

为什么选择C++进行开发?


 因为C++是我个人最熟悉的编程语言,在此之前我对面向对象的开发项目经验几乎为0,所以我认为我需要使用我较为熟悉的语言 进行开发学习,累积经验,而不至于在简单的语法问题上浪费时间。其次C++上对于小型项目开发相对简单容易上手,这也是选择C++ 的重要原因之一。

笔记


一些相对陌生的类型


DWORD类型


 就是32bit的unsigned long无符号长整型,DWORD是双字类型 ,4个字节,API函数中有很多参数和返回值是DWORD的。 其实DWORD类型可以直接被int类型所替代,在开发的最开始我的VS2022似乎不支持DWORD类型的使用,一直报错,查了很久的资料才发现可以直接 使用int或者long long替代.
TCHAR类型

 就是当你的字符设置为什么就是什么 例如:程序编译为 ANSI, TCHAR 就是相当于 CHAR ,当程序编译为 UNICODE, TCHAR 就相当于 WCHAR 其实就是一种相对万能的写法,关于字符类型.

EasyX 中的操作元素


initgraph 绘制窗口


 使用方法例如 创建绘图窗口,大小为 640x480 像素,initgraph(640, 480),即可。

IMAGE 保存图像的对象


 使用方法直接IMAGE后+名称即可

Animation::DrawImage 在窗口上绘制图像


 使用方法:例如在开发这个小游戏中这行代码 Animation::DrawImage(shadowPosX, shadowPosY, &mImgShadow); 的目的是在指定的位置绘制一 个影子图像。影子通常用于为图像或对象增加深度感,使其看起来更立体。shadowPosX 和 shadowPosY 是绘制图像的坐标,表示影子图像在屏幕上的位置。 &mImgShadow 是影子图像的引用。

loadimage 加载图片


 使用方法:例如loadimage(&mImgShadow, _T("img/shadow_player.png")); 这段代码中&mImgShadow 表示将 mImgShadow 变量的地址传递给 loadimage 函数,这样函数可以直接修改 mImgShadow 的内容。_T("img/shadow_player.png") 是一个字符串,表示要加载的图像文件的路径。 _T 宏通常用于支持多种字符集(如 ANSI 和 Unicode),确保代码在不同的字符集下都能正常工作。

AlphaBlend在指定位置绘制带有透明度的图像(去除图片黑框)


 使用方法:这个函数相对比较复杂,这里仅介绍这个游戏中用到的例如AlphaBlend(GetImageHDC(NULL), x, y, w, h, GetImageHDC(img), 0, 0, w, h, { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA });其中GetImageHDC(NULL): 这个函数调用获取一个设备上下文(HDC),用于绘制图像。NULL 表示绘制到屏幕的设备上下文。x, y:这两个参数指定了图像在目标设备上下 文中的绘制位置(左上角的坐标)。w, h:这两个参数表示要绘制的图像的宽度和高度,分别由 img->getwidth() 和 img->getheight() 获取。 GetImageHDC(img):这个函数调用获取与 img 相关联的设备上下w, h:这两个参数再次表示要从源图像中读取的宽度和高度,通常与目标图像的 宽度和高度相同。文(HDC),用于从该图像中读取像素数据。0, 0:这两个参数指定了从源图像(即 img)中开始读取像素的起始位置(左上角的坐标)。 { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }:这是一个结构体,包含了透明度和混合模式的信息:AC_SRC_OVER:表示使用源图像的像素覆盖目标图像的像素。 0:表示没有偏移量。255:表示完全不透明 的像素(范围从 0 到 255,0 为完全透明,255 为完全不透明)。AC_SRC_ALPHA:表示源图像使用 alpha 通道来 定义透明度。

面向对象编程(C++)


 只要是开发一定规模的项目,无论大小几乎都得用到面向对象的思想,不然代码就成史山了,难以管理和修改bug,在这里我就不赘述面向对象的概念了 很多人都写了关于C++面向对象的博客借鉴即可 ,这个游戏开发中主要用到的概念是封装。

面向对象博客链接

享元模式


 享元模式是一种结构型的设计模式。它的主要目的是通过共享对象来减少系统种对象的数量,其本质就是缓存共享对象,降低内存消耗。 享元模式将需要重复使用的对象分为两个部分:内部状态和外部状态。 内部状态是不会变化的,可以被多个对象共享,而外部状态会随着对象的使用而改变。比如,连接池中的连接对象,保存在连接对象中的用户名、密码、连接URL等信息,在创建对象的时候就设置好了,不会随环境的改变而改变,这些为内部状态。而当每个连接要被回收利用时,我们需要将它标记为可用状态,这些为外部状态。 说人话就是一种优化,需要加载的资源单独列为一个类或者结构体,需要时再在不同的位置和时间反复调用本体的资源即可,这样可以节约大量的硬盘资源。

代码以及库

主要内容基本都在代码中,基本都写了注释,结合注释相对比较好理解。
[github网址]