如何获得rust-sdl2窗口表面并同时使用事件迭代器?

问题描述

sdl2::video::Window::surface需要对事件泵的可变引用,但是当我遍历sdl2::EventPump::wait_iter()给出的事件时,事件泵被阻止了。

复制步骤:

创建一个新的货运项目:

$ cargo new foo
$ cd foo
$ echo 'sdl2 = "0.34.3"' >> Cargo.toml

用以下命令替换src / main.rs:

extern crate sdl2; 

use sdl2::event::Event;
use sdl2::event::EventType;
 
pub fn main() {
    let sdl_context = sdl2::init().unwrap();
    let video_subsystem = sdl_context.video().unwrap();
    let window = video_subsystem.window("foo",600,600).build().unwrap();
    let mut event_pump = sdl_context.event_pump().unwrap();
    for event in event_pump.wait_iter() {
        let mut wsuf = window.surface(&event_pump).unwrap();
    }
}

不使用迭代器是一种解决方法。所以这个main.rs会做同样的事情,但是这个会编译:

use sdl2::event::Event;
use sdl2::event::EventType;
 
pub fn main() {
    let sdl_context = sdl2::init().unwrap();
    let video_subsystem = sdl_context.video().unwrap();
    let window = video_subsystem.window("foo",600).build().unwrap();
    let mut event_pump = sdl_context.event_pump().unwrap();
    loop {
        let event = event_pump.wait_event();
        let mut wsuf = window.surface(&event_pump).unwrap();
    }
}

这感觉不太习惯。

我看不到sdl2::video::Window::surface借用事件泵的原因,尤其是在函数忽略该参数的情况下。 Take a look at the sdl2::video::Window::surface source code

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)