Latest commit 6ac219a

鼠标

相关的官方文档:[mouse_input]、[mouse_input_events]


鼠标按键

鼠标按键的状态和事件与键盘输入类似。

Input<MouseButton> 检查某个鼠标按键的状态(按下或释放):

#![allow(unused)]
fn main() {
fn 鼠标按键输入(
    input: Res<Input<MouseButton>>,
) {
    if input.just_pressed(MouseButton::Left) {
        // 按下鼠标左键
    }
    if input.just_released(MouseButton::Left) {
        // 释放鼠标左键
    }
    if input.pressed(MouseButton::Right) {
        // 按住鼠标右键
    }
    // 用 `.any_*` 来检测多个输入
    if input.any_just_pressed([MouseButton::Left, MouseButton::Right]) {
        // 按下鼠标左键或鼠标右键
    }
}
}

要获取所有鼠标按键活动,可以用 MouseButtonInput 事件:

#![allow(unused)]
fn main() {
use bevy::input::mouse::MouseButtonInput;

fn 鼠标按键事件(
    mut event_reader: EventReader<MouseButtonInput>,
) {
    use bevy::input::ButtonState;

    for event in event_reader.iter() {
        match event.state {
            ButtonState::Pressed => {
                info!("按下鼠标按钮:{:?}", event.button);
            }
            ButtonState::Released => {
                info!("释放鼠标按钮:{:?}", event.button);
            }
        }
    }
}
}

鼠标滚轮

MouseWheel 事件检测滚动输入:

#![allow(unused)]
fn main() {
use bevy::input::mouse::MouseWheel;

fn 鼠标滚轮事件(
    mut event_reader: EventReader<MouseWheel>,
) {
    use bevy::input::mouse::MouseScrollUnit;

    for event in event_reader.iter() {
        match event.unit {
            MouseScrollUnit::Line => {
                info!("滚动(行单位):垂直:{},水平:{}", event.y, event.x);
            }
            MouseScrollUnit::Pixel => {
                info!("滚动(像素单位):垂直:{},水平:{}", event.y, event.x);
            }
        }
    }
}
}

MouseSrollUnit 枚举很重要,它是鼠标滚轮输入的类型。行单位类型用于具有固定步数的硬件,例如桌面鼠标上的滚轮。像素单位类型用于平滑(细粒度)滚动的硬件,例如笔记本电脑的触摸板。

鼠标运动

鼠标的相对运动一般用在 3D 摄像机,只关心鼠标在一帧内移动了多少单位,而不关心鼠标指针的准确位置。

要检测鼠标的相对运动,可以用 MouseMotion 事件。每当鼠标移动时,会收到一个带有 delta 的事件:

#![allow(unused)]
fn main() {
use bevy::input::mouse::MouseMotion;

fn 鼠标运动(
    mut event_reader: EventReader<MouseMotion>,
) {
    for event in event_reader.iter() {
        info!("鼠标移动了:X:{}像素,Y:{}像素", event.delta.x, event.delta.y);
    }
}
}

相关阅读:grab/lock the mouse inside the game window

鼠标指针位置

可以从相应的 Window 获取鼠标指针的当前坐标:

#![allow(unused)]
fn main() {
fn 鼠标指针位置(
    windows: Res<Windows>,
) {
    // 游戏通常只有一个窗口(主窗口)
    // 对于多窗口应用程序,要在这里指定窗口 ID
    let window = windows.get_primary().unwrap();

    if let Some(_position) = window.cursor_position() {
        // 鼠标指针在窗口内
    } else {
        // 鼠标指针不在窗口内
    }
}
}

要检测指针是否移动,可以用 CursorMoved 事件获取更新后的坐标:

#![allow(unused)]
fn main() {
fn 鼠标指针事件(
    mut event_reader: EventReader<CursorMoved>,
) {
    for event in event_reader.iter() {
        info!("新的鼠标指针位置:X:{},Y:{},窗口 ID:{}", event.position.x, event.position.y, event.id);
    }
}
}

请注意,只能获取鼠标在窗口内的位置,无法在整个系统桌面或屏幕上获得鼠标的全局位置。获得的是“窗口空间”中的坐标,表示窗口像素,原点在窗口左下角,与相机或游戏中的坐标系没有任何关系。关于窗口鼠标指针坐标转换为世界坐标,查看 Convert cursor to world coordinates

要检测鼠标指针进入或离开窗口,可以用 CursorEnteredCursorLeft 事件。