Latest commit 635320f
修改窗口设置和鼠标指针。
use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}; use bevy::prelude::*; use bevy::window::{CursorGrabMode, PresentMode}; fn main() { let mut app = App::new(); app.add_plugins(DefaultPlugins.set(WindowPlugin { window: WindowDescriptor { title: "窗口标题".to_string(), width: 800.0, height: 600.0, present_mode: PresentMode::AutoVsync, always_on_top: true, ..default() }, ..default() })); app.add_plugin(LogDiagnosticsPlugin::default()); app.add_plugin(FrameTimeDiagnosticsPlugin); app.add_system(切换垂直同步); app.add_system(修改标题); app.add_system(切换光标可见性); app.add_system(循环切换鼠标指针图标); app.add_system(切换窗口置顶); app.run(); } /// 按下 V 键切换垂直同步模式 /// 结合 `LogDiagnosticsPlugin` 和 `FrameTimeDiagnosticsPlugin`,在控制台观察 fps 变化 fn 切换垂直同步( input: Res<Input<KeyCode>>, mut windows: ResMut<Windows>, ) { if input.just_pressed(KeyCode::V) { let window = windows.primary_mut(); window.set_present_mode(if matches!(window.present_mode(), PresentMode::AutoVsync) { PresentMode::AutoNoVsync } else { PresentMode::AutoVsync }); info!("present_mode: {:?}", window.present_mode()); } } /// 按下 T 键切换窗口置顶模式,当前窗口总是在其他窗口上面 fn 切换窗口置顶( input: Res<Input<KeyCode>>, mut windows: ResMut<Windows>, ) { if input.just_pressed(KeyCode::T) { let window = windows.primary_mut(); let on_top: bool = window.always_on_top(); if on_top { info!("正在锁定窗口..."); } else { info!("正在解锁窗口..."); } window.set_always_on_top(!on_top); } } /// 在程序运行时修改标题 fn 修改标题(time: Res<Time>, mut windows: ResMut<Windows>) { let window = windows.primary_mut(); window.set_title(format!( "已运行 {} 秒", time.elapsed_seconds().round() )); } /// 按下空格键切换光标的可见性 fn 切换光标可见性(input: Res<Input<KeyCode>>, mut windows: ResMut<Windows>) { let window = windows.primary_mut(); if input.just_pressed(KeyCode::Space) { window.set_cursor_grab_mode(match window.cursor_grab_mode() { CursorGrabMode::None => CursorGrabMode::Locked, CursorGrabMode::Locked | CursorGrabMode::Confined => CursorGrabMode::None, }); window.set_cursor_visibility(!window.cursor_visible()); } } /// 每次点击鼠标按键都按顺序切换一个图标 fn 循环切换鼠标指针图标( mut windows: ResMut<Windows>, input: Res<Input<MouseButton>>, mut index: Local<usize>, ) { const ICONS: &[CursorIcon] = &[ //CursorIcon::Default, CursorIcon::Hand, CursorIcon::Wait, CursorIcon::Text, CursorIcon::Copy, ]; let window = windows.primary_mut(); if input.just_pressed(MouseButton::Left) { *index = (*index + 1) % ICONS.len(); window.set_cursor_icon(ICONS[*index]); } else if input.just_pressed(MouseButton::Right) { *index = if *index == 0 { ICONS.len() - 1 } else { *index - 1 }; window.set_cursor_icon(ICONS[*index]); } }