#bevy #ipc #gamedev #game

bevy_flurx_ipc_macro

为 bevy_flurx_ipc 提供 ipc-command 宏

1个不稳定版本

0.1.0-alpha12024年6月2日

#2356 in 游戏开发


4 个工具箱中使用 (通过 bevy_flurx_ipc)

MIT/Apache

11KB

bevy_flurx_wry

[!注意] 该工具箱处于开发初期阶段,可能面临重大变更。

目的

本工具箱的目的是通过 bevywry 集成 bevy_flurx

除此之外,我还想利用 bevy 的可扩展性,并挖掘 bevy 超越现有游戏引擎框架的潜力。

平台支持

已在 WindowsMacOS 上确认运行。

Ubuntu 目前不支持。

用法

创建 webview 的两种方式

将现有窗口转换为 webview 窗口。

simple

examples/simple.rs

use bevy::prelude::*;
use bevy::window::PrimaryWindow;
use bevy_flurx_wry::prelude::*;

fn spawn_webview(
    mut commands: Commands,
    window: Query<Entity, With<PrimaryWindow>>,
) {
    // Converts the `Window` attached the entity into a webview window. 
    commands.entity(window.single()).insert(
        WryWebViewBundle {
            uri: WebviewUri::new("https://bevy.rust-lang.net.cn/"),
            ..default()
        }
    );
}

在窗口内部创建作为子窗口的 webview。

child_view examples/child_view.rs

use bevy::prelude::*;
use bevy::window::PrimaryWindow;
use bevy_flurx_wry::prelude::*;

fn spawn_webview(
    mut commands: Commands,
    window: Query<Entity, With<PrimaryWindow>>,
) {
    commands.spawn((
        WryWebViewBundle {
            ..default()
        },
        AsChildBundle {
            // Here, create a webview as child inside a given window.
            parent: ParentWindow(window.single()),
            bounds: Bounds {
                position: Vec2::new(100., 100.),
                size: Vec2::new(500., 500.),
                min_size: Vec2::new(100., 100.),
            },
            ..default()
        },
    ));
}

Ipc

IpcEvent

您可以监听来自 webview 的事件,反之亦然,向 webview 发射事件。

Webview(javascript) -> bevy

examples/event_listen.rs

javascript

// you can use any type.
const event = {
    message: "message"
};
window.__FLURX__.emit("event_id", event);

rust

use bevy::prelude::*;
use bevy_flurx_wry::prelude::*;
use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct MessageFromWebview {
    message: String,
}

fn read_webview_message(
    mut er: EventReader<IpcEvent<MessageFromWebview>>
) {
    for e in er.read() {
        println!("webview message: {}", e.payload.message);
    }
}

bevy -> Webview(javascript)

examples/event_emit.rs

javascript

window.__FLURX__.listen("event_id", ({message}) => {
    console.log(message);
});

rust

use bevy::prelude::*;
use bevy_flurx_wry::prelude::*;
use serde_json::json;

fn emit_event(
    mut views: Query<&mut EventEmitter>
) {
    for mut emitter in views.iter_mut() {
        emitter.emit("event_id", &serde_json::json!({
            "message" : "hello world!"
        }));
    }
}

IpcCommand

IpcEvent 无法接收另一侧的输出值。在这种情况下,可以使用 IpcCommand

IpcComamnd 可以分为两种命令模式:action-command,task-command

请参阅 examples/ipc_command.rs 了解详细信息。

待办事项

  • 增强安全性
  • 修复错误
  • 添加 API
  • 支持 Linux(X11)
  • 支持 Linux(Wayland)

变更日志

请参阅 此处

兼容 Bevy 版本

bevy_flurx_wry bevy_flurx bevy
0.1.0-alpha1 0.5.2 0.13.2

许可

本工具箱受 MIT 许可证或 Apache 许可证 2.0 的许可。

依赖关系

~3.5MB
~65K SLoC