#opengl #graphics #2d-graphics #gamedev #opengl-context #mouse-event

speedy2d

具有易于使用的API的形状、图像和文本的硬件加速绘制。Speedy2D的目标是成为创建窗口、渲染图形和处理输入的最简单的Rust API。

25个稳定版本

2.1.0 2024年3月25日
2.0.0 2023年11月5日
1.12.0 2023年3月19日
1.9.0 2022年11月26日
1.0.7 2021年3月4日

图形API 中排名 28

Download history 213/week @ 2024-04-07 261/week @ 2024-04-14 264/week @ 2024-04-21 229/week @ 2024-04-28 255/week @ 2024-05-05 229/week @ 2024-05-12 308/week @ 2024-05-19 270/week @ 2024-05-26 260/week @ 2024-06-02 152/week @ 2024-06-09 237/week @ 2024-06-16 228/week @ 2024-06-23 76/week @ 2024-06-30 91/week @ 2024-07-07 199/week @ 2024-07-14 206/week @ 2024-07-21

每月下载 592
用于 6 crate

Apache-2.0

1MB
11K SLoC

Speedy2D

Crate Documentation CI

具有易于使用的API的形状、图像和文本的硬件加速绘制。

Speedy2D旨在成为

  • 创建窗口、渲染图形/文本和处理输入的最简单的Rust API
  • 与支持OpenGL 2.0+或WebGL 2.0的任何设备兼容。计划支持OpenGL ES 2.0+
  • 非常快

支持Windows、Mac、Linux和WebGL。Android和iOS的支持正在开发中。

默认情况下,Speedy2D包含设置具有OpenGL上下文的窗口和接收输入事件的支撑。如果您想自己处理,并且只想使用Speedy2D进行渲染,您可以禁用windowing功能。

特性

Windows Mac Linux Web
绘制2D形状 ✔️ ✔️ ✔️ ✔️
加载字体并绘制文本 ✔️ ✔️ ✔️ ✔️
加载并绘制图像 ✔️ ✔️ ✔️ ✔️
鼠标事件 ✔️ ✔️ ✔️ ✔️
键盘事件 ✔️ ✔️ ✔️ ✔️
全屏 ✔️ ✔️ ✔️ ✔️
窗口控制 ✔️ ✔️ ✔️ ℹ️ 部分支持
DPI/缩放更改事件 ✔️ ✔️ ✔️ ✔️
系统时钟/定时器 ✔️ ✔️ ✔️ ✔️

示例代码

示例项目可以通过以下命令运行:cargo run --example=hello_world(只需将hello_world更改为示例源文件的名称)。

Screenshot

快速入门(Windows/Mac/Linux)

步骤 1: 将Speedy2D添加到你的Cargo.toml依赖项

[dependencies]
speedy2d = "2.1.0"

步骤 2: 创建一个窗口

use speedy2d::Window;

let window = Window::new_centered("Title", (640, 480)).unwrap();

步骤 3: 创建一个实现WindowHandler trait的结构体。重写你感兴趣的任何回调,例如 on_draw()on_mouse_move()on_key_down()

use speedy2d::color::Color;
use speedy2d::window::{WindowHandler, WindowHelper};
use speedy2d::Graphics2D;

struct MyWindowHandler {}

impl WindowHandler for MyWindowHandler
{
    fn on_draw(&mut self, helper: &mut WindowHelper, graphics: &mut Graphics2D)
    {
        graphics.clear_screen(Color::from_rgb(0.8, 0.9, 1.0));
        graphics.draw_circle((100.0, 100.0), 75.0, Color::BLUE);

        // Request that we draw another frame once this one has finished
        helper.request_redraw();
    }

   // If desired, on_mouse_move(), on_key_down(), etc...
}

步骤 4: 最后,通过将你的新WindowHandler传递给run_loop()函数来启动事件循环。

window.run_loop(MyWindowHandler{});

就这些!

有关更详细的入门指南,包括完整的WindowHandler回调列表以及如何渲染文本,请访问docs.rs/speedy2d

以下为上述示例的完整代码,供您方便参考

use speedy2d::color::Color;
use speedy2d::{Graphics2D, Window};
use speedy2d::window::{WindowHandler, WindowHelper};

fn main() {
    let window = Window::new_centered("Title", (640, 480)).unwrap();
    window.run_loop(MyWindowHandler{});
}

struct MyWindowHandler {}

impl WindowHandler for MyWindowHandler
{
    fn on_draw(&mut self, helper: &mut WindowHelper, graphics: &mut Graphics2D)
    {
        graphics.clear_screen(Color::from_rgb(0.8, 0.9, 1.0));
        graphics.draw_circle((100.0, 100.0), 75.0, Color::BLUE);
        helper.request_redraw();
    }
}

替代方案:自行管理GL上下文

如果你希望自行处理窗口创建和OpenGL上下文管理,只需在Cargo.toml文件中禁用Speedy2D的windowing功能,并按如下方式创建上下文。你将需要指定一个加载函数,以便Speedy2D能够获取OpenGL函数指针。

use speedy2d::GLRenderer;

let mut renderer = unsafe {
    GLRenderer::new_for_gl_context((640, 480), |fn_name| {
        window_context.get_proc_address(fn_name) as *const _
    })
}.unwrap();

然后,使用GLRenderer::draw_frame()绘制一帧

renderer.draw_frame(|graphics| {
    graphics.clear_screen(Color::WHITE);
    graphics.draw_circle((100.0, 100.0), 75.0, Color::BLUE);
});

WebGL

使用Speedy2D与WebGL的完整教程

要使用Speedy2D与WebGL,你的应用程序必须为WebAssembly编译。Speedy2D可以使用你指定的ID将自身附加到页面上的canvas

与Windows/Mac/Linux目标类似,Speedy2D可以是全渲染和事件处理配置,也可以仅用于渲染。

仅用于渲染时,使用以下API

  • GLRenderer::new_for_web_canvas_by_id()

除了渲染之外,还需要完整的键盘/鼠标等事件处理,使用

  • WebCanvas::new_for_id()
  • WebCanvas::new_for_id_with_user_events()

初始化后,通常的WindowHandler回调和WindowHelper/Graphics2D API应该像在其他平台上一样工作。

有关示例,请参阅examples/webgl目录。首先安装先决条件

cargo install wasm-bindgen-cli just

然后使用以下命令运行构建

just build-example-webgl

许可证

Speedy2D根据Apache许可证,版本2.0授权。有关详细信息,请参阅LICENSE

贡献

欢迎为Speedy2D提交拉取请求。请在提交之前确保以下检查在本地通过。

注意:自动测试目前仅在Linux上运行。

cargo test
cargo test --no-default-features --lib --examples --tests
cargo clippy
cargo +nightly fmt -- --check
cargo doc
cargo build --target wasm32-unknown-unknown
cargo build --target wasm32-unknown-unknown --no-default-features

可以使用just自动运行这些命令

just precommit

某些测试需要能够创建无头OpenGL上下文的能力。

依赖关系

~7–13MB
~273K SLoC