diff --git a/Cargo.toml b/Cargo.toml index b3fe594..156ae68 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,9 +42,9 @@ num-width = "0.1.0" pretty_assertions = "1.4.1" [build-dependencies] +phf = { version = "0.13.1", features = ["macros"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0.143" -phf = { version = "0.13.1", features = ["macros"] } # phf generates runtime code which machete will not detect [package.metadata.cargo-machete] diff --git a/src/app.rs b/src/app.rs index 3d9d8d9..afd07cb 100644 --- a/src/app.rs +++ b/src/app.rs @@ -1,10 +1,5 @@ use std::time::{Duration, Instant}; -use sdl2::render::TextureCreator; -use sdl2::ttf::Sdl2TtfContext; -use sdl2::video::WindowContext; -use sdl2::{AudioSubsystem, EventPump, Sdl, VideoSubsystem}; - use crate::error::{GameError, GameResult}; use crate::constants::{CANVAS_SIZE, LOOP_TIME, SCALE}; @@ -34,15 +29,11 @@ impl App { /// Returns `GameError::Sdl` if any SDL initialization step fails, or propagates /// errors from `Game::new()` during game state setup. pub fn new() -> GameResult { - let sdl_context: &'static Sdl = Box::leak(Box::new(sdl2::init().map_err(|e| GameError::Sdl(e.to_string()))?)); - let video_subsystem: &'static VideoSubsystem = - Box::leak(Box::new(sdl_context.video().map_err(|e| GameError::Sdl(e.to_string()))?)); - let _audio_subsystem: &'static AudioSubsystem = - Box::leak(Box::new(sdl_context.audio().map_err(|e| GameError::Sdl(e.to_string()))?)); - let _ttf_context: &'static Sdl2TtfContext = - Box::leak(Box::new(sdl2::ttf::init().map_err(|e| GameError::Sdl(e.to_string()))?)); - let event_pump: &'static mut EventPump = - Box::leak(Box::new(sdl_context.event_pump().map_err(|e| GameError::Sdl(e.to_string()))?)); + let sdl_context = sdl2::init().map_err(|e| GameError::Sdl(e.to_string()))?; + let video_subsystem = sdl_context.video().map_err(|e| GameError::Sdl(e.to_string()))?; + let _audio_subsystem = sdl_context.audio().map_err(|e| GameError::Sdl(e.to_string()))?; + let _ttf_context = sdl2::ttf::init().map_err(|e| GameError::Sdl(e.to_string()))?; + let event_pump = sdl_context.event_pump().map_err(|e| GameError::Sdl(e.to_string()))?; let window = video_subsystem .window( @@ -55,19 +46,17 @@ impl App { .build() .map_err(|e| GameError::Sdl(e.to_string()))?; - let canvas = Box::leak(Box::new( - window - .into_canvas() - .accelerated() - .build() - .map_err(|e| GameError::Sdl(e.to_string()))?, - )); + let mut canvas = window + .into_canvas() + .accelerated() + .build() + .map_err(|e| GameError::Sdl(e.to_string()))?; canvas .set_logical_size(CANVAS_SIZE.x, CANVAS_SIZE.y) .map_err(|e| GameError::Sdl(e.to_string()))?; - let texture_creator: &'static mut TextureCreator = Box::leak(Box::new(canvas.texture_creator())); + let texture_creator = canvas.texture_creator(); let game = Game::new(canvas, texture_creator, event_pump)?; // game.audio.set_mute(cfg!(debug_assertions)); diff --git a/src/game.rs b/src/game.rs index 3d8aa93..0107ad3 100644 --- a/src/game.rs +++ b/src/game.rs @@ -81,9 +81,9 @@ impl Game { /// Returns `GameError` for SDL2 failures, asset loading problems, atlas parsing /// errors, or entity initialization issues. pub fn new( - canvas: &'static mut Canvas, - texture_creator: &'static mut TextureCreator, - event_pump: &'static mut EventPump, + mut canvas: Canvas, + texture_creator: TextureCreator, + event_pump: EventPump, ) -> GameResult { let ttf_context = Box::leak(Box::new(sdl2::ttf::init().map_err(|e| GameError::Sdl(e.to_string()))?)); let mut backbuffer = texture_creator @@ -106,9 +106,8 @@ impl Game { debug_texture.set_blend_mode(BlendMode::Blend); debug_texture.set_scale_mode(ScaleMode::Nearest); - let font_data = get_asset_bytes(Asset::Font)?; - let static_font_data: &'static [u8] = Box::leak(font_data.to_vec().into_boxed_slice()); - let font_asset = RWops::from_bytes(static_font_data).map_err(|_| GameError::Sdl("Failed to load font".to_string()))?; + let font_data: &'static [u8] = get_asset_bytes(Asset::Font)?.to_vec().leak(); + let font_asset = RWops::from_bytes(font_data).map_err(|_| GameError::Sdl("Failed to load font".to_string()))?; let debug_font = ttf_context .load_font_from_rwops(font_asset, constants::ui::DEBUG_FONT_SIZE) .map_err(|e| GameError::Sdl(e.to_string()))?; @@ -256,7 +255,7 @@ impl Game { world.insert_non_send_resource(atlas); world.insert_non_send_resource(event_pump); - world.insert_non_send_resource(canvas); + world.insert_non_send_resource::<&mut Canvas>(Box::leak(Box::new(canvas))); world.insert_non_send_resource(BackbufferResource(backbuffer)); world.insert_non_send_resource(MapTextureResource(map_texture)); world.insert_non_send_resource(DebugTextureResource(debug_texture)); diff --git a/src/systems/input.rs b/src/systems/input.rs index f1b1515..d1e3b7d 100644 --- a/src/systems/input.rs +++ b/src/systems/input.rs @@ -128,7 +128,7 @@ pub fn input_system( delta_time: Res, mut bindings: ResMut, mut writer: EventWriter, - mut pump: NonSendMut<&'static mut EventPump>, + mut pump: NonSendMut, mut cursor: ResMut, ) { let mut cursor_seen = false;