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