12个版本 (稳定)

5.0.2 2024年8月21日
5.0.1 2024年5月24日
3.7.0 2021年11月7日
3.5.0 2021年1月8日
0.9.1 2019年1月24日

11游戏开发 中排名

Download history 516/week @ 2024-05-04 552/week @ 2024-05-11 951/week @ 2024-05-18 836/week @ 2024-05-25 726/week @ 2024-06-01 401/week @ 2024-06-08 725/week @ 2024-06-15 655/week @ 2024-06-22 315/week @ 2024-06-29 388/week @ 2024-07-06 626/week @ 2024-07-13 627/week @ 2024-07-20 633/week @ 2024-07-27 575/week @ 2024-08-03 924/week @ 2024-08-10 766/week @ 2024-08-17

2,984 每月下载量
用于 10 crates

Zlib 许可证

3MB
66K SLoC

C 46K SLoC // 0.2% comments Rust 9K SLoC // 0.0% comments Lua 7.5K SLoC Objective-C 3K SLoC // 0.1% comments Zig 194 SLoC // 0.0% comments C++ 30 SLoC

rust crates.io docs discord

logo

raylib-rs

raylib-rs 是 Raylib 5.0 的 Rust 绑定。它目前针对的是 1.78 或更高版本的稳定 Rust 工具链。

请查看示例目录以找到使用示例!

虽然这个绑定试图保持与简单的 C API 保持一致,但它对 Rust 进行了一些修改以使其更符合 Rust 习惯。

  • 当资源超出作用域(或调用 std::mem::drop 时),资源会被自动清理。这本质上是 RAII。这意味着不暴露 "卸载" 函数(除非使用 make_weak() 获取了 Weak 资源)。
  • 大多数的 Raylib API 都通过 RaylibHandle 暴露,它是为了确保 Raylib 只初始化一次,并确保窗口正确关闭。RaylibHandle 没有大小,在编译时消失。由于可变性规则,raylib-rs 是线程安全的!
  • 通过 raylib::init_window(...) 或通过较新的 init() 函数(这将允许你在初始化之前构建一些窗口选项,替换了 set_config_flags)来获取 RaylibHandleRaylibThread。RaylibThread 不应发送到任何其他线程,或用于任何同步原语(Mutex、Arc)等。
  • 手动关闭窗口是不必要的,因为当 RaylibHandle 超出作用域时,会自动调用 CloseWindow
  • 由于无法直接设置字段,新增了 Model::set_materialMaterial::set_shaderMaterialMap::set_texture 方法。同时,也强制执行正确的所有权语义。
  • 新增了 Font::from_dataFont::set_charsFont::set_texture 方法,用于从加载的 CharInfo 数据创建 Font
  • 省略了 SubTextFormatText,分别由 Rust 的字符串切片和 Rust 的 format! 宏替代。

安装

支持的平台

API Windows Linux macOS Web Android
核心 ✔️ ✔️ ✔️ ✔️
rgui ✔️ ✔️ ✔️
physac 🚧 🚧 🚧
rlgl ✔️

构建依赖

需要 glfw、cmake 和 curl。如何使所有平台都能顺畅运行的建议受到欢迎。请遵循为您的平台构建 raylib 的说明 在此

  1. 将依赖项添加到您的 Cargo.toml
[dependencies]
raylib = { version = "5.0" }
  1. 开始编码!
use raylib::prelude::*;

fn main() {
    let (mut rl, thread) = raylib::init()
        .size(640, 480)
        .title("Hello, World")
        .build();

    while !rl.window_should_close() {
        let mut d = rl.begin_drawing(&thread);

        d.clear_background(Color::WHITE);
        d.draw_text("Hello, world!", 12, 12, 20, Color::BLACK);
    }
}

