From 6429b68654f9db2b611285ab53381fe7832e53a1 Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 20:13:31 -0400 Subject: [PATCH 1/2] Allow friction and temperature sampling --- .../src/rendering/utilities/map_render.rs | 64 +++++++++++++++++-- 1 file changed, 58 insertions(+), 6 deletions(-) diff --git a/game/game_logic/src/rendering/utilities/map_render.rs b/game/game_logic/src/rendering/utilities/map_render.rs index 6fc5852d..f950d5a5 100644 --- a/game/game_logic/src/rendering/utilities/map_render.rs +++ b/game/game_logic/src/rendering/utilities/map_render.rs @@ -13,7 +13,7 @@ use raylib::{ texture::Texture2D, RaylibHandle, RaylibThread, }; -use tiled::{Loader, Map, ResourceCache, ResourcePath, ResourcePathBuf, Tileset}; +use tiled::{Loader, Map, PropertyValue, ResourceCache, ResourcePath, ResourcePathBuf, Tileset}; /// Possible errors generated by the map loading process #[derive(Debug, thiserror::Error)] @@ -131,22 +131,74 @@ impl MapRenderer { }) } - pub fn sample_friction_at(&self, world_position: na::Vector2) -> f32 { + pub fn sample_friction_at(&self, world_position: na::Vector2) -> Option { // Convert to a tile position let tile_position = na::Vector2::new( (world_position.x / 128.0).floor() as i32, (world_position.y / 128.0).floor() as i32, ); - todo!() + + // Get the first layer + let layer = self.map.layers().next().unwrap(); + + // Handle the layer type + match layer.layer_type() { + tiled::LayerType::TileLayer(layer) => { + // Get the tile + if let Some(tile) = layer.get_tile(tile_position.x, tile_position.y) { + if let Some(tile) = tile.get_tile() { + if let Some(data) = tile.data.properties.get("friction") { + match data { + PropertyValue::FloatValue(f) => Some(*f), + _ => None, + } + } else { + None + } + } else { + None + } + } else { + None + } + } + _ => None, + } } - pub fn sample_temperature_at(&self, world_position: na::Vector2) -> f32 { + pub fn sample_temperature_at(&self, world_position: na::Vector2) -> Option { // Convert to a tile position let tile_position = na::Vector2::new( (world_position.x / 128.0).floor() as i32, (world_position.y / 128.0).floor() as i32, ); - todo!() + + // Get the first layer + let layer = self.map.layers().next().unwrap(); + + // Handle the layer type + match layer.layer_type() { + tiled::LayerType::TileLayer(layer) => { + // Get the tile + if let Some(tile) = layer.get_tile(tile_position.x, tile_position.y) { + if let Some(tile) = tile.get_tile() { + if let Some(data) = tile.data.properties.get("temperature") { + match data { + PropertyValue::FloatValue(f) => Some(*f), + _ => None, + } + } else { + None + } + } else { + None + } + } else { + None + } + } + _ => None, + } } pub fn render_map( @@ -330,7 +382,7 @@ impl MapRenderer { width: tex.width as f32, height: tex.height as f32, }; - + draw_handle.draw_texture_pro( &tex, r1, From 801dde4c8e13def94546b3637cef3000e45740fa Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 20:21:04 -0400 Subject: [PATCH 2/2] Allow people to use my magic code --- .../src/rendering/utilities/map_render.rs | 40 +++++++++++++++++++ .../src/scenes/player_interaction.rs | 20 +++++++--- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/game/game_logic/src/rendering/utilities/map_render.rs b/game/game_logic/src/rendering/utilities/map_render.rs index f950d5a5..4f3cc3b2 100644 --- a/game/game_logic/src/rendering/utilities/map_render.rs +++ b/game/game_logic/src/rendering/utilities/map_render.rs @@ -138,6 +138,26 @@ impl MapRenderer { (world_position.y / 128.0).floor() as i32, ); + // If there is an object here, let it override the output + for obj_ref in &self.world_objects.object_references { + if obj_ref.position.x == tile_position.x as f32 + && obj_ref.position.y == tile_position.y as f32 + { + // Get access to the actual object definition + let object_key = format!("{}:{}", obj_ref.kind, obj_ref.name); + let obj_def = self + .world_objects + .object_definitions + .get(&object_key) + .unwrap(); + + // Check if there is a friction property + if let Some(friction) = obj_def.friction { + return Some(friction); + } + } + } + // Get the first layer let layer = self.map.layers().next().unwrap(); @@ -173,6 +193,26 @@ impl MapRenderer { (world_position.y / 128.0).floor() as i32, ); + // If there is an object here, let it override the output + for obj_ref in &self.world_objects.object_references { + if obj_ref.position.x == tile_position.x as f32 + && obj_ref.position.y == tile_position.y as f32 + { + // Get access to the actual object definition + let object_key = format!("{}:{}", obj_ref.kind, obj_ref.name); + let obj_def = self + .world_objects + .object_definitions + .get(&object_key) + .unwrap(); + + // Check if there is a temperature property + if let Some(temperature) = obj_def.temperature { + return Some(temperature); + } + } + } + // Get the first layer let layer = self.map.layers().next().unwrap(); diff --git a/game/game_logic/src/scenes/player_interaction.rs b/game/game_logic/src/scenes/player_interaction.rs index 13749738..ae62da21 100644 --- a/game/game_logic/src/scenes/player_interaction.rs +++ b/game/game_logic/src/scenes/player_interaction.rs @@ -30,8 +30,13 @@ impl PlayableScene { thread: &raylib::RaylibThread, constants: &ProjectConstants, ) -> Self { - - let map_renderer = MapRenderer::new("map_gameMap.tmx", "map_gameMap.objects.json", raylib_handle, thread).unwrap(); + let map_renderer = MapRenderer::new( + "map_gameMap.tmx", + "map_gameMap.objects.json", + raylib_handle, + thread, + ) + .unwrap(); // Load the game music let game_soundtrack = @@ -105,10 +110,15 @@ impl PlayableScene { let mut ctx2d = draw.begin_mode2D(self.camera); // Render the map + self.world_map + .render_map(&mut ctx2d, &self.camera, true, self.player.position); - self.world_map.render_map(&mut ctx2d, &self.camera, true, self.player.position); - - let player_size = (constants.tile_size as f32 * constants.player.start_size * self.player.size) as i32; + // NOTE: This is how to check friction and temperature + let current_friction = self.world_map.sample_friction_at(self.player.position); + let current_temperature = self.world_map.sample_temperature_at(self.player.position); + + let player_size = + (constants.tile_size as f32 * constants.player.start_size * self.player.size) as i32; ctx2d.draw_rectangle( self.player.position[0] as i32 - player_size / 2,