diff --git a/src/app/editor.rs b/src/app/editor.rs index 2a778e4..f328e4d 100644 --- a/src/app/editor.rs +++ b/src/app/editor.rs @@ -1,3 +1 @@ -fn main() { - -} +fn main() {} diff --git a/src/app/game.rs b/src/app/game.rs index 3aa1bbd..257c331 100644 --- a/src/app/game.rs +++ b/src/app/game.rs @@ -1,26 +1,18 @@ #[macro_use] extern crate clap; -extern crate sfml; extern crate rusty; +extern crate sfml; use std::time::Instant; -use clap::{ - Arg, - App, -}; +use clap::{App, Arg}; -use sfml::window::{ - Event, - Key, - joystick, -}; +use sfml::window::{joystick, Event, Key}; - -use rusty::engine::scene::Scene; use rusty::engine::character::Character; use rusty::engine::controls::Controls; use rusty::engine::renderer::Renderer; +use rusty::engine::scene::Scene; fn parse_resolution(res: &str) -> Result<(u32, u32), String> { let split = res.split('x').collect::>(); @@ -43,21 +35,22 @@ fn parse_resolution(res: &str) -> Result<(u32, u32), String> { } fn main() { - let matches = App::new("Rusty Maker") .version(crate_version!()) - .arg(Arg::with_name("resolution") - .short("r") - .long("resolution") - .value_name("WIDTHxHEIGHT") - .takes_value(true) - .default_value("800x450") - .validator(|x| parse_resolution(&x).map(|_| ()))) - .arg(Arg::with_name("fullscreen") - .short("f") - .long("fullscreen") - .takes_value(false)) - .get_matches(); + .arg( + Arg::with_name("resolution") + .short("r") + .long("resolution") + .value_name("WIDTHxHEIGHT") + .takes_value(true) + .default_value("800x450") + .validator(|x| parse_resolution(&x).map(|_| ())), + ).arg( + Arg::with_name("fullscreen") + .short("f") + .long("fullscreen") + .takes_value(false), + ).get_matches(); let resolution = parse_resolution(matches.value_of("resolution").unwrap()).unwrap(); let fullscreen = matches.is_present("fullscreen"); @@ -83,10 +76,8 @@ fn main() { let mut running = true; loop { - // Manage the events while let Some(event) = renderer.poll_event() { - match event { // Quit the game if window is closed Event::Closed => running = false, @@ -120,10 +111,8 @@ fn main() { // Display and manage the frame rate renderer.display(); - if ! running { + if !running { break; } - } - } diff --git a/src/engine/character/mod.rs b/src/engine/character/mod.rs index 55f2afa..f37df2a 100644 --- a/src/engine/character/mod.rs +++ b/src/engine/character/mod.rs @@ -1,30 +1,16 @@ -use std::time::{ - Instant, - Duration, -}; +use std::time::{Duration, Instant}; +use sfml::graphics::{FloatRect, IntRect, View}; use sfml::system::Vector2; use sfml::window::Event; -use sfml::graphics::{ - IntRect, - FloatRect, - View, -}; +use engine::controls::{Action, Controls}; use engine::scene::Updatable; -use engine::controls::{ - Controls, - Action, -}; +use engine::math::{clamp, duration_as_f32, duration_as_frame}; +use engine::physics; use engine::renderer::Drawable; use engine::texture::Texture; -use engine::physics; -use engine::math::{ - duration_as_f32, - duration_as_frame, - clamp, -}; /// The different sides a character can face. pub enum Side { @@ -60,7 +46,6 @@ impl Side { /// A character, enemy or controllable. pub struct Character { - /// The position of the character. pub position: Vector2, @@ -91,7 +76,6 @@ pub struct Character { } impl Character { - /// Creates a character in (0, 0). fn generic(controls: Option) -> Character { Character { @@ -159,7 +143,6 @@ impl Character { impl Updatable for Character { fn update(&mut self, duration: &Duration) { - let mut force: Vector2 = Vector2::new(0.0, 0.0); if let Some(ref controls) = self.controls { @@ -167,17 +150,13 @@ impl Updatable for Character { } if let Some(side) = Side::from_force(force) { - self.side = side; if self.animation_timer.is_none() { self.animation_timer = Some(Instant::now()); } - } else { - self.animation_timer = None; - } let duration = duration_as_f32(duration); @@ -202,7 +181,6 @@ impl Updatable for Character { // Compute position self.position += self.speed * duration; - } fn manage_event(&mut self, event: &Event) { @@ -216,7 +194,7 @@ impl Updatable for Character { Some(Action::Jump(true)) => { self.jump(); self.can_jump = false; - }, + } Some(Action::Jump(false)) => { self.can_jump = true; @@ -224,7 +202,6 @@ impl Updatable for Character { _ => (), } - } } diff --git a/src/engine/controls/mod.rs b/src/engine/controls/mod.rs index ff282ee..b09fdd9 100644 --- a/src/engine/controls/mod.rs +++ b/src/engine/controls/mod.rs @@ -1,16 +1,7 @@ use sfml::system::Vector2; -use sfml::window::joystick::{ - Axis, - axis_position, - is_connected, - is_button_pressed, - COUNT, -}; +use sfml::window::joystick::{axis_position, is_button_pressed, is_connected, Axis, COUNT}; -use sfml::window::{ - Key, - Event, -}; +use sfml::window::{Event, Key}; /// The different actions that a user can do. pub enum Action { @@ -32,7 +23,6 @@ pub enum Controls { } impl Controls { - /// Returns the default keyboard controls. pub fn default_keyboard() -> Controls { Controls::Keyboard(KeyboardMap::default()) @@ -81,13 +71,11 @@ impl Controls { Controls::Gamepad(ref map) => map.is_running(), } } - } /// A map between keyboard keys and actions. #[derive(Copy, Clone)] pub struct KeyboardMap { - /// The key corresponding to the jump button. jump_key: Key, @@ -99,11 +87,9 @@ pub struct KeyboardMap { /// The key corresponding to the right button. right_key: Key, - } impl KeyboardMap { - /// Creates the default keyboard config. pub fn default() -> KeyboardMap { KeyboardMap { @@ -116,22 +102,17 @@ impl KeyboardMap { /// Converts an event and depending on the config, returns the corresponding action. pub fn convert(&self, event: &Event) -> Option { - match event { - Event::KeyPressed { code, .. } if *code == self.jump_key => - Some(Action::Jump(true)), + Event::KeyPressed { code, .. } if *code == self.jump_key => Some(Action::Jump(true)), - Event::KeyReleased { code, .. } if *code == self.jump_key => - Some(Action::Jump(false)), + Event::KeyReleased { code, .. } if *code == self.jump_key => Some(Action::Jump(false)), _ => None, } - } /// Returns the direction of the keys. pub fn direction(&self) -> Vector2 { - let mut ret = Vector2::new(0.0, 0.0); const RIGHT: Vector2 = Vector2 { x: 1.0, y: 0.0 }; @@ -145,20 +126,17 @@ impl KeyboardMap { } ret - } /// Returns whether the running button is held down. pub fn is_running(&self) -> bool { self.run_key.is_pressed() } - } /// A map between gamepad buttons and actions. #[derive(Copy, Clone)] pub struct GamepadMap { - /// Id of the gamepad. id: u32, @@ -170,17 +148,14 @@ pub struct GamepadMap { /// Left / Right axis. left_right_axis: Axis, - } impl GamepadMap { - /// Creates the default gamepad from an id. /// /// Returns None if the gamepad corresponding to the id is not connected. pub fn from_id(id: u32) -> Option { - - if ! is_connected(id){ + if !is_connected(id) { return None; } @@ -196,7 +171,7 @@ impl GamepadMap { pub fn all() -> Vec { let mut gamepads = vec![]; - for id in 0 .. COUNT { + for id in 0..COUNT { if let Some(gamepad) = GamepadMap::from_id(id) { gamepads.push(gamepad); } @@ -207,21 +182,18 @@ impl GamepadMap { /// Converts an event and depending on the config, returns the corresponding action. pub fn convert(&self, event: &Event) -> Option { - match event { - Event::JoystickButtonPressed { joystickid, button } if - *joystickid == self.id && *button == self.jump_button => { - + Event::JoystickButtonPressed { joystickid, button } + if *joystickid == self.id && *button == self.jump_button => + { Some(Action::Jump(true)) + } - }, - - Event::JoystickButtonReleased { joystickid, button } if - *joystickid == self.id && *button == self.jump_button => { - + Event::JoystickButtonReleased { joystickid, button } + if *joystickid == self.id && *button == self.jump_button => + { Some(Action::Jump(false)) - - }, + } _ => None, } @@ -229,10 +201,7 @@ impl GamepadMap { /// Returns the direction of the directionnal buttons of the gamepad. pub fn direction(&self) -> Vector2 { - Vector2::new( - axis_position(self.id, self.left_right_axis) / 100.0, - 0.0 - ) + Vector2::new(axis_position(self.id, self.left_right_axis) / 100.0, 0.0) } /// Returns whether the run button is held down. diff --git a/src/engine/map/mod.rs b/src/engine/map/mod.rs index e8b1cb6..6d934af 100644 --- a/src/engine/map/mod.rs +++ b/src/engine/map/mod.rs @@ -1,15 +1,9 @@ +use sfml::graphics::{FloatRect, IntRect}; use sfml::system::Vector2; -use sfml::graphics::{ - IntRect, - FloatRect -}; -use engine::texture::Texture; +use engine::math::{clamp, Matrix}; use engine::renderer::Drawable; -use engine::math::{ - Matrix, - clamp, -}; +use engine::texture::Texture; /// This enum represents if the collision happens on the X axis or the Y axis. #[derive(Copy, Clone)] @@ -42,11 +36,9 @@ impl CollisionAxis { } } - /// This struct represents the different sides from which a collision can occur. #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub struct CollisionTile { - /// If the character comes from the top, it will collide if this bool is true. pub from_top: bool, @@ -58,7 +50,6 @@ pub struct CollisionTile { /// If the character comes from the bottom, it will collide if this bool is true. pub from_bottom: bool, - } impl CollisionTile { @@ -118,7 +109,6 @@ pub enum GraphicTile { } impl GraphicTile { - /// Checks if a graphic tile has a top border. pub fn is_top(self) -> bool { match self { @@ -151,8 +141,6 @@ impl GraphicTile { } } - - /// Creates a vec containing all the non hidden graphic tiles. pub fn all() -> Vec { vec![ @@ -175,8 +163,8 @@ impl GraphicTile { top: Option, left: Option, right: Option, - bottom: Option) -> GraphicTile { - + bottom: Option, + ) -> GraphicTile { GraphicTile::from_neighbours( top.unwrap_or_else(CollisionTile::full), left.unwrap_or_else(CollisionTile::full), @@ -190,15 +178,14 @@ impl GraphicTile { top: CollisionTile, left: CollisionTile, right: CollisionTile, - bottom: CollisionTile) -> GraphicTile { - + bottom: CollisionTile, + ) -> GraphicTile { let mut all = GraphicTile::all() .into_iter() .map(|x| (x, true)) .collect::>(); for (ref mut tile, ref mut possible) in &mut all { - if tile.is_top() == (top == CollisionTile::full()) { *possible = false; } @@ -214,7 +201,6 @@ impl GraphicTile { if tile.is_bottom() == (bottom == CollisionTile::full()) { *possible = false; } - } for (tile, possible) in all { @@ -276,24 +262,20 @@ impl Drawable for PositionedTile { /// The map represents the tiles contained in a level. pub struct Map { - /// The entrace point of the character in the map. entrance: (usize, usize), /// The tiles contained in the level. tiles: Matrix<(CollisionTile, GraphicTile)>, - } impl Map { - /// Creates a map full of nothing, with a ground at the bottom. pub fn new(rows: usize, cols: usize) -> Map { - let mut tiles = Matrix::from_size(rows, cols, CollisionTile::empty()); let rows = tiles.rows(); - for i in 0 .. tiles.cols() { + for i in 0..tiles.cols() { tiles[(rows - 1, i)] = CollisionTile::full(); } @@ -303,7 +285,6 @@ impl Map { tiles[(25, 15)] = CollisionTile::full(); Map::from_collision_tiles(tiles) - } /// Creates a map from a txt file. @@ -337,24 +318,21 @@ impl Map { let rows = tiles.rows(); let cols = tiles.cols(); - let mut matrix = Matrix::from_size(rows, cols, - (CollisionTile::empty(), GraphicTile::Hidden) - ); - - for i in 0 .. rows { - for j in 0 .. cols { + let mut matrix = + Matrix::from_size(rows, cols, (CollisionTile::empty(), GraphicTile::Hidden)); + for i in 0..rows { + for j in 0..cols { let graphic = if tiles[(i, j)] == CollisionTile::full() { - // TODO This is uggly // If there is an overflow, we should give None instead let (i, j) = (i as isize, j as isize); GraphicTile::from_neighbour_options( - tiles.get(((i ) as usize, (j-1) as usize)).cloned(), - tiles.get(((i-1) as usize, (j ) as usize)).cloned(), - tiles.get(((i+1) as usize, (j ) as usize)).cloned(), - tiles.get(((i ) as usize, (j+1) as usize)).cloned(), + tiles.get(((i) as usize, (j - 1) as usize)).cloned(), + tiles.get(((i - 1) as usize, (j) as usize)).cloned(), + tiles.get(((i + 1) as usize, (j) as usize)).cloned(), + tiles.get(((i) as usize, (j + 1) as usize)).cloned(), ) } else { GraphicTile::Hidden @@ -402,9 +380,11 @@ impl Map { /// Checks whether the bounding box collides with elements of the map. /// /// Returns the new correct position. - pub fn collides_bbox(&self, old: FloatRect, new: FloatRect) - -> Option<(CollisionAxis, Vector2)> { - + pub fn collides_bbox( + &self, + old: FloatRect, + new: FloatRect, + ) -> Option<(CollisionAxis, Vector2)> { let cols = self.tiles.cols() - 1; let rows = self.tiles.rows() - 1; @@ -418,67 +398,64 @@ impl Map { let mut collision_y = false; let mut new = new; - - for col in min_col ..= max_col { - for row in min_row ..= max_row { - + for col in min_col..=max_col { + for row in min_row..=max_row { let tile_left = col as f32 * 16.0; let tile_top = row as f32 * 16.0; let tile = FloatRect::new(tile_left, tile_top, 16.0, 16.0); - if ! overlap(new, tile) { + if !overlap(new, tile) { continue; } // Collisions between feet and ground - if self.tiles[(row, col)].0.from_top && - old.top + old.height <= tile_top && - new.top + new.height >= tile_top { - - collision_y = true; - new.top = tile_top - new.height; + if self.tiles[(row, col)].0.from_top + && old.top + old.height <= tile_top + && new.top + new.height >= tile_top + { + collision_y = true; + new.top = tile_top - new.height; } - if ! overlap(new, tile) { + if !overlap(new, tile) { continue; } // Collisions between right and right wall - if self.tiles[(row, col)].0.from_left && - old.left + old.width <= tile_left && - new.left + new.width >= tile_left { - + if self.tiles[(row, col)].0.from_left + && old.left + old.width <= tile_left + && new.left + new.width >= tile_left + { collision_x = true; new.left = tile_left - new.width; } - if ! overlap(new, tile) { + if !overlap(new, tile) { continue; } // Collisions between left and left wall - if self.tiles[(row, col)].0.from_right && - old.left >= tile_left + 16.0 && - new.left <= tile_left + 16.0 { - + if self.tiles[(row, col)].0.from_right + && old.left >= tile_left + 16.0 + && new.left <= tile_left + 16.0 + { collision_x = true; new.left = tile_left + 16.0; } - if ! overlap(new, tile) { + if !overlap(new, tile) { continue; } // Collisions between head and roof - if self.tiles[(row, col)].0.from_bottom && - old.top >= tile_top + 16.0 && - new.top <= tile_top + 16.0 { - + if self.tiles[(row, col)].0.from_bottom + && old.top >= tile_top + 16.0 + && new.top <= tile_top + 16.0 + { collision_y = true; new.top = tile_top + 16.0; } - } } @@ -494,10 +471,8 @@ impl Map { /// Checks if two boxes overlap. pub fn overlap(box1: FloatRect, box2: FloatRect) -> bool { - box2.left < box1.left + box1.width && - box2.left + box2.width > box1.left && - box2.top < box1.top + box1.height && - box2.top + box2.height > box1.top + box2.left < box1.left + box1.width + && box2.left + box2.width > box1.left + && box2.top < box1.top + box1.height + && box2.top + box2.height > box1.top } - - diff --git a/src/engine/math/mod.rs b/src/engine/math/mod.rs index da379c5..84cc98b 100644 --- a/src/engine/math/mod.rs +++ b/src/engine/math/mod.rs @@ -1,9 +1,6 @@ use std::time::Duration; -use std::ops::{ - Index, - IndexMut -}; +use std::ops::{Index, IndexMut}; /// Clamp a number between two boundaries. pub fn clamp(number: f32, min: f32, max: f32) -> f32 { @@ -30,7 +27,6 @@ pub fn duration_as_f32(duration: &Duration) -> f32 { /// A generic matrix type, useful for levels. pub struct Matrix { - /// The number of rows of the matrix. rows: usize, @@ -39,10 +35,12 @@ pub struct Matrix { /// The contained data in the matrix. data: Vec, - } -impl Matrix where T: Clone { +impl Matrix +where + T: Clone, +{ /// Creates a matrix from an element and duplicates it. pub fn from_size(rows: usize, cols: usize, element: T) -> Matrix { Matrix { diff --git a/src/engine/mod.rs b/src/engine/mod.rs index 0d760c1..7b0b8fa 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -1,4 +1,3 @@ - /// This module contains the struct Scene. pub mod scene; diff --git a/src/engine/physics/mod.rs b/src/engine/physics/mod.rs index c182744..b248f5c 100644 --- a/src/engine/physics/mod.rs +++ b/src/engine/physics/mod.rs @@ -1,13 +1,19 @@ use sfml::system::Vector2; /// The gravity force. -pub const G: Vector2 = Vector2 { x: 0.0, y: 25.0 * 32.0 }; +pub const G: Vector2 = Vector2 { + x: 0.0, + y: 25.0 * 32.0, +}; /// The friction with the ground. pub const GROUND_FRICTION: Vector2 = Vector2 { x: 0.5, y: 1.0 }; /// The speed of a jump. -pub const JUMP_SPEED: Vector2 = Vector2 { x: 0.0, y: -12.5 * 32.0 }; +pub const JUMP_SPEED: Vector2 = Vector2 { + x: 0.0, + y: -12.5 * 32.0, +}; /// The maximum vertical speed. pub const MAXIMUM_VERTICAL_SPEED: f32 = 10.0 * 32.0; diff --git a/src/engine/renderer/mod.rs b/src/engine/renderer/mod.rs index 6e02140..9e710ba 100644 --- a/src/engine/renderer/mod.rs +++ b/src/engine/renderer/mod.rs @@ -1,26 +1,14 @@ use std::time::Instant; -use sfml::graphics::{ - RenderWindow, - RenderTarget, - Sprite, - Color, - IntRect, - View, -}; +use sfml::graphics::{Color, IntRect, RenderTarget, RenderWindow, Sprite, View}; -use sfml::window::{ - Style, - Event, -}; +use sfml::window::{Event, Style}; -use sfml::system::{ - Vector2, -}; +use sfml::system::Vector2; -use engine::texture::{Texture, TextureManager}; -use engine::scene::Scene; use engine::map::GraphicTile; +use engine::scene::Scene; +use engine::texture::{Texture, TextureManager}; /// Our custom drawable trait. pub trait Drawable { @@ -36,7 +24,6 @@ pub trait Drawable { /// The game window. pub struct Renderer { - /// The window on which the rendering will be done. window: RenderWindow, @@ -45,17 +32,19 @@ pub struct Renderer { /// The global timer of the renderer. started: Instant, - } impl Renderer { /// Creates a new renderer. pub fn new(width: u32, height: u32, fullscreen: bool) -> Renderer { - let mut window = RenderWindow::new( (width, height), "Free Rusty Maker", - if fullscreen { Style::FULLSCREEN } else { Style::CLOSE }, + if fullscreen { + Style::FULLSCREEN + } else { + Style::CLOSE + }, &Default::default(), ); window.set_vertical_sync_enabled(true); @@ -104,9 +93,9 @@ impl Renderer { let rows = map.rows(); let cols = map.cols(); - for i in 0 .. rows { - for j in 0 .. cols { - let tile = map.at(i,j); + for i in 0..rows { + for j in 0..cols { + let tile = map.at(i, j); if tile.graphic != GraphicTile::Hidden { self.draw(&tile); } diff --git a/src/engine/scene/mod.rs b/src/engine/scene/mod.rs index 5de8270..9ddba5f 100644 --- a/src/engine/scene/mod.rs +++ b/src/engine/scene/mod.rs @@ -1,25 +1,22 @@ use std::time::Duration; +use sfml::graphics::View; use sfml::system::Vector2; use sfml::window::Event; -use sfml::graphics::View; use engine::character::Character; use engine::map::Map; /// Contains everything needed to play. pub struct Scene { - /// The characters contained in the scene. characters: Vec, /// The map of the scene. map: Map, - } impl Scene { - /// Creates an empty scene. pub fn new() -> Scene { Scene { @@ -41,7 +38,7 @@ impl Scene { fn controlable(&self) -> Option<&Character> { for character in &self.characters { if character.controls().is_some() { - return Some(&character) + return Some(&character); } } None @@ -78,7 +75,6 @@ impl Scene { /// Updates the whole scene. pub fn update(&mut self, duration: &Duration) { - for c in &mut self.characters { let old = c.bbox(); @@ -118,7 +114,6 @@ impl Scene { pub fn map(&self) -> &Map { &self.map } - } /// Trait that needs to be implemented for everything that can be updatable. diff --git a/src/engine/texture/mod.rs b/src/engine/texture/mod.rs index 3d63099..8b239ee 100644 --- a/src/engine/texture/mod.rs +++ b/src/engine/texture/mod.rs @@ -57,8 +57,14 @@ macro_rules! make_textures { } make_textures!( - Mario, mario, make_mario_texture, "../../../assets/textures/mario.png", - Overworld, overworld, make_overworld_texture, "../../../assets/textures/overworld.png", + Mario, + mario, + make_mario_texture, + "../../../assets/textures/mario.png", + Overworld, + overworld, + make_overworld_texture, + "../../../assets/textures/overworld.png", ); impl TextureManager {