diff --git a/src/lib.rs b/src/lib.rs index 1b0ebdf..e39c908 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -8,7 +8,8 @@ #![deny(clippy::all)] #![deny(warnings)] -use bevy::prelude::Component; +use crate::map::Tile; +use bevy::prelude::{Component, Transform}; pub mod map; pub mod render; @@ -23,8 +24,39 @@ pub struct Position { pub y: u8, } +impl Position { + /// Peret de recuper la position, sous form d'un transform, d'un objet sur la carte du jeu. + pub fn to_map_position(&self) -> Transform { + let offset_x = self.y % 2; + + let new_x = (offset_x as f32).mul_add(0.5, self.x as f32); + + Transform::from_xyz(new_x, self.y as f32 * 0.42, self.y as f32 * -1.) + } +} + slotmap::new_key_type! { /// Peut ĂȘtre utiliser pour identifier n'importe quel objet appartenant a un joueur (le joueur compris). #[derive(Component)] pub struct PlayerId; } + +impl Tile { + /// Recuper le chemin d'acces d'une case. + pub const fn get_path(&self) -> &str { + match *self { + Self::Castle => "tiles/castle.png", + Self::Wall => "tiles/wall.png", + Self::Farm => "tiles/farm.png", + Self::Grass => "tiles/grass.png", + Self::Forest => "tiles/forest.png", + Self::Hill => "tiles/hill.png", + Self::Lumberjack => "tiles/lumberjack.png", + Self::Mine => "tiles/mine.png", + Self::Outpost => "tiles/outpost.png", + Self::Barrack => "tiles/barrack.png", + Self::Upgrader => "tiles/upgrader.png", + Self::Tower => "tiles/tower.png", + } + } +} diff --git a/src/render.rs b/src/render.rs index 08c1b71..62d2316 100644 --- a/src/render.rs +++ b/src/render.rs @@ -1,5 +1,6 @@ //! Permet de Rendre le jeu sur l'ecran. +use crate::{map::Tile, Position}; use bevy::prelude::*; /// Plugin permettant de rendre sur l'ecran le jeu. @@ -7,11 +8,31 @@ pub struct RenderPlugin; impl Plugin for RenderPlugin { fn build(&self, app: &mut App) { - app.add_startup_system(setup_camera); + app.add_startup_system(setup_camera).add_system(render_tile); } } /// Initialisation de la camera. fn setup_camera(mut commands: Commands) { - commands.spawn(Camera2dBundle::default()); + commands.spawn(Camera2dBundle { + transform: Transform::from_xyz(5., 0.5, 100.), + ..default() + }); +} + +/// Permet de rendre le tile et de les actualiser. +fn render_tile( + all_tiles: Query<(Entity, &Tile, &Position), Changed>, + mut commands: Commands, + asset_server: Res, +) { + for (tile_entity, tile_type, tile_pos) in all_tiles.iter() { + commands.entity(tile_entity).insert(SpriteBundle { + texture: asset_server.load(tile_type.get_path()), + transform: tile_pos + .to_map_position() + .with_scale(Vec3::splat(1.0 / 185.0)), + ..default() + }); + } }