蓝桥云课一分钟-绚丽贪吃蛇-后续-cmake

配置到完成启动界面(十秒)

命令

bash 复制代码
git clone https://gitcode.com/ZhangRelay1/DungeonRushDemo.git && sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev -y && cd DungeonRushDemo && mkdir build && cd build && cmake .. && make && cd bin && ./dungeon_rush







这篇文章详细讲解了DungeonRushDemo游戏项目的CMake配置和开发要点。主要内容包括:

  1. CMake配置文件逐行解析,涵盖版本要求、项目设置、SDL2库查找、编译输出路径设置等关键指令

  2. 项目技术栈说明:Linux C语言+CMake+SDL2开发2D游戏

  3. 核心开发知识点:

  • C语言基础(结构体、指针、多文件编程)
  • CMake构建系统原理和工作流程
  • SDL2多媒体库功能(窗口、渲染、输入、音效等)
  • 游戏开发核心逻辑(主循环、碰撞检测、状态机)
  1. 完整项目构建和运行命令说明

文章通过实际项目案例,系统性地介绍了Linux环境下使用C语言和SDL2开发游戏的全流程,特别适合想要学习游戏开发和CMake构建系统的开发者参考。

cpp 复制代码
cmake_minimum_required(VERSION 3.5.1)
project(DungeonRush)

# Add SDL2 CMake modules
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)

# Set output path
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# Find SDL2
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_net REQUIRED)
find_package(SDL2_mixer REQUIRED)
find_package(SDL2_ttf REQUIRED)

set(BIN_NAME dungeon_rush)

