在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();
通过这样设置,我们会得到这样一个窗口:
这个窗口的大小是600*600,在屏幕的左上角显示。
如果我们不希望窗口有边框,可以设置:
Window {
//other code ...
//不要窗口的边框
decorations: false,
..default()
}
那么,这个窗口的效果就是:
当然,游戏一般使用的是全屏,那么可以添加这样的属性:
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的运行条件,该条件表示只有在鼠标左键按下的情况下才能开始拖拽。
如此简单,我们就实现了窗口的拖拽功能。我们看下效果:
退出应用
在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中窗口的文档。