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 在 游戏开发 中排名
2,984 每月下载量
用于 10 crates
3MB
66K SLoC
raylib-rsraylib-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
)来获取RaylibHandle
和RaylibThread
。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
cargo构建
如果要在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 通过打开一个窗口并检查各种函数的结果来测试绑定。它需要nightly才能使用。
未来目标
- 将 raylib 示例端口到 Rust。
- 更多测试。
- 更多平台测试。
- 更多的测试。
- Physac 端口?
贡献 & 支持
欢迎所有贡献。在 discord 上讨论 raylib。
依赖项
~4–13MB
~153K 估算 SLoC