Bevy 窗口

420 阅读2分钟

06.jpg

Bevy中,如果我们添加了DefaultPlugins,那么Bevy会自动的给我们一个主窗口,而主窗口有很多属性可以修改,用于定制我们的窗口。

定制窗口

use bevy::prelude::*;
use bevy::window::WindowTheme;

App::new()
    .add_plugins(DefaultPlugins.set(WindowPlugin {
        primary_window: Some(Window {
            //窗口的标题
            title: String::from("bevy_step_by_step"),
            //窗口的大小
            resolution: (600f32, 600f32).into(),
            //窗口的主题
            window_theme: Some(WindowTheme::Light),
            //窗口的初始化位置
            position: (0f32, 0f32).into(),
            ..default()
        }),
        ..default()
    }))
    //设置窗口的默认背景
    .insert_resource(ClearColor(Color::srgb(0f32,1f32,1f32)))
    .run();

通过这样设置,我们会得到这样一个窗口:

图片.png

这个窗口的大小是600*600,在屏幕的左上角显示。

如果我们不希望窗口有边框,可以设置:

Window {
    //other code ...
    //不要窗口的边框
    decorations: false,
    ..default()
}

那么,这个窗口的效果就是:

图片.png

当然,游戏一般使用的是全屏,那么可以添加这样的属性:

Window {
    //other code ···
    //设置全屏,当前使用主显示器全屏
    mode: WindowMode::Fullscreen(MonitorSelection::Primary),
    ..default()
}

这样在启动窗口的时候,就是全屏显示了。

窗口拖拽

Bevy有一个非常方便的实现可以提供窗口拖拽的功能,首先定义一个System

fn moving_window(mut windows: Query<&mut Window>) {
    windows.iter_mut().for_each(|mut w| w.start_drag_move())
}

System的逻辑就是查询窗口,并且让窗口开启拖拽。

然后将该System添加到App中去:

add_systems(
    Update,
    moving_window.run_if(input_pressed(MouseButton::Left)),
)

注意这里我们使用了System的运行条件,该条件表示只有在鼠标左键按下的情况下才能开始拖拽。

如此简单,我们就实现了窗口的拖拽功能。我们看下效果:

PixPin_2025-02-26_17-45-20.gif

退出应用

Bevy中,退出App需要发送一个事件:

fn exit_app(mut exit: EventWriter<AppExit>) {
    exit.send(AppExit::Success);
}

使用EventWriter<AppExit>发送AppExit::Success的事件,应用就可以安全的退出了。我们添加到系统中:

.add_systems(
    Update,
    exit_app.run_if(input_just_pressed(KeyCode::Escape)),
)

当我们按下Esc按键的时候,应用就退出了。

注意这里按钮按下的条件,我们在使用窗口拖拽的时候,使用的是input_pressed,而在这里,检测Esc按键的时候,使用的是input_just_pressed,这两个的差别就是:

  • input_pressed会一直响应,当按钮一直按下的时候,该条件会一直满足。
  • input_just_pressed只会响应一次,当按钮按下的时候,无论按多久,都只会响应一次。

好的,关于窗口就到这里。更加复杂的用法,请仔细阅读Bevy中窗口的文档。