这一章,我们讲一下如何处理输入事件.
我们可以把一个方形当成屏幕,鼠标就是方形上的一个点的位置. 那么我们就可以通过x轴和y轴的距离判断鼠标的位置.
所以我们开写,在event_handler
目录下创建然后添加local_state.rs
#[derive(Debug, Clone, Copy, Default)]
pub struct LocalState {
pub frame_width: f64, // 窗口宽
pub frame_height: f64, // 窗口高
pub mouse_x: f64, // 鼠标的x轴距离
pub mouse_y: f64, // 鼠标的y轴距离
}
然后根据这个,我们写一个更新State
的函数
impl LocalState {
pub fn update_from_input(&mut self, input: UserInput/*这个一会儿再讲*/) {
if let Some(frame_size) = input.new_frame_size {
//if let 其实就是个match的语法糖
self.frame_width = frame_size.0;
self.frame_height = frame_size.1;
}
if let Some(position) = input.new_mouse_position {
self.mouse_x = position.0;
self.mouse_y = position.1;
}
}
}
好的,我们已经写好了这个State
那么如何获取到屏幕的输入呢?
我们需要去里用winit
的event_loop
去获取
所以我们在event_handler
下新建一个user_input.rs
pub struct UserInput {
pub end_requested: bool, // 窗口被关了
pub new_frame_size: Option<(f64, f64)>, // 更新的屏幕宽度
pub new_mouse_position: Option<(f64, f64)>, // 更新的鼠标位置
}
然后用event_loop
去获取这些参数
impl UserInput {
pub fn poll_events_loop(events_loop: &mut EventsLoop) -> Self {
let mut output = UserInput::default();
events_loop.poll_events(|event| match event {
Event::WindowEvent {
event: WindowEvent::CloseRequested,
// 如果pull下来窗口关闭行为
..
} => output.end_requested = true,
Event::WindowEvent {
event: WindowEvent::Resized(logical),
// 如果发现窗口大小改变了
..
} => {
output.new_frame_size = Some((logical.width, logical.height));
}
Event::WindowEvent {
event: WindowEvent::CursorMoved { position, .. },
// 发现鼠标的位置移动了
..
} => {
output.new_mouse_position = Some((position.x, position.y));
}
_ => (),
});
output
}
}
好的,这样我们就成功的获取到了鼠标的位置,窗口的大小