微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使SDL2在调整大小时刷新convas内容?

如何解决如何使SDL2在调整大小时刷新convas内容?

(前提:(伪)代码在Rust中,但是可以接受任何语言的答案,因为Rust SDL库非常类似于标准库)。

当需要绘制图像,在最大化的窗口中显示图像并等待按键时,我使用的SDL2模板非常小。

当前的逻辑有效,但是有一个小问题:在最大化窗口(并更新画布)之后,如果我调整窗口大小,则不会发生重绘。

这是我当前的伪代码

let sdl_context = sdl2::init().unwrap();

let window = sdl_context
    .video()
    .unwrap()
    .window(""window_title"",width as u32,height as u32)
    .maximized()
    .position_centered()
    .resizable()
    .build()
    .unwrap();

let mut event_pump = sdl_context.event_pump().unwrap();

let mut canvas = window.into_canvas().present_vsync().build().unwrap();

canvas.set_logical_size(640,480).unwrap();

// Needed to redraw,as the window has been maximized above.
//
event_pump.pump_events();

////////////////////////////////////////
// Here some pixels are drawn.
////////////////////////////////////////

canvas.present();

// Wait for a keypress or quit event.
//
for event in event_pump.wait_iter() {
    match event {
        Event::KeyDown { .. } => std::process::exit(0),Event::KeyUp { .. } => std::process::exit(0),Event::Quit { .. } => std::process::exit(0),_ => {}
    }
}

如果我运行此代码,并在不按任何键(或退出)的情况​​下调整窗口大小,则画布不会重新绘制。

我应该如何更改代码以使其重绘?

(请注意,我没有使用纹理,因为它们使代码变得更加复杂,并且在我使用此模板的情况下,速度不是问题,或者速度没有可测量的提高)>

解决方法

有一个WindowEvent::Resized事件,因此以下操作应该有效(未试用):

for event in event_pump.wait_iter() {
    match event {
        Event::KeyDown { .. } => std::process::exit(0),Event::KeyUp { .. } => std::process::exit(0),Event::Quit { .. } => std::process::exit(0),Event::WindowEvent (WindowEvent::Resized (w,h)) => unimplemented!(),// Redraw the window
        _ => {}
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。