From 6b098f6cdee464169a43cc88c851b133f9552dab Mon Sep 17 00:00:00 2001 From: Thomas Forgione Date: Wed, 3 Oct 2018 21:47:48 +0200 Subject: [PATCH] Start to do collisions --- assets/textures/overworld-raw.png | Bin 0 -> 57104 bytes assets/textures/overworld.png | Bin 0 -> 2453 bytes src/engine/map/mod.rs | 128 ++++++++++++++++++++++++++++++ src/engine/math/mod.rs | 11 ++- src/engine/mod.rs | 3 + src/engine/renderer/mod.rs | 10 +++ src/engine/scene/mod.rs | 16 +++- src/engine/texture/mod.rs | 1 + 8 files changed, 166 insertions(+), 3 deletions(-) create mode 100644 assets/textures/overworld-raw.png create mode 100644 assets/textures/overworld.png create mode 100644 src/engine/map/mod.rs diff --git a/assets/textures/overworld-raw.png b/assets/textures/overworld-raw.png new file mode 100644 index 0000000000000000000000000000000000000000..19a368bee42b4f18c8eede736f841039059bee4e GIT binary patch literal 57104 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 literal 0 HcmV?d00001 diff --git a/assets/textures/overworld.png b/assets/textures/overworld.png new file mode 100644 index 0000000000000000000000000000000000000000..f27ff6949467c5f8c848e8155d3dff580a59fbd8 GIT binary patch literal 2453 zcmcgtcTm&I7XF3A5CVjVARQ8#f+$6}A{{XpKzfrRk0QN?7+MUWN>M;TDOW&1L^{I5 zgeIt9K@q`35JW)a5_%Ux0AHN<@4GYa`N!Lxo&DzQoIP{S`S#m1D~k)fa8Wn_0K6vH z^ELngVnYxBgR(bQ+#??VfDFgjUBcUVM54lQp+5dW-Y9%@m^aEh%Ab80HM->Jf|FI? z*_#!Jg~+01Ghdh;j!o1(kf(dMFRfkd(a|HwxKg>DdCwiM5U^mCbjj=|Uzf|XqjfxS zK3zOyI-MCm`)Y%skhieE{$ZbV%(B7ASeY@iW;DKCjc9#(vJv<8Rcv$Df%p_z{jmaIkzp&uWlWDW)jl2i>wz zF9VHi*olI`4b@SyIeGgC#fa5{@Pf}gzT&L87etkeXtWx{pU_k zHT=^NbNCoOt*L7lPFPFx&kxVm4t>Xg5};Uat*_9BY`=Uz=6-7+pYUZ-(|usN)bn^} z?_F0-?!Oe8^!05LgT~>L(u;K}DG=Cq(=s~+vF5|ivJgZqC0_*{GElW%CeUsCfJ1z? z`OGKb%MngYG_(bP-BE=472?VE>C&WHP0vR)ekRqizyFq9R_bHwA^{)F*lcoZs-gXd6|lq15x-Z@@a&YUUY^ z$zu^s+*F7|?gjj;V3-YBo_v5*Tk$Fnxt?VuyOny+(;=w?+H@!TjhU}VzoKF~%G~-> z)f%oaSZLyE*n%*wKQ+#=*w*w+*kxI_NrSXb0?58cnD;XU&o_r1aEjeb+4L?7%skr1DfrOy(qUW6!AcBt3>ogVFIG2}(acJIM1(Jy6L`3)J@MMj|UAYP5FF z*VK2`h6gAC*Q>(t=mHt#Xup-ZZ;FS~LA{BhD)ZrHR@XgV0y!hCGwO$Q8GUn}Wr!zj zXXhMQo9*xeukY~)^ z4ZLyq@iF3>{Vjgep$Lp9)g1L^DxmhArXD|X*;PzXgiahP7oT%HyKA#q!HBDY{VYzf zkJuH0z(vD}bi5^7>7brw7tRAef6e=yl{st+R~XhQ0ss&_zZU4u34|Ei$cZ;G$8dgw zgZZ@({L3GG~A&ogIhoHu~s_SjB{1-iEP;wM(u9l$V zeX{_q&_oYulI&53D~q!VuMjrkaShPK+!1wiD(1%8Lm|IHdFUh>dZz37pBb>$-D!TZ zM0b~qAUby?FN-p?F}n3!3M47_bwaQwwcAY-<2pPSY&;mEi1cKs~^z>R})KRR8yM!F}yi_>B;HQgh>R(TnufT%wC zyt;d*_?W_BI-gV4t}M(O<#D(-K0^RV^7Oc2V6$XOe+*;(MI!Gq(=$bM5$FLyfSsj~ z19_A?CjbLb02u%{{&(=Zet#Pcc}^HVm6xjeb#ue~BlQT99Ms7)N}vD+e33wnbkh3% z`kF(GTe}dn^NV<=8`NhVYWyM%8?xoS&o+6Gz`^; zid#PM(D~d3Mgobv?9v!eDEoE&F~WZ=lxmaR#PCZ(YBYCF6aocw%MET%{wg(K@ayM= z{MUf|(`S+&@4{wI$#$F!gnX~F6%xe_jDR*jRKrS%UBr$%#l!VNr#vbrq+_y%6MX^u za8mcel{(Xh*C@*ejbM})ohUHBpDo1~r6DD8_qOnZg%MD8Rqw_}kM4hTHAt@J&E#eH zaT?V3%_-ID>02PKoh{lYiZ^Pn&{QGh8!}-78w`XL7crOWH O4-<^V`TBG23I77(t;jO~ literal 0 HcmV?d00001 diff --git a/src/engine/map/mod.rs b/src/engine/map/mod.rs new file mode 100644 index 0000000..7018f4a --- /dev/null +++ b/src/engine/map/mod.rs @@ -0,0 +1,128 @@ +use sfml::system::Vector2; +use sfml::graphics::IntRect; + +use engine::texture::Texture; +use engine::renderer::Drawable; +use engine::math::Matrix; + +/// This struct represents the different type of tiles that can exist in our maps. +#[derive(Copy, Clone, PartialEq, Eq)] +pub enum Tile { + /// A tile that contains nothing. + Empty, + + /// A solid tile. + Solid +} + +impl Tile { + /// Returns the offset to the tile in the texture. + pub fn offset(&self) -> (i32, i32) { + match *self { + Tile::Empty => (0, 0), + Tile::Solid => (16, 0), + } + } +} + +/// A tile and its position. +pub struct PositionedTile { + /// The tile of the positioned tile. + pub tile: Tile, + + /// The position of the positioned tile. + pub position: (f32, f32), +} + +impl Drawable for PositionedTile { + fn texture(&self) -> Texture { + Texture::Overworld + } + + fn texture_rect(&self) -> IntRect { + let offset = self.tile.offset(); + IntRect::new(offset.0, offset.1, 16, 16) + } + + fn position(&self) -> Vector2 { + self.position.into() + } +} + +/// The map represents the tiles contained in a level. +pub struct Map { + + /// The tiles contained in the level. + tiles: Matrix, + +} + +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, Tile::Empty); + let rows = tiles.rows(); + + for i in 0 .. tiles.cols() { + tiles[(rows - 1, i)] = Tile::Solid; + } + + tiles[(25, 12)] = Tile::Solid; + tiles[(25, 13)] = Tile::Solid; + tiles[(25, 14)] = Tile::Solid; + tiles[(25, 15)] = Tile::Solid; + + Map { + tiles: tiles, + } + + } + + /// Returns an iterator to the positioned tiles. + pub fn at(&self, row: usize, col: usize) -> PositionedTile { + PositionedTile { + tile: self.tiles[(row, col)], + position: (col as f32 * 16.0, row as f32 * 16.0), + } + } + + /// Returns the number of rows of the map. + pub fn rows(&self) -> usize { + self.tiles.rows() + } + + /// Returns the number of columns of the map. + pub fn cols(&self) -> usize { + self.tiles.cols() + } + + /// Checks whether the vector (old, new) collides with an element of the map. + /// + /// Returns the height of the collision if any. + pub fn collides(&self, old: Vector2, new: Vector2) -> Option { + + let height = new.y - old.y; + let mut y = (old.y / 16.0).ceil() * 16.0; + + while y < new.y { + + let current_height = y - old.y; + let x = old.x + (new.x - old.x) * current_height / height; + + // Find tile on x, y + let row = (y / 16.0) as usize + 2; + let col = (x / 16.0) as usize + 1; + + if let Some(Tile::Solid) = self.tiles.get((row, col)) { + return Some(y); + } + + y += 16.0; + } + + None + } +} + diff --git a/src/engine/math/mod.rs b/src/engine/math/mod.rs index b8ff2a3..29b2909 100644 --- a/src/engine/math/mod.rs +++ b/src/engine/math/mod.rs @@ -45,7 +45,7 @@ impl Matrix where T: Clone { impl Matrix { /// Converts an a pair corresponding to the row and columns into an integer. pub fn to_usize(&self, (row, col): (usize, usize)) -> usize { - self.cols * col + row + self.rows * col + row } /// Returns the number of rows. @@ -57,6 +57,15 @@ impl Matrix { pub fn cols(&self) -> usize { self.cols } + + /// Returns the tile if any, none otherwise. + pub fn get(&self, (row, col): (usize, usize)) -> Option<&T> { + if row < self.rows && col < self.cols { + Some(&self[(row, col)]) + } else { + None + } + } } impl Index<(usize, usize)> for Matrix { diff --git a/src/engine/mod.rs b/src/engine/mod.rs index bd3be80..0d760c1 100644 --- a/src/engine/mod.rs +++ b/src/engine/mod.rs @@ -19,3 +19,6 @@ pub mod renderer; /// This module contains everything related to physics. pub mod physics; + +/// This module contains the map structure. +pub mod map; diff --git a/src/engine/renderer/mod.rs b/src/engine/renderer/mod.rs index 058842a..ab213c8 100644 --- a/src/engine/renderer/mod.rs +++ b/src/engine/renderer/mod.rs @@ -93,6 +93,16 @@ impl Renderer { /// Draws a scene on the window. pub fn draw_scene(&mut self, scene: &Scene) { + let map = scene.map(); + let rows = map.rows(); + let cols = map.cols(); + + for i in 0 .. rows { + for j in 0 .. cols { + self.draw(&map.at(i, j)); + } + } + for c in scene.characters() { self.draw(c); } diff --git a/src/engine/scene/mod.rs b/src/engine/scene/mod.rs index e4e843a..c1aa726 100644 --- a/src/engine/scene/mod.rs +++ b/src/engine/scene/mod.rs @@ -3,6 +3,7 @@ use std::time::Duration; use sfml::window::Event; use engine::character::Character; +use engine::map::Map; /// Contains everything needed to play. pub struct Scene { @@ -10,6 +11,9 @@ pub struct Scene { /// The characters contained in the scene. characters: Vec, + /// The map of the scene. + map: Map, + } impl Scene { @@ -18,6 +22,7 @@ impl Scene { pub fn new() -> Scene { Scene { characters: vec![], + map: Map::new(30, 30), } } @@ -30,10 +35,12 @@ impl Scene { pub fn update(&mut self, duration: &Duration) { for c in &mut self.characters { + let old = c.position; c.update(duration); - if c.position.y > 500.0 { - c.position.y = 500.0; + + if let Some(height) = self.map.collides(old, c.position) { + c.position.y = height; c.speed.y = 0.0; c.ground_collision(); } @@ -52,6 +59,11 @@ impl Scene { &self.characters } + /// Returns a reference to the map. + 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 6ea7057..3d63099 100644 --- a/src/engine/texture/mod.rs +++ b/src/engine/texture/mod.rs @@ -58,6 +58,7 @@ macro_rules! make_textures { make_textures!( Mario, mario, make_mario_texture, "../../../assets/textures/mario.png", + Overworld, overworld, make_overworld_texture, "../../../assets/textures/overworld.png", ); impl TextureManager {