news 2026/9/17 9:05:36

raylib 上手指南:15 行 C 代码,从窗口到 3D 场景跑通完整游戏循环

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
raylib 上手指南:15 行 C 代码,从窗口到 3D 场景跑通完整游戏循环

raylib 上手指南:15 行 C 代码,从窗口到 3D 场景跑通完整游戏循环

【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib

raylib 是一个纯 C 写的轻量级游戏开发库,把窗口、渲染、输入、音频封装进单一头文件 raylib.h,一条 gcc 命令就能编译出能跑的游戏。它没有编辑器、没有场景系统,但胜在够薄:十几行代码就是一个完整游戏的骨架,最适合想快速验证小游戏创意的开发者。

先跑起来:安装 raylib 并编译最小示例

Linux 上走包管理器即可(Windows 用 choco,macOS 用 brew,都是一条命令的事):

sudo apt install libraylib-dev

想跑最新版,克隆仓库git clone https://gitcode.com/GitHub_Trending/ra/raylib,然后进 src/ 目录执行 make 构建、make install 安装。

装好写这个最短程序,开了一个 800×450 的窗口,画一行字:

#include "raylib.h" int main(void) { InitWindow(800, 450, "我的第一个 raylib 窗口"); while (!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); DrawText("Congrats! You created your first window!", 190, 200, 20, LIGHTGRAY); EndDrawing(); } CloseWindow(); return 0; }
gcc main.c -o game -lraylib

注意 while 循环里WindowShouldClose()+BeginDrawing/EndDrawing这个结构。这是 raylib 的整个程序模型:初始化、循环里读输入、更新、绘制、关闭。之后所有游戏都是在这副骨架里填内容。

用 Draw 系列函数画 2D 游戏

矩形、圆形、文字、贴图都有现成的 Draw 函数:画填充矩形是DrawRectangleRec,画圆是DrawCircle,画文字是DrawText,全程不碰任何图形 API。打砖块、贪吃蛇这类小 2D 游戏,基本就是反复画这些基础图形,再自己维护位置、做碰撞判断。

一个相机进 3D:BeginMode3D 与模型加载

进 3D 只需一句BeginMode3D(camera)。相机是个结构体:位置、目标点、朝上方向、视野角度,填四个数就定了视角。循环里 Begin/EndMode3D 之间画模型、贴纹理即可。加载外部模型就是LoadModel("scene.obj")一行,OBJ、glTF、IQM 都能读。配合 2D 相机BeginMode2D,横版游戏让相机跟着玩家走,世界就能平移、缩放。

读取键盘鼠标事件

IsKeyDown(KEY_A)判断某键是否正被按住,IsKeyPressed(KEY_SPACE)判断是否刚按下一次,GetMousePosition()拿鼠标坐标,滚轮、点击、手柄都有对应函数。判断"按住"和"刚按下"的区别很关键:前者管持续移动,后者管一次性触发。

一个完整小场景:可暂停的弹跳球

把前面的能力拼起来:小球带重力弹跳,空格暂停。变量初始化放在 main 开头,主循环只做三件事——读输入、积分位置、绘制:

if (IsKeyPressed(KEY_SPACE)) pause = !pause; if (!pause) { position.x += speed.x; position.y += speed.y; speed.y += gravity; if (position.x <= radius || position.x >= GetScreenWidth() - radius) speed.x *= -1.0f; if (position.y <= radius || position.y >= GetScreenHeight() - radius) speed.y *= -0.95f; }

BeginDrawingClearBackground(RAYWHITE)DrawCircleV(position, radius, MAROON)就完事。竖直方向那个-0.95f是反弹损耗,改这一个数字手感立刻不同。这就是 raylib 的开发节奏:任何小改动,编译跑一次,三秒内看到结果。

新手常踩的 raylib 坑

