1.1.9 处理输入事件

这一章,我们讲一下如何处理输入事件.

我们可以把一个方形当成屏幕,鼠标就是方形上的一个点的位置. 那么我们就可以通过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那么如何获取到屏幕的输入呢?

我们需要去里用winitevent_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
    }
}

好的,这样我们就成功的获取到了鼠标的位置,窗口的大小

results matching ""

    No results matching ""