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 游戏开发
每月下载量3,023
用于 11 个Crate(通过 raylib)
2.5MB
57K SLoC
|
|
raylib-rsraylib-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()函数可以获取RaylibHandle和RaylibThread,它允许你在初始化之前构建一些窗口选项(取代了set_config_flags)。RaylibThread不应发送到任何其他线程,或用于任何同步原语(Mutex、Arc)等。 - 手动关闭窗口是不必要的,因为当
RaylibHandle超出作用域时,会自动调用CloseWindow。 Model::set_material、Material::set_shader和MaterialMap::set_texture方法被添加,因为不能直接设置字段。同时也强制执行正确的所有权语义。- 添加了
Font::from_data、Font::set_chars和Font::set_texture方法,用于从加载的CharInfo数据创建Font。 - 省略了
SubText和FormatText,分别由Rust的字符串切片和Rust的format!宏替代。
安装
支持的平台
| API | Windows | Linux | macOS | Web | Android |
|---|---|---|---|---|---|
| 核心 | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
| rgui | ✔️ | ✔️ | ✔️ | ❔ | ❌ |
| physac | 🚧 | 🚧 | 🚧 | ❔ | ❌ |
| rlgl | ✔️ | ❌ | ❌ | ❔ | ❌ |
构建依赖
需要glfw、cmake和curl。如何使所有平台顺畅运行的建议将受到欢迎。按照以下说明为您的平台构建raylib:这里
- 将依赖项添加到您的
Cargo.toml
[dependencies]
raylib = { version = "5.0" }
- 开始编码!
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语义,包括:
Image、Texture2D、RenderTexture2D、Font、Mesh、Shader、Material和Model。 Wave、Sound、Music和AudioStream的生存期绑定到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。
从源代码构建
- 克隆仓库:
git clone --recurse-submodules cargobuild
如果为Linux上的Wayland构建
- 安装以下包
libglfw3-dev wayland-devel libxkbcommon-devel wayland-protocols wayland-protocols-devel libecm-dev
请注意,这可能不是一个完整的列表,请根据您的发行版添加详细信息,或者如果您认为列表不完整,请扩展这些包。
- 通过在依赖定义中添加
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
