#raylib #bindings #gamedev #ffi

sys raylib-sys

Raylib的原始FFI绑定

10个版本 (6个稳定版)

5.0.2 2024年8月21日
5.0.0 2024年5月19日
3.7.0 2021年11月7日
3.5.0 2021年1月8日
0.9.2 2019年1月31日

#795 in 游戏开发

Download history 518/week @ 2024-05-05 545/week @ 2024-05-12 941/week @ 2024-05-19 666/week @ 2024-05-26 733/week @ 2024-06-02 412/week @ 2024-06-09 733/week @ 2024-06-16 629/week @ 2024-06-23 236/week @ 2024-06-30 429/week @ 2024-07-07 663/week @ 2024-07-14 640/week @ 2024-07-21 651/week @ 2024-07-28 598/week @ 2024-08-04 892/week @ 2024-08-11 790/week @ 2024-08-18

每月下载量3,023
用于 11 个Crate(通过 raylib

Zlib 许可证

2.5MB
57K SLoC

C 46K SLoC // 0.2% comments Lua 7.5K SLoC Objective-C 3K SLoC // 0.1% comments Rust 375 SLoC // 0.1% comments Zig 195 SLoC // 0.1% comments C++ 31 SLoC

rust crates.io docs discord

logo

raylib-rs

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

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

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

  • 资源在超出作用域时(或当调用 std::mem::drop 时)会自动清理。这本质上是一种RAII。这意味着“卸载”函数没有暴露(并且如果不是使用make_weak()获取了Weak资源,则不是必需的)。
  • 大部分的Raylib API都通过 RaylibHandle 暴露,它是为了确保Raylib只初始化一次,并且确保窗口能够正确关闭。RaylibHandle没有大小,在编译时消失。由于可变性规则,Raylib-rs是线程安全的!
  • 通过 raylib::init_window(...) 或通过较新的 init() 函数可以获取 RaylibHandleRaylibThread,它允许你在初始化之前构建一些窗口选项(取代了 set_config_flags)。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. cargobuild

如果为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 通过打开窗口并检查各种函数的结果来测试绑定。它需要使用夜间构建。

未来目标

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

贡献 & 支持

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

无运行时依赖