diff --git a/src/app/editor.rs b/src/app/editor.rs index 5d2d93f..4aa7f53 100644 --- a/src/app/editor.rs +++ b/src/app/editor.rs @@ -2,10 +2,11 @@ use clap::{App, crate_version}; use sfml::system::Vector2; use sfml::window::{Event, Key}; +use sfml::window::mouse::Button; use sfml::graphics::{RectangleShape, RenderTarget, Transformable, Color, Shape}; use rusty::engine::renderer::Renderer; -use rusty::engine::map::{GraphicTile, Map}; +use rusty::engine::map::{GraphicTile, CollisionTile, Map}; fn main() { let _ = App::new("Rusty Editor") @@ -16,9 +17,12 @@ fn main() { let mut running = true; - let map = Map::from_str(include_str!("../../assets/levels/level2.txt")).unwrap(); + let mut map = Map::from_str(include_str!("../../assets/levels/level2.txt")).unwrap(); loop { + let top_panel_size = Vector2::new(renderer.window().size().x as f32, 50.0); + let left_panel_size = Vector2::new(100.0, renderer.window().size().y as f32 - top_panel_size.y); + // Manage the events while let Some(event) = renderer.poll_event() { match event { @@ -30,6 +34,22 @@ fn main() { code: Key::Escape, .. } => running = false, + // A click on the screen + Event::MouseButtonPressed { + button: Button::Left, x, y, + } => { + if x as f32 >= left_panel_size.x && y as f32 >= top_panel_size.y { + let x = ((x - left_panel_size.x as i32) / 16) as usize; + let y = ((y - top_panel_size.y as i32) / 16) as usize; + + if map.tile(y, x) == CollisionTile::empty() { + map.set_tile(y, x, CollisionTile::full()); + } else { + map.set_tile(y, x, CollisionTile::empty()); + } + } + }, + _ => (), } } @@ -38,13 +58,11 @@ fn main() { renderer.clear(); // Show the top panel - let top_panel_size = Vector2::new(renderer.window().size().x as f32, 50.0); let mut top_panel = RectangleShape::with_size(top_panel_size); top_panel.set_fill_color(&Color::rgb(255, 0, 0)); renderer.window_mut().draw(&top_panel); // Show the left panel - let left_panel_size = Vector2::new(100.0, renderer.window().size().y as f32 - top_panel_size.y); let mut left_panel = RectangleShape::with_size(left_panel_size); left_panel.set_position((0.0, top_panel_size.y)); left_panel.set_fill_color(&Color::rgb(0, 255, 0)); diff --git a/src/engine/map/mod.rs b/src/engine/map/mod.rs index 5de1766..36705c6 100644 --- a/src/engine/map/mod.rs +++ b/src/engine/map/mod.rs @@ -109,6 +109,18 @@ pub enum GraphicTile { } impl GraphicTile { + + /// Returns a graphic tile from a collision tile. + /// + /// This might be ugly for the moment. + pub fn from_collision_tile(collision: CollisionTile) -> GraphicTile { + if collision == CollisionTile::empty() { + GraphicTile::Hidden + } else { + GraphicTile::Center + } + } + /// Checks if a graphic tile has a top border. pub fn is_top(self) -> bool { match self { @@ -343,6 +355,16 @@ impl Map { } } + /// Returns a tile of the map. + pub fn tile(&self, i: usize, j: usize) -> CollisionTile { + self.tiles[(i, j)].0 + } + + /// Changes a tile of the map. + pub fn set_tile(&mut self, i: usize, j: usize, tile: CollisionTile) { + self.tiles[(i, j)] = (tile, GraphicTile::from_collision_tile(tile)); + } + /// Finds a possible entrance. pub fn find_entrance(tiles: &Matrix<(CollisionTile, GraphicTile)>) -> (usize, usize) { (tiles.rows() - 5, 1)