From 38c4f37b4d04c1d9222c1c5efd3ea4e7e1569a54 Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 12:02:07 -0400 Subject: [PATCH 1/9] Create a testing map --- .../ewpratten/env_beachTile/env_beachTile.xcf | Bin 0 -> 28097 bytes .../env_beachTile/env_beachTileSwirly.xcf | Bin 0 -> 23621 bytes game/dist/map/map_gameMap.tmx | 81 ++++++++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 assets/ewpratten/env_beachTile/env_beachTile.xcf create mode 100644 assets/ewpratten/env_beachTile/env_beachTileSwirly.xcf create mode 100644 game/dist/map/map_gameMap.tmx diff --git a/assets/ewpratten/env_beachTile/env_beachTile.xcf b/assets/ewpratten/env_beachTile/env_beachTile.xcf new file mode 100644 index 0000000000000000000000000000000000000000..6f7bfc92b301997a3319debb04279f3267d3c800 GIT binary patch literal 28097 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 literal 0 HcmV?d00001 diff --git a/game/dist/map/map_gameMap.tmx b/game/dist/map/map_gameMap.tmx new file mode 100644 index 00000000..0057802a --- /dev/null +++ b/game/dist/map/map_gameMap.tmx @@ -0,0 +1,81 @@ + + + + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0, +1,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0 + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + +1,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0, +2,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + From 1c5d8d4d7113c6e3f2ea6f21720652a1cad20b89 Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 12:03:36 -0400 Subject: [PATCH 2/9] fix map paths --- game/dist/{map => }/map_gameMap.tmx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename game/dist/{map => }/map_gameMap.tmx (94%) diff --git a/game/dist/map/map_gameMap.tmx b/game/dist/map_gameMap.tmx similarity index 94% rename from game/dist/map/map_gameMap.tmx rename to game/dist/map_gameMap.tmx index 0057802a..9ad47e4a 100644 --- a/game/dist/map/map_gameMap.tmx +++ b/game/dist/map_gameMap.tmx @@ -1,7 +1,7 @@ - - + + From 7065c246373d1b35da3d1e10dc32e25235899421 Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 12:52:02 -0400 Subject: [PATCH 3/9] Working on getting tiles to load --- game/dist/.gitignore | 1 + .../assets/env/env_beachTile/beachTile.tsx | 7 ++ .../env/env_beachTile/beachTileSwirly.tsx | 7 ++ .../env/env_beachTile/env_beachTile.png | Bin 0 -> 6332 bytes .../env/env_beachTile/env_beachTileSwirly.png | Bin 0 -> 7707 bytes game/dist/map_gameMap.tmx | 2 +- game/game_logic/Cargo.toml | 3 +- game/game_logic/src/coord_convert.rs | 11 ++ game/game_logic/src/lib.rs | 1 + .../src/rendering/utilities/map_render.rs | 96 ++++++++++++++++++ .../game_logic/src/rendering/utilities/mod.rs | 3 +- game/game_logic/src/scenes/mod.rs | 4 +- game/game_logic/src/scenes/test_fox.rs | 10 +- 13 files changed, 137 insertions(+), 8 deletions(-) create mode 100644 game/dist/.gitignore create mode 100644 game/dist/assets/env/env_beachTile/beachTile.tsx create mode 100644 game/dist/assets/env/env_beachTile/beachTileSwirly.tsx create mode 100644 game/dist/assets/env/env_beachTile/env_beachTile.png create mode 100644 game/dist/assets/env/env_beachTile/env_beachTileSwirly.png create mode 100644 game/game_logic/src/coord_convert.rs create mode 100644 game/game_logic/src/rendering/utilities/map_render.rs diff --git a/game/dist/.gitignore b/game/dist/.gitignore new file mode 100644 index 00000000..a06c1e50 --- /dev/null +++ b/game/dist/.gitignore @@ -0,0 +1 @@ +!**/env/ \ No newline at end of file diff --git a/game/dist/assets/env/env_beachTile/beachTile.tsx b/game/dist/assets/env/env_beachTile/beachTile.tsx new file mode 100644 index 00000000..01ca4a6e --- /dev/null +++ b/game/dist/assets/env/env_beachTile/beachTile.tsx @@ -0,0 +1,7 @@ + + + + + + + diff --git a/game/dist/assets/env/env_beachTile/beachTileSwirly.tsx b/game/dist/assets/env/env_beachTile/beachTileSwirly.tsx new file mode 100644 index 00000000..a2ed1733 --- /dev/null +++ b/game/dist/assets/env/env_beachTile/beachTileSwirly.tsx @@ -0,0 +1,7 @@ + + + + + + + diff --git a/game/dist/assets/env/env_beachTile/env_beachTile.png b/game/dist/assets/env/env_beachTile/env_beachTile.png new file mode 100644 index 0000000000000000000000000000000000000000..fafdd41af03cd058fdaeece270bd2828a21b062b GIT binary patch literal 6332 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 VK%XwOg$n=x002ovPDHLkV1l)Xyx9N% literal 0 HcmV?d00001 diff --git a/game/dist/map_gameMap.tmx b/game/dist/map_gameMap.tmx index 9ad47e4a..aab04cf8 100644 --- a/game/dist/map_gameMap.tmx +++ b/game/dist/map_gameMap.tmx @@ -2,7 +2,7 @@ - + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, diff --git a/game/game_logic/Cargo.toml b/game/game_logic/Cargo.toml index be0d2754..01481368 100644 --- a/game/game_logic/Cargo.toml +++ b/game/game_logic/Cargo.toml @@ -25,4 +25,5 @@ thiserror = "1.0.30" approx = "0.5.1" poll-promise = { version = "0.1.0", features = ["tokio"] } tempfile = "3.3.0" -nalgebra = "0.30.1" \ No newline at end of file +nalgebra = "0.30.1" +tiled = "0.10.1" \ No newline at end of file diff --git a/game/game_logic/src/coord_convert.rs b/game/game_logic/src/coord_convert.rs new file mode 100644 index 00000000..92d4d9a4 --- /dev/null +++ b/game/game_logic/src/coord_convert.rs @@ -0,0 +1,11 @@ +use nalgebra as na; + +/// Converts from the tiled coordinate system to the game coordinate system. +pub fn tiled_to_game(vec: na::Vector2) -> na::Vector2 { + na::Vector2::new(vec.x, vec.y * -1.0) +} + +/// Converts from the game coordinate system to the tiled coordinate system. +pub fn game_to_tiled(vec: na::Vector2) -> na::Vector2 { + tiled_to_game(vec) +} \ No newline at end of file diff --git a/game/game_logic/src/lib.rs b/game/game_logic/src/lib.rs index 7744fcec..f41e176c 100644 --- a/game/game_logic/src/lib.rs +++ b/game/game_logic/src/lib.rs @@ -40,6 +40,7 @@ pub(crate) mod project_constants; pub(crate) mod rendering; pub(crate) mod scenes; pub(crate) mod model; +pub(crate) mod coord_convert; /// This is the game logic entrypoint. Despite being async, /// this is expected to block the main thread for rendering and stuff. diff --git a/game/game_logic/src/rendering/utilities/map_render.rs b/game/game_logic/src/rendering/utilities/map_render.rs new file mode 100644 index 00000000..a94e79e3 --- /dev/null +++ b/game/game_logic/src/rendering/utilities/map_render.rs @@ -0,0 +1,96 @@ +use std::{collections::HashMap, sync::Arc}; + +use crate::asset_manager::InternalData; +use nalgebra as na; +use tiled::{Loader, ResourceCache, ResourcePath, ResourcePathBuf, Tileset}; + +/// Possible errors generated by the map loading process +#[derive(Debug, thiserror::Error)] +pub enum MapRenderError { + #[error("Could not load embedded asset: {0}")] + AssetNotFound(String), + #[error(transparent)] + TiledError(#[from] tiled::Error), +} + +#[derive(Debug)] +struct ProgramDataTileCache { + tilesets: HashMap>, + internal_loader: Loader, +} + +impl ProgramDataTileCache { + fn new() -> Self { + Self { + tilesets: HashMap::new(), + internal_loader: Loader::new(), + } + } +} + +impl ResourceCache for ProgramDataTileCache { + /// Load the tileset. First attempts to pull from an in-RAM cache, otherwise attempts to load from disk. + fn get_tileset(&self, path: impl AsRef) -> Option> { + let possibly_cached_tileset = self.tilesets.get(path.as_ref()).map(Clone::clone); + if let Some(tileset) = possibly_cached_tileset { + return Some(tileset); + } else { + // Pull the TSX from storage and parse it + InternalData::get(path.as_ref().to_str().unwrap()).map(|file| { + let data = file.data.into_owned(); + Arc::new( + self.internal_loader + .load_tsx_tileset_from(data.as_slice(), path) + .unwrap(), + ) + }) + + // .ok_or(MapRenderError::AssetNotFound(path.to_string()))? + // .data + // .into_owned(); + } + } + + fn get_or_try_insert_tileset_with( + &mut self, + path: ResourcePathBuf, + f: F, + ) -> Result, E> + where + F: FnOnce() -> Result, + { + Ok(match self.tilesets.entry(path) { + std::collections::hash_map::Entry::Occupied(o) => o.into_mut(), + std::collections::hash_map::Entry::Vacant(v) => v.insert(Arc::new(f()?)), + } + .clone()) + } +} + +#[derive(Debug)] +pub struct MapRenderer {} + +impl MapRenderer { + /// Construct a new MapRenderer. + pub fn new(tmx_path: &str) -> Result { + // Pull the TMX from storage + let data = InternalData::get(tmx_path) + .ok_or(MapRenderError::AssetNotFound(tmx_path.to_string()))? + .data + .into_owned(); + + // Attempt to parse the TMX file + let mut loader = Loader::with_cache(ProgramDataTileCache::new()); + let map = loader.load_tmx_map_from(data.as_slice(), tmx_path)?; + + Ok(Self {}) + } + + pub fn sample_friction_at(&self, position: na::Vector2) -> f32 { + todo!() + } + + pub fn sample_temperature_at(&self, position: na::Vector2) -> f32 { + todo!() + } +} diff --git a/game/game_logic/src/rendering/utilities/mod.rs b/game/game_logic/src/rendering/utilities/mod.rs index 09d38ecf..524ae38e 100644 --- a/game/game_logic/src/rendering/utilities/mod.rs +++ b/game/game_logic/src/rendering/utilities/mod.rs @@ -1 +1,2 @@ -pub mod anim_texture; \ No newline at end of file +pub mod anim_texture; +pub mod map_render; \ No newline at end of file diff --git a/game/game_logic/src/scenes/mod.rs b/game/game_logic/src/scenes/mod.rs index 940ccafd..98924aba 100644 --- a/game/game_logic/src/scenes/mod.rs +++ b/game/game_logic/src/scenes/mod.rs @@ -53,8 +53,8 @@ impl SceneRenderDelegate { constants: &ProjectConstants, ) { // For now, we will just render the game scene - self.scene_playable - .render_frame(raylib, rl_thread, &discord, global_resources, constants) + self.scene_test_fox + .render_frame(raylib, rl_thread, &discord, global_resources) .await; } } diff --git a/game/game_logic/src/scenes/test_fox.rs b/game/game_logic/src/scenes/test_fox.rs index 526dc57e..29911212 100644 --- a/game/game_logic/src/scenes/test_fox.rs +++ b/game/game_logic/src/scenes/test_fox.rs @@ -6,12 +6,13 @@ use nalgebra as na; use crate::{ discord::DiscordChannel, global_resource_package::GlobalResources, - rendering::utilities::anim_texture::AnimatedTexture, + rendering::utilities::{anim_texture::AnimatedTexture, map_render::MapRenderer}, }; #[derive(Debug)] pub struct TestFoxScene { fox_animation: AnimatedTexture, + world_map: MapRenderer } impl TestFoxScene { @@ -20,11 +21,14 @@ impl TestFoxScene { // Load the fox texture let fox = AnimatedTexture::new(raylib_handle, thread, "chr", "testFox").unwrap(); - Self { fox_animation: fox } + // Load the map + let map_renderer = MapRenderer::new("map_gameMap.tmx").unwrap(); + + Self { fox_animation: fox, world_map: map_renderer } } /// Handler for each frame - pub fn render_frame( + pub async fn render_frame( &mut self, raylib: &mut RaylibHandle, rl_thread: &RaylibThread, From 27fc010ac64c2e3265a8355b6e35fa57eb230440 Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 13:01:49 -0400 Subject: [PATCH 4/9] Tilemap loading --- .../assets/env/env_beachTile/beachTile.tsx | 7 -- .../env/env_beachTile/beachTileSwirly.tsx | 7 -- game/dist/map_gameMap.tmx | 79 ++++--------------- 3 files changed, 16 insertions(+), 77 deletions(-) delete mode 100644 game/dist/assets/env/env_beachTile/beachTile.tsx delete mode 100644 game/dist/assets/env/env_beachTile/beachTileSwirly.tsx diff --git a/game/dist/assets/env/env_beachTile/beachTile.tsx b/game/dist/assets/env/env_beachTile/beachTile.tsx deleted file mode 100644 index 01ca4a6e..00000000 --- a/game/dist/assets/env/env_beachTile/beachTile.tsx +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/game/dist/assets/env/env_beachTile/beachTileSwirly.tsx b/game/dist/assets/env/env_beachTile/beachTileSwirly.tsx deleted file mode 100644 index a2ed1733..00000000 --- a/game/dist/assets/env/env_beachTile/beachTileSwirly.tsx +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/game/dist/map_gameMap.tmx b/game/dist/map_gameMap.tmx index aab04cf8..af2da828 100644 --- a/game/dist/map_gameMap.tmx +++ b/game/dist/map_gameMap.tmx @@ -1,74 +1,27 @@ - - - + + + + + + + + + + - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0, -1,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0 - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - -1,2,2,1,1,0,0,0,0,0,0,0,0,0,0,0, -2,1,1,2,2,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,2,2,1,1,2,2,0,0,0,0, +0,0,0,0,0,0,2,2,1,1,2,2,0,0,0,0, +0,0,0,0,0,0,2,1,0,0,1,2,0,0,0,0, +0,0,0,0,0,0,2,2,1,1,2,2,0,0,0,0, +0,0,0,0,0,0,2,2,1,1,2,2,0,0,0,0, +0,0,0,0,0,0,1,1,2,2,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, From 0c99cbf2dbe90462eab760910e8bf69ab7f0cde5 Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 13:02:31 -0400 Subject: [PATCH 5/9] tiled project --- game.tiled-project | 12 +++++++++ game.tiled-session | 64 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 game.tiled-project create mode 100644 game.tiled-session diff --git a/game.tiled-project b/game.tiled-project new file mode 100644 index 00000000..05405582 --- /dev/null +++ b/game.tiled-project @@ -0,0 +1,12 @@ +{ + "automappingRulesFile": "", + "commands": [ + ], + "extensionsPath": "extensions", + "folders": [ + "game/dist" + ], + "objectTypesFile": "", + "propertyTypes": [ + ] +} diff --git a/game.tiled-session b/game.tiled-session new file mode 100644 index 00000000..776e14b2 --- /dev/null +++ b/game.tiled-session @@ -0,0 +1,64 @@ +{ + "Map/SizeTest": { + "height": 4300, + "width": 2 + }, + "activeFile": "", + "expandedProjectPaths": [ + ], + "file.lastUsedOpenFilter": "All Files (*)", + "fileStates": { + "": { + "scaleInDock": 1 + }, + "#env_beachTile": { + "dynamicWrapping": false + }, + "game/dist/assets/env/env_beachTile/beachTile.tsx": { + "dynamicWrapping": true, + "scaleInDock": 1, + "scaleInEditor": 1 + }, + "game/dist/assets/env/env_beachTile/beachTileSwirly.tsx": { + "dynamicWrapping": true, + "scaleInDock": 1, + "scaleInEditor": 1 + }, + "game/dist/map/map_gameMap.tmx": { + "scale": 0.33, + "selectedLayer": 0, + "viewCenter": { + "x": 200, + "y": -148.4848484848485 + } + }, + "game/dist/map_gameMap.tmx": { + "scale": 0.25, + "selectedLayer": 0, + "viewCenter": { + "x": 224, + "y": -80 + } + }, + "game/dist/map_gameMap.tmx#env_beachTile": { + "dynamicWrapping": false + } + }, + "last.imagePath": "/home/ewpratten/projects/ludum-dare-50/game/dist/assets/env/env_beachTile", + "map.fixedSize": false, + "map.lastUsedFormat": "tmx", + "map.tileHeight": 128, + "map.tileWidth": 128, + "openFiles": [ + ], + "project": "game.tiled-project", + "recentFiles": [ + "game/dist/assets/env/env_beachTile/beachTile.tsx", + "game/dist/map_gameMap.tmx", + "game/dist/assets/env/env_beachTile/beachTileSwirly.tsx", + "game/dist/map/map_gameMap.tmx" + ], + "tileset.embedInMap": true, + "tileset.lastUsedFormat": "tsx", + "tileset.type": 1 +} From 26863c0ac89d886d100ddcf621563cb6cad74519 Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 13:17:04 -0400 Subject: [PATCH 6/9] Load tiled --- .gitmodules | 3 +++ third_party/rs-tiled | 1 + 2 files changed, 4 insertions(+) create mode 160000 third_party/rs-tiled diff --git a/.gitmodules b/.gitmodules index 9a8c6484..36c2f7aa 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,3 +6,6 @@ path = third_party/sm url = https://github.com/Ewpratten/sm ignore = dirty +[submodule "third_party/rs-tiled"] + path = third_party/rs-tiled + url = https://github.com/Ewpratten/rs-tiled diff --git a/third_party/rs-tiled b/third_party/rs-tiled new file mode 160000 index 00000000..317b1358 --- /dev/null +++ b/third_party/rs-tiled @@ -0,0 +1 @@ +Subproject commit 317b135850eed79e3d31de92539e7a3cea0b7b80 From 2bb1fa7a668a0a661b38b5b88320b33ac262cd6b Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 13:23:58 -0400 Subject: [PATCH 7/9] wip tile caching --- game.tiled-session | 1 + game/dist/map_gameMap.tmx | 8 +++ game/game_logic/Cargo.toml | 2 +- .../src/rendering/utilities/map_render.rs | 51 +++++++++++++++---- 4 files changed, 52 insertions(+), 10 deletions(-) diff --git a/game.tiled-session b/game.tiled-session index 776e14b2..9095aa56 100644 --- a/game.tiled-session +++ b/game.tiled-session @@ -52,6 +52,7 @@ "openFiles": [ ], "project": "game.tiled-project", + "property.type": "float", "recentFiles": [ "game/dist/assets/env/env_beachTile/beachTile.tsx", "game/dist/map_gameMap.tmx", diff --git a/game/dist/map_gameMap.tmx b/game/dist/map_gameMap.tmx index af2da828..f3384c58 100644 --- a/game/dist/map_gameMap.tmx +++ b/game/dist/map_gameMap.tmx @@ -3,9 +3,17 @@ + + + + + + + + diff --git a/game/game_logic/Cargo.toml b/game/game_logic/Cargo.toml index 01481368..e285ec99 100644 --- a/game/game_logic/Cargo.toml +++ b/game/game_logic/Cargo.toml @@ -26,4 +26,4 @@ approx = "0.5.1" poll-promise = { version = "0.1.0", features = ["tokio"] } tempfile = "3.3.0" nalgebra = "0.30.1" -tiled = "0.10.1" \ No newline at end of file +tiled = { version = "0.10.1", path = "../../third_party/rs-tiled" } diff --git a/game/game_logic/src/rendering/utilities/map_render.rs b/game/game_logic/src/rendering/utilities/map_render.rs index a94e79e3..8a105177 100644 --- a/game/game_logic/src/rendering/utilities/map_render.rs +++ b/game/game_logic/src/rendering/utilities/map_render.rs @@ -1,8 +1,11 @@ use std::{collections::HashMap, sync::Arc}; -use crate::asset_manager::InternalData; +use crate::asset_manager::{load_texture_from_internal_data, InternalData}; use nalgebra as na; -use tiled::{Loader, ResourceCache, ResourcePath, ResourcePathBuf, Tileset}; +use raylib::{ + camera::Camera2D, prelude::RaylibDrawHandle, texture::Texture2D, RaylibHandle, RaylibThread, +}; +use tiled::{Loader, Map, ResourceCache, ResourcePath, ResourcePathBuf, Tileset}; /// Possible errors generated by the map loading process #[derive(Debug, thiserror::Error)] @@ -44,10 +47,6 @@ impl ResourceCache for ProgramDataTileCache { .unwrap(), ) }) - - // .ok_or(MapRenderError::AssetNotFound(path.to_string()))? - // .data - // .into_owned(); } } @@ -68,11 +67,18 @@ impl ResourceCache for ProgramDataTileCache { } #[derive(Debug)] -pub struct MapRenderer {} +pub struct MapRenderer { + map: Map, + tile_textures: HashMap>, +} impl MapRenderer { /// Construct a new MapRenderer. - pub fn new(tmx_path: &str) -> Result { + pub fn new( + tmx_path: &str, + raylib: &mut RaylibHandle, + raylib_thread: &RaylibThread, + ) -> Result { // Pull the TMX from storage let data = InternalData::get(tmx_path) .ok_or(MapRenderError::AssetNotFound(tmx_path.to_string()))? @@ -83,7 +89,32 @@ impl MapRenderer { let mut loader = Loader::with_cache(ProgramDataTileCache::new()); let map = loader.load_tmx_map_from(data.as_slice(), tmx_path)?; - Ok(Self {}) + // Iterate over all images in the map + let mut tile_textures = HashMap::new(); + for tileset in map.tilesets() { + for (idx, tile) in tileset.tiles() { + if let Some(image) = tile.data.image { + // We now have a path to an image + let image_path = image.source; + + // Load the texture + let texture = load_texture_from_internal_data( + raylib, + raylib_thread, + image_path.to_str().unwrap(), + ) + .unwrap(); + + // Store the texture in the cache + tile_textures + .entry(tileset.name) + .or_insert_with(HashMap::new) + .insert(idx, texture); + } + } + } + + Ok(Self { map, tile_textures }) } pub fn sample_friction_at(&self, position: na::Vector2) -> f32 { @@ -93,4 +124,6 @@ impl MapRenderer { pub fn sample_temperature_at(&self, position: na::Vector2) -> f32 { todo!() } + + pub fn render_map(&self, draw_handle: &RaylibDrawHandle, camera: &Camera2D) {} } From a34a62fd29a8a46edad8ae227ea023caae1eb764 Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 13:24:20 -0400 Subject: [PATCH 8/9] bump tiled --- third_party/rs-tiled | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/rs-tiled b/third_party/rs-tiled index 317b1358..1629541a 160000 --- a/third_party/rs-tiled +++ b/third_party/rs-tiled @@ -1 +1 @@ -Subproject commit 317b135850eed79e3d31de92539e7a3cea0b7b80 +Subproject commit 1629541a446cff53c4dd6aa827aa1bb0afc4e96c From e0fa16cc8fdb54231cd78d6f85e8033e5df01085 Mon Sep 17 00:00:00 2001 From: Evan Pratten Date: Sat, 2 Apr 2022 14:39:12 -0400 Subject: [PATCH 9/9] Map rendering! --- .../src/rendering/utilities/map_render.rs | 104 ++++++++++++++++-- game/game_logic/src/scenes/test_fox.rs | 49 ++++++++- 2 files changed, 138 insertions(+), 15 deletions(-) diff --git a/game/game_logic/src/rendering/utilities/map_render.rs b/game/game_logic/src/rendering/utilities/map_render.rs index 8a105177..b9822917 100644 --- a/game/game_logic/src/rendering/utilities/map_render.rs +++ b/game/game_logic/src/rendering/utilities/map_render.rs @@ -1,9 +1,14 @@ -use std::{collections::HashMap, sync::Arc}; +use std::{collections::HashMap, path::PathBuf, sync::Arc}; use crate::asset_manager::{load_texture_from_internal_data, InternalData}; use nalgebra as na; use raylib::{ - camera::Camera2D, prelude::RaylibDrawHandle, texture::Texture2D, RaylibHandle, RaylibThread, + camera::Camera2D, + color::Color, + math::Vector2, + prelude::{RaylibDraw, RaylibDrawHandle, RaylibMode2D}, + texture::Texture2D, + RaylibHandle, RaylibThread, }; use tiled::{Loader, Map, ResourceCache, ResourcePath, ResourcePathBuf, Tileset}; @@ -69,7 +74,7 @@ impl ResourceCache for ProgramDataTileCache { #[derive(Debug)] pub struct MapRenderer { map: Map, - tile_textures: HashMap>, + tile_textures: HashMap, } impl MapRenderer { @@ -93,9 +98,9 @@ impl MapRenderer { let mut tile_textures = HashMap::new(); for tileset in map.tilesets() { for (idx, tile) in tileset.tiles() { - if let Some(image) = tile.data.image { + if let Some(image) = &tile.data.image { // We now have a path to an image - let image_path = image.source; + let image_path = image.source.clone(); // Load the texture let texture = load_texture_from_internal_data( @@ -106,10 +111,7 @@ impl MapRenderer { .unwrap(); // Store the texture in the cache - tile_textures - .entry(tileset.name) - .or_insert_with(HashMap::new) - .insert(idx, texture); + tile_textures.insert(image_path, texture); } } } @@ -125,5 +127,87 @@ impl MapRenderer { todo!() } - pub fn render_map(&self, draw_handle: &RaylibDrawHandle, camera: &Camera2D) {} + pub fn render_map(&self, draw_handle: &mut RaylibMode2D, camera: &Camera2D, show_debug_grid:bool) { + // Get the window corners in world space + let screen_width = draw_handle.get_screen_width(); + let screen_height = draw_handle.get_screen_height(); + let world_win_top_left = draw_handle.get_screen_to_world2D(Vector2::new(0.0, 0.0), camera); + let world_win_bottom_right = draw_handle.get_screen_to_world2D( + Vector2::new(screen_width as f32, screen_height as f32), + camera, + ); + + // Handle each layer from the bottom up + for layer in self.map.layers() { + // Handle different layer types + match layer.layer_type() { + tiled::LayerType::TileLayer(layer) => { + // Keep track of our sampler X and Y values + let mut sampler_x = 0; + let mut sampler_y = 0; + + // Get the tile width and height + let tile_width = 128; + let tile_height = 128; + + // Loop until we have covered all tiles on the screen + for y in (world_win_top_left.y as i64)..(world_win_bottom_right.y as i64) { + // Convert the pixel coordinates to tile coordinates + let tile_y = (y as f32 / tile_height as f32).floor() as i32; + + // If we are looking at a new tile, update the sampler + if sampler_y != tile_y { + sampler_y = tile_y; + + for x in + (world_win_top_left.x as i64)..(world_win_bottom_right.x as i64) + { + // Convert the pixel coordinates to tile coordinates + let tile_x = (x as f32 / tile_width as f32).floor() as i32; + // debug!("Tile: ({}, {})", tile_x, tile_y); + + // If we are looking at a new tile, update the sampler + if sampler_x != tile_x { + sampler_x = tile_x; + + // Get the tile at this coordinate + if let Some(tile) = layer.get_tile(sampler_x, sampler_y) { + // debug!("Tile: ({}, {})", tile_x, tile_y); + // Fetch the texture for this tile + let real_tile = tile.get_tile().unwrap(); + let texture = self + .tile_textures + .get(&real_tile.image.as_ref().unwrap().source) + .unwrap(); + + // Draw the tile + draw_handle.draw_texture( + texture, + tile_x * tile_width as i32, + tile_y * tile_height as i32, + Color::WHITE, + ); + } + + if show_debug_grid { + draw_handle.draw_rectangle_lines( + tile_x * tile_width as i32, + tile_y * tile_height as i32, + self.map.tile_width as i32, + self.map.tile_height as i32, + Color::RED, + ); + draw_handle.draw_pixel(x as i32, y as i32, Color::BLUE); + } + } + } + } + } + } + tiled::LayerType::ObjectLayer(_) => todo!(), + tiled::LayerType::ImageLayer(_) => todo!(), + tiled::LayerType::GroupLayer(_) => todo!(), + } + } + } } diff --git a/game/game_logic/src/scenes/test_fox.rs b/game/game_logic/src/scenes/test_fox.rs index 29911212..d9d1973e 100644 --- a/game/game_logic/src/scenes/test_fox.rs +++ b/game/game_logic/src/scenes/test_fox.rs @@ -1,18 +1,20 @@ //! This "scene" is used only for testing animation and resource loading //! It should be removed once the game is being worked on -use raylib::prelude::*; use nalgebra as na; +use raylib::prelude::*; use crate::{ - discord::DiscordChannel, global_resource_package::GlobalResources, + discord::DiscordChannel, + global_resource_package::GlobalResources, rendering::utilities::{anim_texture::AnimatedTexture, map_render::MapRenderer}, }; #[derive(Debug)] pub struct TestFoxScene { fox_animation: AnimatedTexture, - world_map: MapRenderer + world_map: MapRenderer, + camera: Camera2D, } impl TestFoxScene { @@ -22,9 +24,24 @@ impl TestFoxScene { let fox = AnimatedTexture::new(raylib_handle, thread, "chr", "testFox").unwrap(); // Load the map - let map_renderer = MapRenderer::new("map_gameMap.tmx").unwrap(); + let map_renderer = MapRenderer::new("map_gameMap.tmx", raylib_handle, thread).unwrap(); - Self { fox_animation: fox, world_map: map_renderer } + // Create a camera + let camera = Camera2D { + target: Vector2 { x: 0.0, y: 0.0 }, + offset: Vector2 { + x: raylib_handle.get_screen_width() as f32, + y: (raylib_handle.get_screen_height() as f32) * -0.5, + }, + rotation: 0.0, + zoom: 1.0, + }; + + Self { + fox_animation: fox, + world_map: map_renderer, + camera, + } } /// Handler for each frame @@ -50,5 +67,27 @@ impl TestFoxScene { None, None, ); + + // Allow the camera to be moved with wasd + if draw.is_key_down(KeyboardKey::KEY_W) { + self.camera.target.y -= 5.0; + } + if draw.is_key_down(KeyboardKey::KEY_S) { + self.camera.target.y += 5.0; + } + if draw.is_key_down(KeyboardKey::KEY_A) { + self.camera.target.x -= 5.0; + } + if draw.is_key_down(KeyboardKey::KEY_D) { + self.camera.target.x += 5.0; + } + + { + // Begin camera mode + let mut ctx2d = draw.begin_mode2D(self.camera); + + // Render the map + self.world_map.render_map(&mut ctx2d, &self.camera, true); + } } }