From 388ead607f93a26017fa86b43d0eddb026907301 Mon Sep 17 00:00:00 2001 From: Thomas Gideon Date: Tue, 11 Jul 2017 20:25:54 -0400 Subject: [PATCH] Get wrapping working fully. --- assets/Fresca-Regular.ttf | Bin 0 -> 32644 bytes src/lib.rs | 28 +++++++++++++++++++---- src/object.rs | 46 +++++++++++++++++++++++++++++--------- 3 files changed, 60 insertions(+), 14 deletions(-) create mode 100644 assets/Fresca-Regular.ttf diff --git a/assets/Fresca-Regular.ttf b/assets/Fresca-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f4889a510a0e10b820181dda9b0c4f12b6a3e37a GIT binary patch literal 32644 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, player: Object, @@ -42,16 +45,16 @@ impl Game { self.scene.event(e); if self.up_d { - self.player.mov(&mut self.scene, 0.0, -1500.0 * upd.dt); + self.player.mov(&mut self.scene, 0.0, -MV_FACT * upd.dt); } if self.down_d { - self.player.mov(&mut self.scene, 0.0, 1500.0 * upd.dt); + self.player.mov(&mut self.scene, 0.0, MV_FACT * upd.dt); } if self.left_d { - self.player.mov(&mut self.scene, -1500.0 * upd.dt, 0.0); + self.player.mov(&mut self.scene, -MV_FACT * upd.dt, 0.0); } if self.right_d { - self.player.mov(&mut self.scene, 1500.0 * upd.dt, 0.0); + self.player.mov(&mut self.scene, MV_FACT * upd.dt, 0.0); } } @@ -59,22 +62,39 @@ impl Game { let assets = find_folder::Search::ParentsThenKids(3, 3) .for_folder("assets") .unwrap(); + let ref font = assets.join("Fresca-Regular.ttf"); + let factory = w.factory.clone(); + let mut glyphs = Glyphs::new(font, factory).unwrap(); + let image = Image::new().rect(square(0.0, 0.0, 640.0)); let bg = Texture::from_path(&mut w.factory, assets.join("bg.png"), Flip::None, &TextureSettings::new()).unwrap(); w.draw_2d(e, |c, g| { + let transform = c.transform.trans(10.0, 100.0); + clear([1.0, 1.0, 1.0, 1.0], g); for number in 0..100 { let x: f64 = (number % 10 * 64).into(); let y: f64 = (number / 10 * 64).into(); image.draw(&bg, &Default::default(), c.transform.trans(x, y).zoom(0.1), g); } + if let Some(player_sprite) = self.scene.child(self.player.sprite_id) { + let (x, y) = player_sprite.get_position(); + text::Text::new_color([0.0, 1.0, 0.0, 1.0], 32).draw( + &format!("x: {}, y: {}", x.trunc(), y.trunc()), + &mut glyphs, + &c.draw_state, + transform, g + ); + } + self.scene.draw(c.transform, g); }); } + // TODO use an enum to track requested movement direction pub fn on_input(&mut self, inp: Input) { match inp { Input::Press(but) => { diff --git a/src/object.rs b/src/object.rs index a7c406d..0aae264 100644 --- a/src/object.rs +++ b/src/object.rs @@ -7,10 +7,11 @@ use uuid::Uuid; use std::rc::Rc; +// TODO add size of player sprite for boundary checking pub struct Object { - sprite_id: Uuid, - x: f64, - y: f64, + pub sprite_id: Uuid, + pub x: f64, + pub y: f64, } impl Object { @@ -27,16 +28,41 @@ impl Object { sprite.set_position(320.0, 240.0); let sprite_id = scene.add_child(sprite); Object { - x: 0.0, - y: 0.0, + x: 320.0, + y: 240.0, sprite_id: sprite_id, } } - pub fn mov(&mut self, scene: &mut Scene>, x: f64, y: f64) { - self.x += x; - self.y += y; - let mov = Action(Ease(EaseFunction::CubicOut, Box::new(MoveBy(1.0, x, y)))); - scene.run(self.sprite_id, &mov); + pub fn mov(&mut self, scene: &mut Scene>, input_x: f64, input_y: f64) { + if let Some(sprite) = scene.child(self.sprite_id) { + let (sprite_x, sprite_y) = sprite.get_position(); + self.x = sprite_x; + self.y = sprite_y; + } + let mut wrapped = false; + // TODO pass in window size + if self.x > 640.0 + 32.0 { + self.x = -32.0; + wrapped = true; + } else if self.x < -32.0 { + self.x = 640.0 + 32.0; + wrapped = true; + } + if self.y > 480.0 + 32.0 { + self.y = -32.0; + wrapped = true; + } else if self.y < -32.0 { + self.y = 480.0 + 32.0; + wrapped = true; + } + self.y += input_y; + if wrapped { + scene.stop_all(self.sprite_id); + if let Some(ref mut sprite) = scene.child_mut(self.sprite_id) { + sprite.set_position(self.x, self.y); + } + } + scene.run(self.sprite_id, &Action(Ease(EaseFunction::CubicOut, Box::new(MoveBy(1.0, input_x, input_y))))); } }