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。
要检测鼠标指针进入或离开窗口,可以用 CursorEntered 和 CursorLeft 事件。