From d62e585d9f3170c3ed49d785cc879ae2448eb462 Mon Sep 17 00:00:00 2001 From: Thomas Gideon Date: Thu, 13 Jul 2017 16:16:14 -0400 Subject: [PATCH] Add star mob. --- Cargo.toml | 1 + assets/soot.png | Bin 606 -> 3029 bytes assets/soot.xcf | Bin 1839 -> 3471 bytes assets/star.png | Bin 0 -> 1547 bytes assets/star.svg | 80 ++++++++++++++++++++++++++++++++++ src/lib.rs | 75 +++++++++++++------------------ src/main.rs | 3 +- src/{mobs.rs => mobs/hero.rs} | 37 +++++++--------- src/mobs/mod.rs | 22 ++++++++++ src/mobs/star.rs | 62 ++++++++++++++++++++++++++ 10 files changed, 213 insertions(+), 67 deletions(-) create mode 100644 assets/star.png create mode 100644 assets/star.svg rename src/{mobs.rs => mobs/hero.rs} (66%) create mode 100644 src/mobs/mod.rs create mode 100644 src/mobs/star.rs diff --git a/Cargo.toml b/Cargo.toml index eed71c3..daf600f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,3 +11,4 @@ piston2d-sprite = "0.36.0" piston2d-graphics = "0.21.1" find_folder = "0.3.0" uuid = "0.1.17" +rand = "0.3" diff --git a/assets/soot.png b/assets/soot.png index 190cc8b43bb4e125085617b0d0b8494cb18541a0..31791765f33bbd1bcfae5cdc67436a819326f55f 100644 GIT binary patch delta 2937 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 delta 495 zcmVUUvlU<&XTPuG7!bwCyRCwC$nXyj8Fc5}+N4!C$4zQLT zOQ<|U*A96H-Uwc!uKsQCdgI7Q4gIn!AL&`zxx94QJsIU zgL_SI>=J7f(_R290lYM>_1W?-Wab7!q zlQ^tYtpXEPq<+Z)WPcbch&z)oBIqY;;>li)^UrROo@CP+;J3_G#N==efgouKa6 zK7;dnje7uO{1#Ygt^fhRHlg!d?IkcI9{p>r^+9O}a6g3=V2BX0>@MY}cg$OQfJwYO zsjCV0b*|p8KV0~%*XkbAu+eZX6xP-89fyB~>hq_T`$mhLSsmJ(la3E7{1*|rL}{Bb llR%ZT1qdO85JCuhb^p diff --git a/assets/soot.xcf b/assets/soot.xcf index 8bff674b2417f5429b48c3f3f40b2ee1bca39e49..ff3ad766cca5835bf552f4ddbd52989c8a773831 100644 GIT binary patch literal 3471 zcmeHKc~q3w6~D7E3<}6nDabZ}Y>AMu#2#%mqBJEgBrzJQ5*GpkOa+Ez5OAZ$n4})b zrm4pyN>oT1F~*>U;PJ$W5kw^+6174k35&`OGtA2OeYf|`3_14H{@c?(^3J*Q-Q{=R za^HRTy~$MPy}B~#-wR-a#Xoml7Sh$5(-qQT2;EDSgp-cBrZvMmRUS(P<2jfrYa`0K%LHX3@t3?p6XLv#*ROi`{{t5D~rWvL38wr>o=NZhgxK}bI$sH8i$U`E_A8wA##>8W zAsi+=6OM2wL1XPRz5q^vJIy3;pD5)p6MCcH?8al-4#c|^zo&TQUc*lcZX$NR8po^) zT98}ieF0JETn(VC6L6z@Eu!iATC$qsZ=uj|ybnbZ*5cX&YUcq&I$8l>XjpRAc^h{@Q+jLXXH!AbvB)NeYoo zRGmI;M=|zW?(w=ky9N+9LUVsO1eK5Bmth3vWmQy3#{XFmu&SyL(K>9RGBq%PTu+x3 zF+aGa!*4-zSy-IXg|1jbC0_gnujHQ?oInpWepKAs;+~APN}8E%QN~Y)7A_sZQ6rC@ zXfTf9C66T*y!#a0+y)AGSW(B=&ewG4je#6m=|=Vkip5#BsCV@21K` z03SQba zZ)~HW&>TY0%nzT>uEaNB3Yd2w{% zMkRL|(K@KpX_=}LXCZfCbs)``mwd>ChGkwfA_b13cNAlg?^n?%Txi-=60C+}$tla& zR7(UBEnTO-wc^(#Tgwr70Utrj{mWyB!wjM|F^G9!NQccNbKZaal6Ao!UG{7O4Z%nK z17lIhXWlg5)O#fHhJ3P^-InaR^uq|py0hF~&*JO^=4Xapb=R~Qm~yZ_i7DygOZf`- zz~YaGNNY9soGYW81yeg>G0b|Yhbj3997|?Ot2v8aU`g%F|N8b+^~Z;qf74-r$mkb3 znD*ohfa)8hH7I=`rR)2fqqL$Zv{cdyAo_9Y!zfEEZ$)gr%2BW<%- zl!oUkT$&momjU%Xy|x3cQw6l9y^dsv_9cyt5emZ9(Ny{-U6KHHwq->2JeU8_=pO-M1s$K66`<7PIBb zfZKvvIugW(*|URVM^OsgF5FHG=_TxEHgKx8jX=d4CSQzX1&}4BYVB{{$@k{N-oDK1 mfBE*6umSDOjV?A@i>F^k^!9br(3iD%JGqrHq09sDLHZXW?_9P3 literal 1839 zcmds1O-~b16umP*%ZDfkG+Im;rHj^3(n++@g~J)8al*lA)UaoV|_J2S-r>(+(0x%19F_uTjHd!09yUEk9V%2lmu*Gz&L zp$ndeD+(S9@X3vjMB=bT_&9t5o(Qq%mY{!uan{1L*>ba9HyaLOlH~2@Ewkj9745z4 z>}W3wo3AA^=S%H+$uhH6%dQ9~YA@Y(4r`{?Zr1EdW;$K9%FSA{rKSBL+p@MxT5dh( z+X$eCsSHZDN0bip+TVec9<=vLWxHWr%D^3t;6f_9->@CcZj^V-wp2H()wbzewkO4Z zQUPrdjX~H`kCKtL#uYKa_R?(JCkq8E%tgvQpwf3U7d9D zimb9*B+@Z@I_2nFkBPZQ)RnOd#_Ng3XQ1(!YgPKSc{{Op|MzMW2~v2RT)YEJkAYSC zDL4oe5Q-4;%lcV`zkXuAIOQ#90%e+19^{XCiru_$4{5*)e3SbNkfdpmGnC*}8sh;a zc?l@V{S)Z!V?wXMcfj1`!8y|dWV{rHWft!rp?*cc8Gt597e&kLogwNo9ii4cf<(d8 zHYa(--$)8{KZOM(;hl2=57c3gT#%qZt5SW!i|n0H3f&Ug8YHCwh5N*hph`(C@jQDu zd}%z%p@vYCK?Y17`yCwTX)O?{{C$g0FZdLvgQeH#hkvAgpai7~uggSAc-nHfPlb3U zkB<6TUTq_ExrY;*rM7=3MqO0o|LH{?lLZ5d$>kL@LdQjorGEHTN48QIFcD$o}Q`X!w1Sc3f!+W`vGhT)t^yM&R)k38GsBreBL&*Gm8Z diff --git a/assets/star.png b/assets/star.png new file mode 100644 index 0000000000000000000000000000000000000000..b25c3a6b8dd077b3967a82cda02bd498c1044749 GIT binary patch literal 1547 zcmV+m2K4!fP)Z)mJmfgv&b|ZHk)9p$bZP^XW zrZOs`f{37~=mOm@P!Z9Gf+8eQG99-<7K}B*3anOVS4+Aqnpx02!&cXIbLM^euvFIW zv~$kRyfcx%kMlmybN=T)@9ms<2X?cY-Bb!QlPz60p^_S0B`;2<;{tZ{K4qCthE+;J z#SE~8+3{dEAv+Z7zP3_2D%S&s={97003bKVG9MmW2^keJz!tAQ8}Cos?6mR<>LZ8&_QsmY z;La~T!wb`0Huv+<}6MDHnAkNyg$vBtSY>J7y@N6z+PK@7|zWpX;JTPx0cTFC9Mg>o0*HiS~|zmv+Z&4 zlS*A1(^?|8fRW#?)6AK@r6@UM1I)~^Bzq*@P9}1Vn2w6Qmm6hr4kA4d!n;?j8l-Cj`=Z3>XZ(30UemK)L2%RroJmWv)Dk(v`vJl5h;bY$;hHa zT0>y&TgbQLl%;EQyRM(KwNPk51MKB5>)2yU1AgbpNR2?rC!jFMBi4hpV=l{K4Ie9| zoqx9O8fuHOhZAW!*fc!HSM|4?81*350`1g|ULgQ$&Q8N~C)mCfRu>TcNNsdu-#)-^ z%mUw3R!~Tk10K<=`YnGB0bBOr7`E2Fi2MN+R2Bx+Jfq9%m%=VPLCu`r#c$jX+EF=W zA<)}@+&uhaE3B)hY#?%vgR}6$LZFRw@BP%SpY(ec(4`IUA^&PPQK4|#fd_Tn#J~0M zfggrGNxg*hK?qr4a0dA&lumu!uVtWcJtR-h=0`DYD!aBYEL8fWcL!=H_&BU1#W>yzY`59`&HQ{Rc3m3(bC{|3zm#AVC&uL5b>m zAIJcg8&3QaIX@$olZ#q(Wy81sY}Cak`~WNj7FuTY(U_VLXBGT!!9Xbf5J=bqirxnA z1g%6-E4IE(m!*q(lce<2PN37wo?}TzJ@|7$r-Rk~dt&^pa54jI5Ccq`5Utck%QUNg zOQLH4l0483v|H;(&$2alDn=7V!+;h+rY0tYSHDX&SZ59qoxzPfmWc^ zG9CK>XJGC;BQ5Tf5%Xb!P@STcC8qPe3!!Y?-!+$en|!35#z) xA}rI^Xp6Jg+WeJObEe45oHci(Dy`!`$M54R$4?cq7NP(E002ovPDHLkV1k~9<6!^* literal 0 HcmV?d00001 diff --git a/assets/star.svg b/assets/star.svg new file mode 100644 index 0000000..fc0c008 --- /dev/null +++ b/assets/star.svg @@ -0,0 +1,80 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/lib.rs b/src/lib.rs index 85937d7..f241e2a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ extern crate find_folder; extern crate gfx_device_gl; extern crate graphics; extern crate piston_window; +extern crate rand; extern crate sprite; extern crate uuid; @@ -12,50 +13,33 @@ use gfx_device_gl::Resources; use graphics::Image; use graphics::rectangle::square; use piston_window::*; -use mobs::Hero; +use mobs::{Hero, Star}; use sprite::*; -// TODO move this into the player object -const MV_FACT: f64 = 2500.0; - pub struct Game { scene: Scene>, player: Hero, - up_d: bool, - down_d: bool, - left_d: bool, - right_d: bool, + star: Star, } impl Game { pub fn new(w: &mut PistonWindow) -> Game { let mut scene = Scene::new(); + let star = Star::new(w, &mut scene); let player = Hero::new(w, &mut scene); Game { scene: scene, player: player, - up_d: false, - down_d: false, - left_d: false, - right_d: false, + star: star, } } - pub fn on_update(&mut self, e: &Input, upd: UpdateArgs) { + pub fn on_update(&mut self, e: &Input, upd: UpdateArgs, w: &PistonWindow) { self.scene.event(e); - if self.up_d { - self.player.mov(&mut self.scene, 0.0, -MV_FACT * upd.dt); - } - if self.down_d { - self.player.mov(&mut self.scene, 0.0, MV_FACT * upd.dt); - } - if self.left_d { - self.player.mov(&mut self.scene, -MV_FACT * upd.dt, 0.0); - } - if self.right_d { - self.player.mov(&mut self.scene, MV_FACT * upd.dt, 0.0); - } + self.star.mov(w, &mut self.scene, upd.dt); + + self.player.mov(w, &mut self.scene, upd.dt); } pub fn on_draw(&mut self, e: &Input, _: RenderArgs, w: &mut PistonWindow) { @@ -72,23 +56,26 @@ impl Game { 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 - ); - } + + text::Text::new_color([0.0, 1.0, 0.0, 1.0], 10).draw( + &format!("{} x: {}, y: {}", self.player.sprite_id, self.player.x.trunc(), self.player.y.trunc()), + &mut glyphs, + &c.draw_state, + c.transform.trans(10.0, 100.0), g + ); + + text::Text::new_color([0.0, 1.0, 0.0, 1.0], 10).draw( + &format!("{} x: {}, y: {}", self.star.sprite_id, self.star.x.trunc(), self.star.y.trunc()), + &mut glyphs, + &c.draw_state, + c.transform.trans(10.0, 110.0), g + ); self.scene.draw(c.transform, g); }); @@ -100,16 +87,16 @@ impl Game { Input::Press(but) => { match but { Button::Keyboard(Key::Up) => { - self.up_d = true; + self.player.dir = (self.player.dir.0, -1.0); } Button::Keyboard(Key::Down) => { - self.down_d = true; + self.player.dir = (self.player.dir.0, 1.0); } Button::Keyboard(Key::Left) => { - self.left_d = true; + self.player.dir = (-1.0, self.player.dir.1); } Button::Keyboard(Key::Right) => { - self.right_d = true; + self.player.dir = (1.0, self.player.dir.1); } _ => {} } @@ -117,16 +104,16 @@ impl Game { Input::Release(but) => { match but { Button::Keyboard(Key::Up) => { - self.up_d = false; + self.player.dir = (self.player.dir.0, 0.0); } Button::Keyboard(Key::Down) => { - self.down_d = false; + self.player.dir = (self.player.dir.0, 0.0); } Button::Keyboard(Key::Left) => { - self.left_d = false; + self.player.dir = (0.0, self.player.dir.1); } Button::Keyboard(Key::Right) => { - self.right_d = false; + self.player.dir = (0.0, self.player.dir.1); } _ => {} } diff --git a/src/main.rs b/src/main.rs index e5e5f86..593293f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,12 +6,13 @@ use piston_window::*; fn main() { let mut window: PistonWindow = WindowSettings::new("Ghostly Adventure", [640, 480]) .exit_on_esc(true) + .resizable(false) .build() .unwrap(); let mut game = ghostly::Game::new(&mut window); while let Some(e) = window.next() { match e { - Input::Update(upd) => game.on_update(&e, upd), + Input::Update(upd) => game.on_update(&e, upd, &window), Input::Render(ren) => game.on_draw(&e, ren, &mut window), _ => game.on_input(e), } diff --git a/src/mobs.rs b/src/mobs/hero.rs similarity index 66% rename from src/mobs.rs rename to src/mobs/hero.rs index cb6dbc6..77ffc41 100644 --- a/src/mobs.rs +++ b/src/mobs/hero.rs @@ -5,13 +5,15 @@ use piston_window::*; use sprite::*; use uuid::Uuid; use std::rc::Rc; +use mobs::wrap; - -// TODO add size of player sprite for boundary checking pub struct Hero { pub sprite_id: Uuid, + pub dir: (f64, f64), pub x: f64, pub y: f64, + w: f64, + h: f64, } impl Hero { @@ -26,43 +28,34 @@ impl Hero { .unwrap()); let mut sprite = Sprite::from_texture(tex); sprite.set_position(320.0, 240.0); + let bounds = sprite.bounding_box(); let sprite_id = scene.add_child(sprite); Hero { x: 320.0, y: 240.0, + w: bounds[2], + h: bounds[3], + dir: (0.0, 0.0), sprite_id: sprite_id, } } - pub fn mov(&mut self, scene: &mut Scene>, input_x: f64, input_y: f64) { + pub fn mov(&mut self, w: &PistonWindow, scene: &mut Scene>, dt: 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; + let (wrapped, new_x, new_y) = wrap((w.size().width.into(), w.size().height.into()), (self.w, self.h), (self.x, self.y)); if wrapped { - scene.stop_all(self.sprite_id); + self.x = new_x; + self.y = new_y; 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))))); + let mov_x = self.dir.0 * 2.0; + let mov_y = self.dir.1 * 2.0; + scene.run(self.sprite_id, &Action(Ease(EaseFunction::CubicOut, Box::new(MoveBy(dt * 0.75, mov_x, mov_y))))); } } diff --git a/src/mobs/mod.rs b/src/mobs/mod.rs new file mode 100644 index 0000000..560f75c --- /dev/null +++ b/src/mobs/mod.rs @@ -0,0 +1,22 @@ +pub use self::hero::Hero; +pub use self::star::Star; + +mod hero; +mod star; + +// TODO use window::size +pub fn wrap(win: (f64, f64), bounds: (f64, f64), pos: (f64, f64)) -> (bool, f64, f64) { + let new_x = wrap_dim(win.0, bounds.0, pos.0); + let new_y = wrap_dim(win.1, bounds.1, pos.1); + (new_x != pos.0 || new_y != pos.1, new_x, new_y) +} + +fn wrap_dim(win_dim: f64, sprite_dim: f64, pos_dim: f64) -> f64 { + if pos_dim > win_dim + sprite_dim / 2.0 { + -sprite_dim / 2.0 + } else if pos_dim < -sprite_dim / 2.0 { + win_dim + sprite_dim / 2.0 + } else { + pos_dim + } +} diff --git a/src/mobs/star.rs b/src/mobs/star.rs new file mode 100644 index 0000000..ed65061 --- /dev/null +++ b/src/mobs/star.rs @@ -0,0 +1,62 @@ +use ai_behavior::Action; +use find_folder; +use gfx_device_gl::Resources; +use piston_window::*; +use sprite::*; +use uuid::Uuid; +use rand; +use std::rc::Rc; +use super::wrap; + + +pub struct Star { + pub sprite_id: Uuid, + pub x: f64, + pub y: f64, + w: f64, + h: f64, +} + +impl Star { + pub fn new(w: &mut PistonWindow, scene: &mut Scene>) -> Star { + let assets = find_folder::Search::ParentsThenKids(3, 3) + .for_folder("assets") + .unwrap(); + let tex = Rc::new(Texture::from_path(&mut w.factory, + assets.join("star.png"), + Flip::None, + &TextureSettings::new()) + .unwrap()); + let mut sprite = Sprite::from_texture(tex); + sprite.set_scale(0.5, 0.5); + sprite.set_position(30.0, 32.0); + let bounds = sprite.bounding_box(); + let sprite_id = scene.add_child(sprite); + Star { + x: 32.0, + y: 32.0, + w: bounds[2], + h: bounds[3], + sprite_id: sprite_id, + } + } + + pub fn mov(&mut self, w: &PistonWindow, scene: &mut Scene>, dt: 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 (wrapped, new_x, new_y) = wrap((w.size().width.into(), w.size().height.into()), (self.w, self.h), (self.x, self.y)); + if wrapped { + if let Some(ref mut sprite) = scene.child_mut(self.sprite_id) { + self.x = new_x; + self.y = new_y; + sprite.set_position(self.x, self.y); + } + } + let mov_x = rand::random::() * 0.5; + let mov_y = rand::random::() * 0.5; + scene.run(self.sprite_id, &Action(Ease(EaseFunction::CubicOut, Box::new(MoveBy(dt * 0.75, mov_x, mov_y))))); + } +}