窗口打不开或者闪退。多数是显卡 OpenGL 版本太旧。raylib 默认走 OpenGL 3.3,先glxinfo | grep "OpenGL version"查一下,版本不够就在编译 raylib 时加-DGRAPHICS=GRAPHICS_API_OPENGL_21降到兼容版本再重新构建。

编译报 raylib.h: No such file or directory。路径问题。包管理器装的,确认带 -dev 后缀的开发包装上了;源码构建的,用-I-L手动指向头文件和库所在目录。

程序能跑但没有声音。代码没错,是系统缺音频开发库。Linux 装一下libasound2-dev重新编译就能出声。

下一步:200 多个示例和项目模板

  • examples/ 目录里有 220 多个示例,examples/README.md 里每个都标了难度星级和所属模块。挑 ⭐☆☆☆ 的一星示例(比如 core_basic_window)编译跑一遍再读代码,是最快的熟悉方式。
  • projects/ 里有现成的 CMake、VS2022、CodeBlocks、VSCode 工程模板,复制一份改成自己的游戏工程,构建系统就不用自己研究了。
  • src/raylib.h 本身就是一份 API 清单,所有函数带注释,按 core/shapes/models/textures/audio 分段组织,遇到不认识的函数直接搜它。
  • 练习路线:先只用基础图形做贪吃蛇或打砖块,再试LoadModel和音频加载,一轮下来常用 API 基本过了一遍。

raylib 不是一个引擎:没有场景系统、没有动画编辑器、没有物理引擎,每个角色移动都得自己写积分公式。它的边界是"薄"——你换来的是彻底看清游戏是怎么一帧帧跑起来的,之后换用更重的引擎也不会心里没底。如果你要做的东西需要复杂场景和美术管线,它不适合;如果你只想花一个下午验证一个玩法、或者学懂游戏循环本身,把它跑通,你就知道它合不合适你了。

【免费下载链接】raylibA simple and easy-to-use library to enjoy videogames programming项目地址: https://gitcode.com/GitHub_Trending/ra/raylib

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/17 9:05:04

pentagi:本地部署的自主Agent,实现可控的任务规划与执行

不出意外的话&#xff0c;从年初开始&#xff0c;你们应该也刷到过不少本地部署 Agent 的教程。最早是 AutoGPT 那一批&#xff0c;看起来很酷&#xff0c;但自己跑起来就露馅了&#xff1a;任务拆解太机械&#xff0c;认错能力几乎没有&#xff0c;稍微复杂一点的活就断在那里…

作者头像 李华
网站建设 2026/9/17 9:04:45

LiteLLM + Switchyard路由插件:在LiteLLM里跑阶段路由的完整方案

LiteLLM Switchyard路由插件&#xff1a;在LiteLLM里跑阶段路由的完整方案 【免费下载链接】Switchyard Switchyard lets LLM applications route traffic across models and providers while preserving native OpenAI and Anthropic API compatibility - enabling flexible …

作者头像 李华
网站建设 2026/9/17 9:00:42

SAE AS5643时间触发总线:IEEE 1394b航电/车载网络设计

第一次在需求文件里看到 SAE AS5643 这几个字符的时候&#xff0c;我的第一反应是&#xff1a;又是 IEEE 1394&#xff1f;这条在消费电子领域早就退场的总线&#xff0c;怎么还在航电和车载平台的方案里活着。等把标准原文翻完、再上手把一套 S400 的环网从零搭起来跑通&#…

作者头像 李华
网站建设 2026/9/17 8:57:10

KubeEdge 项目中的 go-sqlite3:Go 语言 SQLite 驱动的完整实战指南

KubeEdge 项目中的 go-sqlite3&#xff1a;Go 语言 SQLite 驱动的完整实战指南 【免费下载链接】kubeedge Kubernetes Native Edge Computing Framework (project under CNCF) 项目地址: https://gitcode.com/GitHub_Trending/ku/kubeedge 导读 go-sqlite3 是 Go 语言生…

作者头像 李华