技术笔记

  • 包含资源的结构体具有 RAII/move 语义,包括:ImageTexture2DRenderTexture2DFontMeshShaderMaterialModel
  • WaveSoundMusicAudioStream 的生命周期绑定到 AudioHandle
  • 处理字符串数据的函数接受 &str 和/或返回一个拥有的 String,出于安全考虑。这个例外是 gui 绘图函数,它接受 &CStr 以避免每帧分配。 rstr! 宏有助于简化这一点。
  • 在 C 中,LoadFontData 返回指向堆分配的 CharInfo 结构体数组的指针。在此 Rust 绑定中,该数组被复制到一个拥有的 Vec<CharInfo>,原始数据被释放,并返回拥有的 Vec。
  • 在 C 中,LoadDroppedFiles 返回一个指向由 raylib 拥有的字符串数组的指针。出于安全和易用的考虑,此绑定将数组复制到返回给调用者的一个 Vec<String>
  • 我已经尝试使链接自动化,尽管我只在 Windows 10、Ubuntu 和 MacOS 15 上进行了测试。其他平台可能需要考虑其他因素。
  • 可以通过在 Cargo.toml 的依赖项定义中的 features 数组中添加 ["opengl_33"]["opengl_21"]["opengl_es_20] 强制使用 OpenGL 3.3、2.1 和 ES 2.0。

从源代码构建

  1. 克隆仓库: git clone --recurse-submodules
  2. cargo构建

如果要在Linux上为Wayland构建

  1. 安装以下软件包
    libglfw3-dev wayland-devel libxkbcommon-devel wayland-protocols wayland-protocols-devel libecm-dev
请注意,这可能不是一份全面的列表,请根据您的发行版添加详细信息,或者如果您认为这些软件包不完整,请扩展它们。
  1. 通过添加 features=["wayland"] 到您的依赖定义中启用wayland

使用 cross 进行交叉编译

@rust-embedded 项目提供了一个名为 cross 的实用工具,该工具使用docker将任何cargo项目交叉编译到其许多 支持的平台上。此工具使交叉编译 raylib-rs 以进行二进制分发变得容易(例如,在您正在制作预编译游戏的情况下)。

Windows上的任何东西

从其他平台到Windows的交叉编译是最简单的。只需用这个命令代替常规的 cargo build

cross build --target x86_64-pc-windows-gnu --release

需要注意的是,由于Raylib音频处理的问题,生成的exe可能无法在 wine 下运行。

Linux上的任何东西

从任何平台到Linux的交叉编译,或从Linux到Linux需要一点额外的工作,因为 raylib-sys 有一些系统依赖项不是由 cross 提供的。以下示例假设您正在为 x86_64-unknown-linux-gnu 编译,但它可以是任何Linux-y三元组。

首先,必须定义一个自定义构建容器。以下 Dockerfile 是编译 raylib-sys 的最小设置。

FROM rustembedded/cross:x86_64-unknown-linux-gnu-0.2.1

RUN apt-get update -y
RUN apt-get install libasound2-dev mesa-common-dev libx11-dev libxrandr-dev libxi-dev xorg-dev libgl1-mesa-dev libglu1-mesa-dev -y

定义了镜像后,可以本地构建它:

docker build -t raylib_rs_env .

这将生成一个名为 raylib_rs_env 的本地docker镜像,cross 将使用它而不是默认的Linux镜像(们)。要告诉 cross 使用此镜像,在您的 Cargo.toml 旁边创建一个 Cross.toml 文件,并添加以下内容(请根据您的设置进行更改):

[target.x86_64-unknown-linux-gnu]
image = "raylib_rs_env"

现在可以使用以下命令生成Linux构建:

cross build --target x86_64-unknown-linux-gnu --release

macOS / Darwin / IOS

截至目前,cross 不支持交叉编译到苹果的任何操作系统。请密切关注他们的存储库,以防这种情况发生变化。

额外内容

  • 除了基础库之外,还有一个方便的 ease 模块,其中包含从 raylib 的 easings.h 端口的各种插值/缓动函数,以及一个 Tween 结构来帮助使用这些函数。
  • raymath.h 端口的等效数学和向量运算已 impl 在各种向量类型和矩阵类型上。使用操作符重载以实现更直观的设计。

测试

raylib-test crate 通过打开一个窗口并检查各种函数的结果来测试绑定。它需要nightly才能使用。

未来目标

  • 将 raylib 示例端口到 Rust。
  • 更多测试。
  • 更多平台测试。
  • 更多的测试。
  • Physac 端口?

贡献 & 支持

欢迎所有贡献。在 discord 上讨论 raylib。

依赖项

~4–13MB
~153K 估算 SLoC