X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fcore%2Fobject%2Fcharacter.rs;h=b2ec5cf7b6e76afba64ae322ba17fc1b39d754e7;hb=d67471eea7777938ffe9fb82ac2e060133b655d9;hp=3d789f225a25549fc4569b738f3b504b110ef4ed;hpb=856c3740c76feea6a82cc95b5e190b1ccd165621;p=kaka%2Frust-sdl-test.git diff --git a/src/core/object/character.rs b/src/core/object/character.rs index 3d789f2..b2ec5cf 100644 --- a/src/core/object/character.rs +++ b/src/core/object/character.rs @@ -72,10 +72,9 @@ impl Object for Character { if let Intersection(wall, pos) = lvl.intersect_walls(self.body.pos - self.body.vel, self.body.pos) { self.body.standing_on = Some(wall); self.body.pos = pos; - self.body.vel = point!(0.0, 0.0); self.state.exit(); - self.state = Box::new(StandState); + self.state = Box::new(StandState); // eller loopa igenom alla triggers eller states för att hitta rätt state? self.state.enter(&mut self.body, &ctrl, objects); } } @@ -162,9 +161,25 @@ impl State for FallState { struct StandState; impl State for StandState { + fn enter(&mut self, body: &mut Body, _ctrl: &Controller, _objects: &mut Objects) { + if let Some(wall) = &body.standing_on { + body.vel = body.vel.project_onto(wall.angle()); + } + } + fn update(&mut self, body: &mut Body, _ctrl: &Controller, _objects: &mut Objects, _lvl: &Level, _dt: Duration) -> Option> { - if let Some(_wall) = &body.standing_on { - body.vel *= 0.9; + if let Some(wall) = &body.standing_on { + let (mut pos, mut vel) = wall.from_2d(&body.pos, &body.vel); + vel *= 0.9; + pos += vel; + let (p, v) = wall.to_2d(pos, vel); + body.pos = p; + body.vel = v; + } + + None + } +} } None