1个不稳定版本

0.1.0 2024年3月7日

#1517 in 游戏开发

MIT/Apache

16KB
220

Wolf Engine Events

Crates.io Crates.io

Wolf Engine的事件系统。

特性

  • 一个简单、类似Channel的API。
  • 动态类型的事件API。

许可证

Wolf Engine Events的许可证可以是以下之一

由您选择。

贡献

除非您明确声明,否则您有意提交以包含在作品中的任何贡献,如Apache-2.0许可证中定义的,应作为上述双重许可,不附加额外条款或条件。


lib.rs:

为Wolf Engine提供事件系统。

示例

此模块提供了一个基于发送者/接收者/消息通道的FIFO(先进先出)事件系统,该通道在 std::sync::mpsc 中找到。

创建事件队列

#
let (event_sender, event_receiver) = mpsc::event_queue();
#

处理事件

EventReceiver 会收集传入的事件,并将它们存储起来,直到它们准备好处理。传入事件的顺序始终得到保留。

在循环中查询队列中的事件。查询事件需要您具有对事件队列的可变访问权限。

#
#
while let Some(event) = event_receiver.next_event() {
    match event {
        EventType::Event => (), // Handle the event.
    }
}

发送事件

要将事件发送到 EventReceiver,我们使用 EventSender。事件发送者就像一个隧道,您可以通过它发送数据,它将在另一端弹出。

#
event_sender.send_event(EventType::Event);

克隆和转移 EventSender 的所有权

事件发送者非常有用,因为它们可以被自由且安全地克隆,并将所有权转移到需要发送事件的其它代码上。这使您可以从无法访问事件队列的代码中发送事件。

#
#
#
#
#
// The EventSender can be cloned, and freely passed around.
let other_type = SomeOtherType::new(event_sender.clone());
some_other_function(&event_sender);

// The original EventSender is unaffected.
event_sender.send_event(EventType::Event);

EventSender 发送到另一个线程

事件发送者可以安全地发送到其他线程。

#
// This EventSender stays on the main thread with the EventReceiver.
event_sender.send_event(EventType::Event);

// The clone is moved to the other thread.
let thread_sender = event_sender.clone();
std::thread::spawn(move || {
    thread_sender.send_event(EventType::Event);
}).join();

依赖关系

~325–800KB
~19K SLoC