file(GLOB SRC src/*.c)

add_executable(${BIN_NAME} ${SRC})

target_include_directories(${BIN_NAME} PUBLIC src)
target_include_directories(${BIN_NAME} PUBLIC ${SDL2_INCLUDE_DIR})
target_link_libraries(${BIN_NAME} SDL2::Main SDL2::Net SDL2::Image SDL2::Mixer 
                      SDL2::TTF m)

file(COPY res DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

2022:

蓝桥ROS机器人之绚丽贪吃蛇




逐行精讲:DungeonRushDemo 的 CMakeLists.txt

这是Linux C 项目 + SDL2 游戏 最标准、最实用的 CMake 配置,我给你逐行翻译 + 原理 + 作用,彻底讲懂!

你给的代码:

cmake

复制代码
cmake_minimum_required(VERSION 3.5.1)
project(DungeonRush)

# Add SDL2 CMake modules
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)

# Set output path
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

# Find SDL2
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_net REQUIRED)
find_package(SDL2_mixer REQUIRED)
find_package(SDL2_ttf REQUIRED)

set(BIN_NAME dungeon_rush)

file(GLOB SRC src/*.c)

add_executable(${BIN_NAME} ${SRC})

target_include_directories(${BIN_NAME} PUBLIC src)
target_include_directories(${BIN_NAME} PUBLIC ${SDL2_INCLUDE_DIR})
target_link_libraries(${BIN_NAME} SDL2::Main SDL2::Net SDL2::Image SDL2::Mixer 
                      SDL2::TTF m)

file(COPY res DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

一、逐行详细解释

1. cmake_minimum_required(VERSION 3.5.1)

作用 :指定最低 CMake 版本 含义:如果你的系统 CMake 版本低于 3.5.1,直接报错,防止语法不兼容。


2. project(DungeonRush)

作用 :定义项目名称

  • 项目名:DungeonRush
  • 不影响可执行文件名,只是标识项目

3. list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdl2)

超级关键!专门给 SDL2 用的

  • CMAKE_MODULE_PATH:CMake 查找库配置文件的路径
  • 这里把项目里的 cmake/sdl2 目录加入搜索路径
  • 目的:让 CMake 能正确找到 SDL2、SDL_image 等库的配置文件

很多项目编译失败,就是少了这一行!


4. set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

作用:设置编译后的可执行文件输出目录

  • ${CMAKE_BINARY_DIR} = 你执行 cmake .. 的目录(即 build 目录)
  • 最终输出路径 = build/bin/
  • 所以编译完会在 build/bin/dungeon_rush

好处

  • 不污染源码目录
  • 所有编译产物集中在 build,方便清理

5. find_package(XXX REQUIRED)

cmake

复制代码
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)
find_package(SDL2_net REQUIRED)
find_package(SDL2_mixer REQUIRED)
find_package(SDL2_ttf REQUIRED)

作用:让 CMake 自动查找系统安装的库

  • REQUIRED:必须找到,找不到就直接报错

  • 对应你安装的依赖: plaintext

    复制代码
    libsdl2-dev
    libsdl2-image-dev
    libsdl2-net-dev
    libsdl2-mixer-dev
    libsdl2-ttf-dev

找不到就会报:

plaintext

复制代码
SDL2 not found

6. set(BIN_NAME dungeon_rush)

定义变量 :把可执行文件名统一写成 dungeon_rush后面可以用 ${BIN_NAME} 代替,方便修改。


7. file(GLOB SRC src/*.c)

作用:自动匹配 src 目录下所有 .c 文件

  • src/*.c = 匹配 src/ 下所有 .c 源文件
  • 全部存入变量 ${SRC}

不用手动一个个写:

plaintext

复制代码
add_executable(main.c a.c b.c c.c d.c)

大型项目必备!


8. add_executable({BIN_NAME} {SRC})

真正生成可执行文件!

  • ${SRC} 里所有源文件
  • 编译出可执行文件:dungeon_rush

9. target_include_directories

cmake

复制代码
target_include_directories(${BIN_NAME} PUBLIC src)
target_include_directories(${BIN_NAME} PUBLIC ${SDL2_INCLUDE_DIR})

作用:告诉编译器【头文件在哪里】

  • src/:项目自己的头文件
  • ${SDL2_INCLUDE_DIR}:SDL2 的头文件路径

不加这两行,会报:

plaintext

复制代码
找不到 SDL.h
找不到 game.h

cmake

复制代码
target_link_libraries(${BIN_NAME}
    SDL2::Main
    SDL2::Net
    SDL2::Image
    SDL2::Mixer
    SDL2::TTF
    m
)

最核心:链接所有依赖库!

  • SDL2::Main → 链接 libsdl2
  • SDL2::Image → 链接 libsdl2-image
  • SDL2::Net → 链接 libsdl2-net
  • SDL2::Mixer → 链接 libsdl2-mixer
  • SDL2::TTF → 链接 libsdl2-ttf
  • m → 系统数学库(math.h,三角函数、平方根)

不加这一行,会报大量 "未定义引用" 错误!


11. file(COPY res DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

作用:把资源文件夹 res/ 复制到 build/bin/

  • res/ 存放图片、音效、字体、地图
  • 游戏运行必须依赖这些文件
  • 自动复制,不用手动拷贝

二、这个 CMakeLists.txt 到底干了什么?(总结)

用最简单的话讲:

  1. 指定 CMake 版本
  2. 添加 SDL2 查找路径
  3. 设置编译输出到 build/bin
  4. 自动查找 SDL2 相关所有库
  5. 自动包含 src 下所有 .c 源码
  6. 告诉编译器头文件路径
  7. 链接所有 SDL2 库 + 数学库
  8. 自动复制游戏资源(图片 / 音效)

最终生成:

plaintext

复制代码
build/bin/dungeon_rush
build/bin/res/

三、你运行的编译命令与 CMake 的对应关系

bash

运行

复制代码
mkdir build && cd build
cmake ..
make

对应 CMake 工作流程:

  1. cmake .. → 读取 CMakeLists.txt,生成 Makefile
  2. make → 根据 Makefile 编译所有 .c 文件
  3. 输出到 build/bin/

四、这个 CMake 配置为什么专业?(重点)

  1. ** out-of-source 编译 **(编译产物与源码分离)
  2. 自动搜索源文件
  3. 自动查找库
  4. 自动复制资源
  5. 多平台通用(Linux、Windows、Mac)
  6. SDL2 游戏项目标准模板

五、一句话记住 CMake 的核心功能

CMake = 自动构建编译流程的工具,帮你自动找库、自动编译、自动链接、自动输出。

你不用手写 Makefile,CMake 帮你写!


超详细:DungeonRushDemo 核心知识点(Linux C + CMake + SDL2)

我用最通俗、最实战 的方式,把这个游戏项目用到的Linux C 编程、CMake 构建、SDL2 游戏开发全部讲清楚,你直接对照项目源码就能看懂。


一、项目整体技术栈

这个项目是 纯 C 语言 + Linux 环境 + CMake 构建 + SDL2 游戏库 开发的贪吃蛇类游戏。

核心技术:

  1. Linux C 语言编程(基础语法、指针、内存管理、文件操作)
  2. CMake 构建系统(自动生成 Makefile、跨平台编译)
  3. SDL2 多媒体库(窗口、图像、声音、网络、输入、渲染)
  4. 多文件项目结构(模块化、分层设计)
  5. 游戏逻辑基础(循环、碰撞检测、状态管理)

二、Linux C 语言核心知识点(项目 80% 用到)

1. 标准 C 基础语法

  • 变量、数组、结构体、枚举
  • 循环 for/while、判断 if/switch
  • 函数、函数指针
  • 宏定义 #define

项目里大量使用:

c

运行

复制代码
#define WINDOW_WIDTH 800
typedef struct { int x, y; } Point;

2. 结构体(游戏核心)

游戏里英雄、怪物、武器、buff、地图全部用结构体描述,这是 C 语言做游戏的灵魂。

示例(项目真实逻辑):

c

运行

复制代码
// 英雄实体
typedef struct {
    int x, y;         // 坐标
    int type;         // 类型(战士/法师/射手)
    int hp;           // 血量
    Weapon weapon;    // 装备的武器
} Hero;

3. 指针与动态内存

  • 动态数组存储英雄队列(像贪吃蛇身体)
  • 动态创建 / 销毁怪物
  • 避免内存泄漏

c

运行

复制代码
Hero* heros = malloc(sizeof(Hero) * 100);

4. 多文件编程(.c + .h)

项目结构一定是:

  • .h 头文件:声明函数、结构体、宏
  • .c 源文件:实现逻辑

例如:

plaintext

复制代码
main.c        // 入口
game.c        // 游戏逻辑
render.c      // 渲染
input.c       // 按键输入
entity.c      // 实体(英雄/怪物)

优点:代码清晰、易维护、适合大型项目。

5. 头文件保护

c

运行

复制代码
#ifndef GAME_H
#define GAME_H
// 内容
#endif

防止重复包含,编译报错。

6. 错误处理

  • 指针判空
  • SDL 函数调用失败检查
  • 文件读取判断

7. Linux 系统调用(简单用到)

  • 文件读取(资源加载)
  • 时间函数(控制帧率)

三、CMake 知识点(项目编译核心)

你运行的:

plaintext

复制代码
cmake ..
make

就是 CMake 在工作。

1. CMake 是什么?

自动生成 Makefile 的工具,让你不用手写复杂的 Makefile。

2. 项目必须有:CMakeLists.txt

这是 CMake 的配置文件,DungeonRushDemo 里一定有。

3. 最核心的 CMake 指令

cmake

复制代码
# 最低版本
cmake_minimum_required(VERSION 3.10)

# 项目名
project(DungeonRush C)

# C 标准
set(CMAKE_C_STANDARD 99)

# 查找 SDL2 库
find_package(SDL2 REQUIRED)
find_package(SDL2_image REQUIRED)

# 头文件路径
include_directories(${SDL2_INCLUDE_DIRS})

# 编译成可执行文件
add_executable(dungeon_rush main.c game.c render.c ...)

# 链接库
target_link_libraries(dungeon_rush ${SDL2_LIBRARIES} SDL2_image SDL2_mixer ...)

4. 编译流程原理(超重要)

plaintext

复制代码
mkdir build && cd build    # 建立编译目录
cmake ..                   # 生成 Makefile
make                       # 编译
./bin/dungeon_rush         # 运行

**为什么要建 build 目录?**保持源码干净,不污染源代码文件夹。


四、SDL2 知识点(游戏运行的基础库)

DungeonRush 完全依赖 SDL2,这是 Linux 下最流行的 2D 游戏开发库

1. SDL2 能做什么?

  • 创建窗口
  • 渲染图像
  • 监听键盘 / 鼠标
  • 播放音乐 / 音效
  • 网络通信(多人联机)
  • 字体显示

2. 项目用到的 5 大 SDL2 子模块

  1. SDL2:核心(窗口、事件、渲染)
  2. SDL2_image:加载图片(PNG/JPG)
  3. SDL2_mixer:播放声音
  4. SDL2_net:局域网联机
  5. SDL2_ttf:显示文字

3. 游戏主循环(最核心)

所有游戏都长这样:

c

运行

复制代码
while (is_running) {
    事件处理(按键)
    更新游戏逻辑(移动、碰撞、AI)
    渲染画面
    控制帧率(60 FPS)
}

4. 常用 SDL2 函数

c

运行

复制代码
SDL_Init();                  // 初始化
SDL_CreateWindow();          // 创建窗口
SDL_CreateRenderer();        // 创建渲染器
SDL_PollEvent();             // 监听按键
SDL_RenderCopy();            // 绘制图片
SDL_Delay();                 // 延时

五、游戏本身的逻辑知识点

1. 贪吃蛇式队列

英雄跟随前面的单位移动,用数组 / 链表实现。

2. 碰撞检测

判断:

  • 英雄是否吃到道具
  • 是否碰到怪物
  • 是否碰到敌人

3. 状态机

游戏状态:

  • 开始界面
  • 游戏中
  • 胜利 / 失败
  • 暂停

4. 动画与渲染

  • 精灵图(Sprite Sheet)
  • 帧动画
  • 图层渲染(地图→角色→特效)

六、你运行的命令逐行解释(最实用)

bash

运行

复制代码
# 下载源码
git clone https://gitcode.com/ZhangRelay1/DungeonRushDemo.git

# 安装依赖(SDL2 全套)
sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev -y

# 进入项目
cd DungeonRushDemo

# 创建编译目录
mkdir build
cd build

# CMake 生成 Makefile
cmake ..

# 编译项目
make

# 运行游戏
cd bin
./dungeon_rush

七、总结(最核心 5 点)

  1. Linux C:结构体、指针、多文件、内存管理
  2. CMake:自动构建,生成 Makefile,管理编译
  3. SDL2:窗口、渲染、输入、声音、网络
  4. 项目结构:模块化、清晰易扩展
  5. 游戏原理:主循环 + 碰撞 + 状态管理

如果你愿意,我可以继续教你:

  1. 逐行读懂项目源码
  2. 修改游戏数值(速度、血量、关卡)
  3. 自己加功能(新武器、新怪物)
  4. 打包发布成 Linux 可执行文件
相关推荐
世人万千丶2 小时前
Flutter 框架跨平台鸿蒙开发 - AR寻宝探险游戏应用
学习·flutter·游戏·华为·开源·ar·harmonyos
承渊政道2 小时前
【优选算法】(实战攻坚BFS之FloodFill、最短路径问题、多源BFS以及解决拓扑排序)
数据结构·c++·笔记·学习·算法·leetcode·宽度优先
漠缠2 小时前
缠论核心公理:走势终完美
学习·程序人生
arvin_xiaoting2 小时前
OpenClaw学习总结_IV_认证与安全_3:Authorization与Policies详解
学习·安全
EnglishJun2 小时前
ARM嵌入式学习(二十)--- 杂项设备、Platfrom总线和设备树源文件(dts)
学习
知识分享小能手2 小时前
MongoDB入门学习教程,从入门到精通,MongoDB 安全完全指南(19)
学习·安全·mongodb
_李小白2 小时前
【OSG学习笔记】Day 39: NodeCallback(帧回调机制)
java·笔记·学习
浮芷.2 小时前
开源鸿蒙跨平台Flutter开发:校园问答互助社区应用
学习·flutter·华为·开源·harmonyos·鸿蒙
小陈phd2 小时前
CCPD数据集全解析:中文车牌识别的“双黄金标准“
笔记·学习·生成对抗网络