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]);
    }
}