free-rusty-maker/src/app/editor.rs

98 lines
3.3 KiB
Rust

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, CollisionTile, Map};
fn main() {
let _ = App::new("Rusty Editor")
.version(crate_version!())
.get_matches();
let mut renderer = Renderer::new(800, 600, false);
let mut running = true;
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 {
// Quit the game if window is closed
Event::Closed => running = false,
// Quit the game if escape is pressed
Event::KeyPressed {
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());
}
}
},
_ => (),
}
}
// Do the rendering
renderer.clear();
// Show the top panel
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 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));
renderer.window_mut().draw(&left_panel);
// Show the map
for i in 0 .. map.rows() {
for j in 0 .. map.cols() {
let tile = map.at(i, j);
if tile.graphic != GraphicTile::Hidden {
renderer.translate_and_draw(&tile, (left_panel_size.x, top_panel_size.y));
}
}
}
// Draw the border of the map
let mut border = RectangleShape::new();
border.set_size(((map.cols() * 16) as f32, (map.rows() * 16) as f32));
border.set_position((left_panel_size.x, top_panel_size.y));
border.set_fill_color(&Color::rgba(0, 0, 0, 0));
border.set_outline_color(&Color::rgb(0, 0, 0));
border.set_outline_thickness(2.0);
renderer.window_mut().draw(&border);
// Display and manage the frame rate
renderer.display();
if !running {
break;
}
}
}