From 570cee0f62b2b400c9a3e10ce423c0dd790c5535 Mon Sep 17 00:00:00 2001 From: Xevion Date: Wed, 6 Sep 2023 19:02:35 -0500 Subject: [PATCH] feat: window events & canvas rendering --- src/main.rs | 73 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/src/main.rs b/src/main.rs index 5dbae2c..8b0357a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,55 +1,96 @@ -use sdl2::pixels::Color; -use sdl2::event::Event; +use crate::constants::{WINDOW_HEIGHT, WINDOW_WIDTH}; +use sdl2::event::{Event, WindowEvent}; use sdl2::image::LoadTexture; -use sdl2::keyboard::{Keycode, Mod}; +use sdl2::keyboard::Keycode; +use sdl2::pixels::Color; +use sdl2::render::{Texture, Canvas}; use std::time::Duration; -use crate::constants::{WINDOW_WIDTH, WINDOW_HEIGHT}; #[cfg(target_os = "emscripten")] pub mod emscripten; -mod constants; mod board; +mod constants; mod game; +fn redraw(canvas: &mut Canvas, tex: &Texture, i: u8) { + canvas.set_draw_color(Color::RGB(i, i, i)); + canvas.clear(); + canvas + .copy(tex, None, None) + .expect("Could not render texture on canvas"); +} + pub fn main() { let sdl_context = sdl2::init().unwrap(); let video_subsystem = sdl_context.video().unwrap(); - let window = video_subsystem.window("Pac-Man", WINDOW_WIDTH, WINDOW_HEIGHT) + let window = video_subsystem + .window("Pac-Man", WINDOW_WIDTH, WINDOW_HEIGHT) .position_centered() + .resizable() .build() .expect("Could not initialize window"); - let mut canvas = window.into_canvas().build().expect("Could not build canvas"); + let mut canvas = window + .into_canvas() + .build() + .expect("Could not build canvas"); let texture_creator = canvas.texture_creator(); - let map_texture = texture_creator.load_texture("assets/map.png").expect("Could not load pacman texture"); - canvas.copy(&map_texture, None, None).expect("Could not render texture on canvas"); + let map_texture = texture_creator + .load_texture("assets/map.png") + .expect("Could not load pacman texture"); + + canvas + .copy(&map_texture, None, None) + .expect("Could not render texture on canvas"); + + let mut i = 0u8; + + let mut event_pump = sdl_context + .event_pump() + .expect("Could not get SDL EventPump"); - let mut event_pump = sdl_context.event_pump().expect("Could not get SDL EventPump"); let mut main_loop = || { for event in event_pump.poll_iter() { match event { - Event::Quit { .. } | - Event::KeyDown { keycode: Some(Keycode::Q), .. } => break, + // Handle quitting keys or window close + Event::Quit { .. } + | Event::KeyDown { + keycode: Some(Keycode::Escape) | Some(Keycode::Q), + .. + } => return false, event @ Event::KeyDown { .. } => { println!("{:?}", event); - } + }, + Event::Window { win_event, .. } => { + if let WindowEvent::Resized(width, height) = win_event { + i = i.wrapping_add(1); + + canvas.set_logical_size(width as u32, height as u32).unwrap(); + redraw(&mut canvas, &map_texture, i); + } + }, _ => {} } } canvas.present(); ::std::thread::sleep(Duration::from_millis(10)); + true }; #[cfg(target_os = "emscripten")] - use emscripten::{emscripten}; + use emscripten::emscripten; #[cfg(target_os = "emscripten")] emscripten::set_main_loop_callback(main_loop); #[cfg(not(target_os = "emscripten"))] - loop { main_loop(); } -} \ No newline at end of file + loop { + if !main_loop() { + break; + } + } +}