C++&SDL的双人塔防游戏

1. 项目简介

使用C++和SDL等技术,实现的一款本地双人合作塔防游戏。

项目源代码参考Github.

视频教程参考:C++双人塔防游戏开发 | Voidmatrix

1.1 开发语言及工具

1.1.1 C++

C++是一种功能强大的编程语言,用于实现游戏的逻辑架构、数据处理等核心功能。

1.1.2 SDL

SDL(Simple DirectMedia Layer)是一个跨平台的多媒体库。在开发游戏时,SDL用于处理图形渲染、音频播放、输入设备交互等多媒体相关内容。

1.2 核心技术与游戏功能

  1. SDL全家桶技术栈
  2. 硬件加速支持的2D渲染实现
  3. 游戏场景的搭建与跳转
  4. 瓦片地图设计和编辑
  5. 可编程关卡序列
  6. 可配置的玩家和敌人数据
  7. CSV/JSON数据格式解析
  8. 高性能寻路算法
  9. 防御塔优先索敌策略
  10. 防御塔升级和属性变更
  11. 波次控制游戏导演系统
  12. 精灵表纹理图集读取和渲染
  13. 俯视角RPG角色移动和技能释放

2. 开发环境搭建

2.1 SDL和相关程序库介绍

SDL

SDL作为“SimpleDirectMedia Layer”的简称,是一款开源且跨平台的多媒体库,在游戏开发、多媒体应用等诸多领域有着广泛应用,从图1可看出,SDL是一个有跨平台多支持特性的渲染框架,实现了于硬件驱动层之上的抽离操作,给予了对音频、键盘、鼠标、操纵杆以及图形硬件的底层访问权限,使得开发者凭借相同或者相似的代码便可开发出跨越多个平台的应用软件。

图1 SDL框架结构图

在游戏开发应用里,SDL给游戏开发者供给了一个颇为完善的媒体库,囊括Video、Audio、CD-ROM以及Timer等好些子系统,另外以及一些单独的官方扩充函数库,像SDL_image、SDL_mixer、SDL_net、SDL_ttf、SDL_rtf等。这些库由官方网站给予提供,且包含在官方文档中,一同构成了SDL的“标准库”,可开发者更轻松地开展软件开发。

库名称 核心功能简介 支持格式/特性
SDL2 跨平台多媒体开发库,提供对音频、键盘、鼠标、游戏手柄和图形硬件的底层访问。适用于游戏、模拟器、媒体播放器等开发。 支持视频渲染(OpenGL/Direct3D)、事件处理、线程管理、定时器、文件I/O抽象等。
SDL_image 图像处理扩展库,增强SDL2的图像加载能力,支持多种非BMP格式的图像文件。 支持PNG、JPEG、GIF、TGA、WEBP等格式;提供图像解码接口,需依赖libpng等库。
SDL_mixer 音频处理扩展库,支持多声道音频混合和多种音频格式播放,适用于游戏音效和背景音乐。 支持WAV、MP3、OGG、FLAC、MIDI等格式;提供音量控制、淡入淡出、3D音效定位等功能。
SDL_net 网络通信扩展库,简化TCP/UDP协议的网络编程,支持多平台网络连接。 提供套接字API、IP地址管理;适用于多人游戏实时数据交换,支持非阻塞通信和异步事件处理。
SDL_ttf TrueType字体渲染库,用于在SDL应用中显示高质量矢量文本。 支持Unicode和多语言文本;提供字体大小、样式(粗体/斜体)、颜色定制;渲染方式包括实心、阴影和混合模式。
SDL_rtf 富文本渲染库,支持简单的RTF(Rich Text Format)格式解析与显示。 基础RTF标签支持(如字体、颜色);适用于轻量级富文本展示,功能较SDL_ttf更简化。

其中,SDL自带的渲染器SDL Renderer是SDL的核心组件之一,它拥有出色的跨平台兼容性,同时支持硬件加速渲染,在处理多路视频或者复杂图形渲染任务时更具优势。而且SDL Renderer还给出了丰富的渲染设置选项,准许开发者依据实际需求灵活调节渲染管线。

本项目已经将使用到的所有三方库文件保存在了项目文件的thirdparty文件夹中。

Visual Studio 2022

1.进入Visual Studio官网下载Visual Studio 2022(Community社区版)

2.在安装时勾选“使用C++的桌面开发”

2.2 项目创建

1.打开VS,选择创建新项目,然后选择创建空项目,自己命名后选择保存位置,然后选择创建。

2.选择源文件—>添加—>新建项。命名为main.cpp

2.在上方修改解决方案配置,将Debug改为Release

3.在Tdgame右键打开项目属性,在代码生成中将运行库改为多线程(/MT),然后点击应用。

3.在main.cpp中输入下方代码,点击上方**“本地Windows调试器”**运行测试输出“Hello World”。

1
2
3
4
5
6
#include <iostream>

int main(){
std::cout << "Hello World" << std::endl;
return 0;
}

2.3 库文件导入

1.文件导入

右击项目,打开文件所在位置,然后返回文件夹上一级,新建文件夹thirdparty,然后将提供的SDL三方库文件复制到该文件夹。

2.三方库文件介绍

以SDL2文件为例,里面包含include和lib两个文件夹。

include里面存放的是.h结尾的头文件(主要是定义的声明)。

lib里面存放的是.dll动态链接库文件和.lib库文件。(三种文件的具体区别可自行百度)

3.库文件具体配置方式

首先,引入各三方库的头文件。

同样是打开项目属性页,在C/C++常规中选择附加包含目录,选择编辑输入各个三方库的include文件相对路径位置,然后选择应用。

添加完成后可输入下方代码查看头文件是否引入成功。

1
2
3
4
5
6
7
8
9
10
11
#define SDL_MAIN_HANDLED

#include <iostream>

#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
int main(){
std::cout << "Hello World" << std::endl;
return 0;
}

然后是引入各三方库的lib文件的位置

同样是打开项目属性页,在链接器常规中选择附加库目录,选择编辑输入各个三方库的lib文件相对路径位置,然后选择应用。

接着,是引入各三方库中具体的lib文件

同样是打开项目属性页,在链接器输入中选择附加依赖项,选择编辑输入各个三方库的lib文件名称,然后选择应用。

最后是将各个三方库的dll文件复制到项目Tdgame目录中,这样所有的三方库的导入就配置完成了。

3. SDL全家桶实践(demo)

3.1 初始化和窗口创建

3.2 主循环和测试逻辑编写

3.3 动态延时帧率控制

3.4 JSON和CSV格式解析实践

3.4.1 JSON和CSV数据结构简介

3.4.2 JSON解析示例

3.4.3 CSV解析示例

4. 游戏框架搭建

4.1 可继承单例模板类实现

4.2 GameManager游戏主体管理器实现

4.3 角色属性、关卡波次和地图数据设计

4.4 瓦片地图数据功能实现

5. 游戏主体内容开发

5.1 洋流图与预烘焙寻路实现

5.2 ConfigManager游戏配置管理器设计

5.3 关卡波次配置文件解析

5.4 角色属性配置文件解析

5.5 ResourcesManager游戏资源管理器设计