如何5分钟用C语言做出能跑的2D/3D游戏?raylib 上手实操清单
【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib
想用 C 写个游戏却不想被引擎配置拖死?raylib 是一个轻量级的 C 游戏开发库,纯 C99、零外部依赖,从 2D 精灵、3D 场景到音频播放,一个库全包了。这篇文章按"你想做什么"来拆,不堆功能清单。
为什么是 raylib:比重型引擎省了什么
拿它和 Unity、Godot 这类引擎对比,差异很具体:
- 没有编辑器依赖:所有游戏逻辑就是普通 C 代码,用你顺手的编译器/IDE 直接写,不用学编辑器工作流
- 零外部依赖:图像、字体、音频这些第三方库全部打包在 src/external/ 里,clone 下来就能编译
- 小项目最合适:官方自己的定位是"中小型 2D 游戏"和教学原型,一个库 + 几百行代码就能出一个完整可玩的 demo
- 源码即教材:API 命名直白(
LoadTexture、PlaySound),配合 raylib.h 头文件注释读源码就能学会大半用法
它不是"全家桶引擎"——没有场景管理器、没有实体组件系统,这些要自己写。但对学习游戏编程和做小而美的项目,这反而是优点:你能看清每一帧是怎么画出来的。
5分钟跑通第一个 raylib 窗口
🚀 最短路径就三步:
- 获取源码:
git clone https://gitcode.com/GitHub_Trending/ra/raylib - 编译库本体(Linux/macOS,Windows 可用 VS2022 工程或 CMake):
cd src && make,产物在src/lib/libraylib.a - 编译仓库自带的窗口示例并运行:
// 保存为 basic_window.c,核心逻辑就这么点 #include "raylib.h" int main(void) { InitWindow(800, 450, "raylib - basic window"); while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); DrawText("Congrats! First window!", 190, 200, 20, LIGHTGRAY); EndDrawing(); } CloseWindow(); return 0; }gcc basic_window.c -Isrc src/lib/libraylib.a -lm -lpthread -ldl -o basic_window && ./basic_window一个白底窗口弹出、中间一行字,游戏主循环的骨架(初始化 → 循环更新/绘制 → 关闭)就已经跑起来了。想直接读参考代码的话看 examples/core/core_basic_window.c。
场景一:用 C 画一个 2D 游戏画面
想要的效果:不贴图、不用精灵,纯几何图形画出画面——跳台游戏的平台、球体的轨迹、弹幕的子弹。
怎么做:raylib 的 shapes 模块把常用图元都做成了单函数调用——DrawRectangle、DrawCircle、DrawLine、DrawText,参数就是坐标、尺寸和颜色,连顶点数组都不用碰。位置随时间变化就每帧算一次坐标再重画,配合GetFrameTime()做帧率无关的运动。
完整例子看 examples/shapes/shapes_basic_shapes.c,同目录下还有缓动动画、碰撞检测、弹球物理等几十个变体:
场景二:精灵表做角色动画
想要的效果:角色在屏幕上跑起来、挥手、攻击——经典的 sprite animation。
怎么做:思路是"一张长图切成 N 格,每帧换一格的坐标"。先LoadTexture载入整张精灵表,再用一个Rectangle记录当前帧的裁剪区域,每帧累计GetFrameTime(),到时间就把frameRec.x推进一格,然后DrawTextureRec只画出裁剪出的那一格。整个动画系统核心就这一个矩形在移动,代码量比想象中少得多。
完整例子(含资源文件)在 examples/textures/textures_sprite_animation.c:
场景三:搭一个 3D 第一人称视角
想要的效果:FPS 式的镜头——鼠标转视角、WASD 移动,场景里放个立方体和地面网格。
怎么做:先声明一个Camera结构体(位置、朝向、 fov),调用SetCameraMode(camera, CAMERA_FIRST_PERSON)告诉 raylib 用第一人称控制方案,之后每帧UpdateCamera(&camera)自动吃掉鼠标和键盘输入。绘制时BeginMode3D(camera)切进 3D 状态,DrawCube、DrawGrid随便摆,EndMode3D()切回 2D。换CAMERA_ORBIT、CAMERA_FREE就是别的镜头方案,一套 API 全通用。
完整例子看 examples/core/core_3d_camera_first_person.c,examples/core/ 目录下还有轨道相机、分屏、3D 拾取等一整套镜头玩法:
场景四:给游戏加背景音乐和音效
想要的效果:背景音乐循环播放,按键时触发短音效。
怎么做:音频分两类 API。短音效用LoadSound+PlaySound,简单直接;背景音乐用流式播放的LoadMusicStream(BGM 太大不能整个塞内存),注意它需要每帧调用一次UpdateMusicStream(music)才会持续出声,这是新手最常漏掉的一步。格式支持 WAV、MP3、OGG、FLAC 等,格式库也在 src/external/ 里。
完整例子在 examples/audio/audio_music_stream.c:
raylib 编译和资源加载的常见坑
⚠️ 这些是社区里反复出现的真实问题,提前知道能省不少时间:
- Linux 编译报 X11 头文件缺失:GLFW 后端需要桌面开发库,先装再
make:sudo apt install libx11-dev libxrandr-dev libxi-dev libxcursor-dev libgl1-mesa-dev(Wayland 会话另需 wayland 相关开发包) - LoadTexture 报加载失败:示例的资源放在各模块的
resources/子目录里,路径是相对当前工作目录的,在仓库根目录直接跑./basic_window找不到资源。要么cd examples/textures/再运行,要么把资源拷到自己项目目录 - RenderTexture 里的画面是上下颠倒的:这是 OpenGL 的坐标惯例,官方 README 明确写了需要自己在回写屏幕时翻转,属于已知限制而非 bug
- 想要多窗口:raylib 设计上默认单窗口单 OpenGL 上下文,别折腾,需要多窗口就开多进程
- 中文字体渲染偏糙:内置光栅化质量低于 Freetype,也不支持 RTL 和 emoji;对字体要求高建议换成 TTF 动态字体加载(
LoadFont),或看 examples/text/ 的字体方案 - CMake 用户:不想手写链接命令的话,projects/CMake/ 有现成的 CMakeLists 模板可以抄
继续深入
代码风格、目录约定看 CONVENTIONS.md,常见问题(许可证、平台、格式支持)看 FAQ.md,剩下 100 多个覆盖各模块的例子都在 examples/ 目录里,按模块分类、逐个对着改就行。
【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考