raylib快速上手指南:用C语言从零构建你的第一个2D/3D游戏
【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib
想象一下这样的场景:你脑子里有个小游戏点子,但不想被重型引擎的配置流程劝退——没有编辑器、没有资产管线、没有庞大的启动工程,只要一个.c文件加一个游戏库,就能在 5 分钟内看到画面上出现东西。这正是 raylib 的定位:一个跨平台的 C 语言游戏开发库,让你把精力全放在游戏逻辑本身。🎮
30 秒速览:raylib 是什么
| 维度 | 一句话说明 |
|---|---|
| 它是什么 | 用纯 C99 编写的游戏编程库,灵感来自 Borland BGI 与 XNA |
| 凭什么值得用 | 零外部依赖(第三方库全部内嵌在 src/external/),支持 Windows / Linux / macOS / Android / HTML5,硬件加速覆盖 OpenGL 1.1 到 4.3 及 ES 2.0/3.0 |
| 核心模块 | 2D 图形、3D 渲染、纹理与字体、音频、着色器、VR 立体渲染 |
| 适合谁 | 想快速做原型、教学演示、图形工具或嵌入式演示的开发者;也适合第一次写游戏的新手 |
官方态度很"斯巴达":没有花哨的界面和调试按钮,就是纯粹的代码。如果你喜欢这种直接感,往下看。
拿到代码,5 分钟编译出第一个画面
第 1 步:获取源码。本地包管理器(如 vcpkg、Homebrew、apt)里也有现成的 raylib 包,这里走源码路线:
git clone https://gitcode.com/GitHub_Trending/ra/raylib cd raylib/src第 2 步:编译库。src/ 下的 Makefile 最省事:
make -j$(nproc)Windows 用户也可以直接打开 projects/VS2022/ 里的解决方案;用 CMake 的人可以看 projects/CMake/ 的模板。
第 3 步:写下第一个窗口。下面是 raylib 最经典的最小示例,不到 20 行:
#include "raylib.h" int main(void) { InitWindow(800, 450, "raylib - first window"); while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); DrawText("Hello, raylib!", 190, 200, 40, LIGHTGRAY); EndDrawing(); } CloseWindow(); return 0; }编译时把raylib.h所在目录加进包含路径、链接libraylib即可。跑起来你会看到这样一个 800x450 的窗口:
整个InitWindow→while循环 →BeginDrawing/EndDrawing→CloseWindow的模式,就是后面所有例子的骨架。
四大能力域拆解:每个功能找到对应模块
2D 绘制:不用画布 API,函数即画笔
2D 部分全部是直观的DrawXxx系列函数:圆、矩形、椭圆、多边形、贝塞尔曲线、虚线……颜色、渐变、描边都有对应变体。
DrawCircle(200, 120, 35, DARKBLUE); // 实心圆 DrawEllipse(200, 120, 25, 20, YELLOW); // 椭圆 DrawRectangle(340, 100, 120, 60, RED); // 矩形 DrawLine(50, 400, 750, 400, MAROON); // 直线examples/shapes/shapes_basic_shapes.c 把这些函数一次画了个遍,效果大致如下:
3D 渲染:一个相机函数切入立体世界
进入 3D 只需声明相机、切到BeginMode3D,出来再EndMode3D。模型格式支持 OBJ、glTF/GLB、IQM、M3D、VOX,材质系统兼容传统贴图与 PBR 贴图:
Model model = LoadModel("resources/models/obj/castle.obj"); Texture2D tex = LoadTexture("resources/models/obj/castle_diffuse.png"); model.materials[0].maps[MATERIAL_MAP_DIFFUSE].texture = tex; // 每帧只需一行: DrawModel(model, (Vector3){ 0.0f, 0.0f, 0.0f }, 1.0f, WHITE);examples/models/models_loading.c 还演示了拖放文件热加载模型的玩法:
纹理与精灵:从静态图到动画角色
精灵动画的关键是DrawTextureRec——它只画纹理的一个子区域,配合一个逐帧移动的Rectangle就是动画:
Rectangle frameRec = { 0, 0, (float)sheet.width/6, sheet.height }; int currentFrame = 0; // 更新逻辑:每 60/framesSpeed 帧切一帧 frameRec.x = currentFrame * (float)sheet.width/6; DrawTextureRec(sheet, frameRec, position, WHITE);这个模式在 examples/textures/textures_sprite_animation.c 里有完整实现,左键/右键还能实时调播放速度:
音频:流式音乐 + 即时音效
音频模块支持 WAV、MP3、OGG、FLAC、QOA、MOD 等格式。长音乐用Music(流式加载,不占爆内存),短音效用Sound:
InitAudioDevice(); Music music = LoadMusicStream("resources/audio/background.mp3"); // 每帧里: UpdateMusicStream(music); // 推进流式播放 if (IsKeyPressed(KEY_SPACE)) PlaySound(clap);参考 examples/audio/audio_music_stream.c:
动手做一个:15 行逻辑的弹球小游戏
光看函数不够,下面把 2D 绘制、输入、物理合成一个能跑的小游戏。仓库里现成的 examples/shapes/shapes_bouncing_ball.c 就是这个成品,我们拆解它的三段结构:
1. 初始化状态(窗口建好后):
Vector2 ballPosition = { GetScreenWidth()/2.0f, GetScreenHeight()/2.0f }; Vector2 ballSpeed = { 5.0f, 4.0f }; float gravity = 0.2f; bool useGravity = true;2. 更新逻辑(while循环内,BeginDrawing之前):
if (IsKeyPressed(KEY_G)) useGravity = !useGravity; // G 键切换重力 ballPosition.x += ballSpeed.x; ballPosition.y += ballSpeed.y; if (useGravity) ballSpeed.y += gravity; // 重力加速 // 碰墙反弹:水平全反弹,垂直损失 5% 能量 if (ballPosition.x >= GetScreenWidth() - 20 || ballPosition.x <= 20) ballSpeed.x *= -1.0f; if (ballPosition.y >= GetScreenHeight() - 20 || ballPosition.y <= 20) ballSpeed.y *= -0.95f;3. 绘制(BeginDrawing/EndDrawing之间):
DrawCircleV(ballPosition, 20, MAROON); DrawFPS(10, 10);跑起来的效果——小球在窗口里弹跳,按 G 切换重力:
体会一下 raylib 的分工哲学:更新在BeginDrawing之前,绘制在BeginDrawing之后,物理和画面彻底解耦。你接下来要做的,只是往"更新"里加规则、往"绘制"里加表现。
进阶玩法:着色器与立体相机
等你玩转了基础模块,有两个方向值得立刻尝试:
- 着色器:
LoadShader("base.vs", "grayscale.fs")加载自定义 GLSL,再套在绘制调用上就能实现灰度化、雾效、延迟渲染、后处理等效果。仓库 examples/shaders/ 里有一整排视觉实验,从 Mandelbrot 集合到光照模型都有。 - 相机系统:内置第一人称、自由视角、环绕等多种相机模式,一行
SetCameraMode(camera, CAMERA_FIRST_PERSON)切换;配合BeginVrDrawing还能输出 VR 双目渲染,HMD 参数可配置。
生态与资源
- 示例库:examples/ 下 140+ 个可运行的 C 示例,按 core / shapes / textures / models / audio / shaders 分类,是官方推荐的"第一手文档"
- API 速查:官网 raylib.com 提供 cheatsheet,列出了每个函数的签名与说明
- 项目模板:projects/ 里备好了 VS2022、CMake、CodeBlocks、Geany、Zig、Android 等多套工程模板,拿来就能改
- 头文件即文档:src/raylib.h 里每个 API 的注释写得相当详细,配合 src/raymath.h 的向量/矩阵/四元数数学模块阅读
- 绑定:官方维护 70+ 语言的绑定,见 BINDINGS.md
下一步做什么
按这个顺序走,一天内能完成完整的入门闭环:
- 编译
examples/core/core_basic_window.c,确认窗口能开、能关; - 改
examples/shapes/里任意一个示例,把颜色、参数改成自己的; - 参考本文"弹球"小节,写一个自己规则的游戏(比如加两个球、加碰撞计分);
- 卡住时直接搜对应模块的示例文件名,比如想做 3D 就找
models_前缀的文件抄结构。
raylib 的门槛低到"一个头文件加一段循环",而天花板却高到着色器与 VR。把第一个窗口开出来,剩下的就是玩的问题了——祝你早日看到自己游戏里那颗会跳的球。🚀
【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考