From 8eb4421ec30db6fffc6eed4e57c1a9e693289cdc Mon Sep 17 00:00:00 2001 From: luckyturtledev Date: Fri, 12 May 2023 14:36:37 +0200 Subject: [PATCH] add player layer to map --- map/src/lib.rs | 70 +++++++++++++++++- map/src/main.rs | 4 +- map/src/tiles.rs | 25 ++++++- pc/assets/img/ObjectTiles/ObjectTiles.tsx | 7 +- pc/assets/img/Player/Player.tsx | 19 +++++ pc/assets/img/{ => Player}/goal.png | Bin .../img/{Auto1.png => Player/player1_car.png} | Bin pc/assets/img/{ => Player}/player2_car.png | Bin pc/assets/img/{ => Player}/player3_car.png | Bin pc/assets/img/{ => Player}/player4_car.png | Bin pc/assets/img/player1_car.png | Bin 4039 -> 0 bytes pc/assets/level/001.tmx | 22 +++++- pc/src/main.rs | 2 +- 13 files changed, 137 insertions(+), 12 deletions(-) create mode 100644 pc/assets/img/Player/Player.tsx rename pc/assets/img/{ => Player}/goal.png (100%) rename pc/assets/img/{Auto1.png => Player/player1_car.png} (100%) rename pc/assets/img/{ => Player}/player2_car.png (100%) rename pc/assets/img/{ => Player}/player3_car.png (100%) rename pc/assets/img/{ => Player}/player4_car.png (100%) delete mode 100644 pc/assets/img/player1_car.png diff --git a/map/src/lib.rs b/map/src/lib.rs index 4ba63c6..b43f5ca 100644 --- a/map/src/lib.rs +++ b/map/src/lib.rs @@ -4,14 +4,25 @@ use thiserror::Error; use tiled::{LayerType, Loader}; pub mod tiles; -use tiles::{InvalidTileID, MapBaseTile, ObjectTile}; +use tiles::{InvalidTileID, MapBaseTile, ObjectTile, PlayerTile}; + +#[derive(Clone, Debug, SelfRustTokenize)] +pub struct Player { + start: (u8, u8), + goal: Option<(u8, u8)> +} #[derive(Clone, Debug, SelfRustTokenize)] pub struct Map { pub width: u8, pub height: u8, pub base_layer: Vec>, - pub object_layer: Vec>> + pub object_layer: Vec>>, + pub global_goal: Option<(u8, u8)>, + pub player_1: Option, + pub player_2: Option, + pub player_3: Option, + pub player_4: Option } #[derive(Error, Debug)] @@ -40,6 +51,11 @@ impl Map { let height: u8 = map.height.try_into().map_err(|_| MapError::ToHight)?; let mut base_layer = Vec::with_capacity(height as usize); let mut object_layer = Vec::with_capacity(height as usize); + let mut global_goal = None; + let mut player_1 = None; + let mut player_2 = None; + let mut player_3 = None; + let mut player_4 = None; for (i, layer) in map.layers().enumerate() { match i { 0 => match layer.layer_type() { @@ -74,6 +90,49 @@ impl Map { }, _ => return Err(MapError::WrongLayer(i, "TileLayer".to_owned())) }, + 2 => match layer.layer_type() { + LayerType::Tiles(tile_layer) => { + for x in 0..width { + for y in 0..height { + if let Some(tile) = + tile_layer.get_tile(x.into(), y.into()) + { + let tile = PlayerTile::try_from(tile.id())?; + match tile { + PlayerTile::Car1 => { + player_1 = Some(Player { + start: (x, y), + goal: None + }) + }, + PlayerTile::Car2 => { + player_2 = Some(Player { + start: (x, y), + goal: None + }) + }, + PlayerTile::Car3 => { + player_3 = Some(Player { + start: (x, y), + goal: None + }) + }, + PlayerTile::Car4 => { + player_4 = Some(Player { + start: (x, y), + goal: None + }) + }, + PlayerTile::GlobalGoal => { + global_goal = Some((x, y)) + }, + } + } + } + } + }, + _ => return Err(MapError::WrongLayer(i, "TileLayer".to_owned())) + }, _ => return Err(MapError::ToManyLayers) } } @@ -81,7 +140,12 @@ impl Map { width, height, base_layer, - object_layer + object_layer, + global_goal, + player_1, + player_2, + player_3, + player_4 }) } diff --git a/map/src/main.rs b/map/src/main.rs index 031f837..d7c64be 100644 --- a/map/src/main.rs +++ b/map/src/main.rs @@ -8,12 +8,12 @@ pub struct Opt { fn main() { let opt = Opt::parse(); - let result = Map::from_tmx(&opt.file); + let result = Map::from_tmx(opt.file); match result { Err(err) => { eprintln!("ERROR: {err}"); std::process::exit(1); }, - Ok(map) => println!("{map:#?}") + Ok(map) => println!("{map:#?}\nmap is valid") } } diff --git a/map/src/tiles.rs b/map/src/tiles.rs index 10a37ba..65b19d0 100644 --- a/map/src/tiles.rs +++ b/map/src/tiles.rs @@ -34,7 +34,7 @@ impl TryFrom for MapBaseTile { #[repr(u8)] pub enum ObjectTile { //numbers must match them from the Tiled tilesets - Stone = 0 + Stone = 1 } impl TryFrom for ObjectTile { @@ -46,3 +46,26 @@ impl TryFrom for ObjectTile { Self::try_from_primitive(value_u8).map_err(|_| Self::Error::InvalidId(value)) } } + +///Store all Tiles, with can be place the layer above the background +#[derive(Clone, Copy, Debug, Eq, SelfRustTokenize, PartialEq, TryFromPrimitive)] +#[repr(u8)] +pub enum PlayerTile { + //numbers must match them from the Tiled tilesets + Car1 = 0, + Car2 = 1, + Car3 = 2, + Car4 = 3, + //goal, which can be used by all players + GlobalGoal = 4 +} + +impl TryFrom for PlayerTile { + type Error = InvalidTileID; + fn try_from(value: u32) -> Result { + let value_u8: u8 = value + .try_into() + .map_err(|_| Self::Error::InvalidId(value))?; + Self::try_from_primitive(value_u8).map_err(|_| Self::Error::InvalidId(value)) + } +} diff --git a/pc/assets/img/ObjectTiles/ObjectTiles.tsx b/pc/assets/img/ObjectTiles/ObjectTiles.tsx index aed69c1..dbb2d51 100644 --- a/pc/assets/img/ObjectTiles/ObjectTiles.tsx +++ b/pc/assets/img/ObjectTiles/ObjectTiles.tsx @@ -1,2 +1,7 @@ - + + + + + + diff --git a/pc/assets/img/Player/Player.tsx b/pc/assets/img/Player/Player.tsx new file mode 100644 index 0000000..e7cbd19 --- /dev/null +++ b/pc/assets/img/Player/Player.tsx @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/pc/assets/img/goal.png b/pc/assets/img/Player/goal.png similarity index 100% rename from pc/assets/img/goal.png rename to pc/assets/img/Player/goal.png diff --git a/pc/assets/img/Auto1.png b/pc/assets/img/Player/player1_car.png similarity index 100% rename from pc/assets/img/Auto1.png rename to pc/assets/img/Player/player1_car.png diff --git a/pc/assets/img/player2_car.png b/pc/assets/img/Player/player2_car.png similarity index 100% rename from pc/assets/img/player2_car.png rename to pc/assets/img/Player/player2_car.png diff --git a/pc/assets/img/player3_car.png b/pc/assets/img/Player/player3_car.png similarity index 100% rename from pc/assets/img/player3_car.png rename to pc/assets/img/Player/player3_car.png diff --git a/pc/assets/img/player4_car.png b/pc/assets/img/Player/player4_car.png similarity index 100% rename from pc/assets/img/player4_car.png rename to pc/assets/img/Player/player4_car.png diff --git a/pc/assets/img/player1_car.png b/pc/assets/img/player1_car.png deleted file mode 100644 index 12f4a225323d2ee5eb306e690a01acc84a9bad89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4039 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 TjiaWx3nE}`Zf{m+;+gzkKI_m| diff --git a/pc/assets/level/001.tmx b/pc/assets/level/001.tmx index 507cc91..8b79021 100644 --- a/pc/assets/level/001.tmx +++ b/pc/assets/level/001.tmx @@ -1,7 +1,8 @@ - + + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -19,12 +20,25 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0, +0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,3,0,0,3,3,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,3,3,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0, +0,0,0,0,0,0,0,0,8,0,0,0,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,0,0,0,0,2,2,0,2,0,0,0,0, -0,0,0,0,0,0,0,0,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,4,0,0,0,0,0,0,0,0,0,0,7,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 diff --git a/pc/src/main.rs b/pc/src/main.rs index 64e197b..c2f875f 100644 --- a/pc/src/main.rs +++ b/pc/src/main.rs @@ -4,6 +4,7 @@ use tetra::{ Context, ContextBuilder, State }; type Vec2 = vek::vec::repr_c::vec2::Vec2; +use log::info; use m3_macro::include_map; use m3_map::Map; use once_cell::sync::Lazy; @@ -11,7 +12,6 @@ use tetra::{ graphics::{DrawParams, Texture}, time::get_delta_time }; -use log::{info}; mod tiles; use tiles::Textures;