X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fcore%2Fobject%2Fcharacter.rs;h=bf79700ec0d4662e02b4397e6d14c9ac59df6554;hb=ebd7419c8e276d32a533c64786e1830896934edc;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..bf79700 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,81 @@ 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 { + body.vel += _ctrl.mov.to_point() * 0.2; + let (mut pos, mut vel) = wall.from_2d(&body.pos, &body.vel); + vel *= 0.99; + pos += vel; + if pos < 0.0 { + let w = wall.previous(); + pos += w.length(); + let (p, v) = w.to_2d(pos, vel); + body.pos = p; + body.vel = v; + body.standing_on = Some(w); + } else if pos > wall.length() { + let w = wall.next(); + pos -= wall.length(); + let (p, v) = w.to_2d(pos, vel); + body.pos = p; + body.vel = v; + body.standing_on = Some(w); + } else { + let (p, v) = wall.to_2d(pos, vel); + body.pos = p; + body.vel = v; + } + } + + None + } +} + +////////// WALKING ///////////////////////////////////////////////////////////// + +struct WalkTrigger; + +impl Trigger for WalkTrigger { + fn update(&mut self, body: &Body, ctrl: &Controller, _dt: Duration) -> Option> { + if body.standing_on.is_some() && (ctrl.mov.x < -0.1 || ctrl.mov.x > 0.1) { + Some(Box::new(WalkState)) + } else { + None + } + } +} + +struct WalkState; + +impl State for WalkState { + fn enter(&mut self, body: &mut Body, ctrl: &Controller, _objects: &mut Objects) { + if let Some(wall) = &body.standing_on { + if ctrl.mov.to_point().length() < 0.1 { + body.vel = wall.normal().into(); + } else { + body.vel = ctrl.mov.to_point(); + } + body.vel *= 5.0; + body.pos += body.vel * 0.1; + body.standing_on = None; + } + } + + fn update(&mut self, body: &mut Body, ctrl: &Controller, _objects: &mut Objects, lvl: &Level, _dt: Duration) -> Option> { + body.vel += lvl.gravity; + body.pos += body.vel; + + match ctrl.mov.x { + v if v < -0.9 && body.vel.x > -5.0 => { body.vel.x -= 0.5 } + v if v > 0.9 && body.vel.x < 5.0 => { body.vel.x += 0.5 } + _ => {} } None @@ -190,12 +261,12 @@ struct JumpState; impl State for JumpState { fn enter(&mut self, body: &mut Body, ctrl: &Controller, _objects: &mut Objects) { if let Some(wall) = &body.standing_on { - if ctrl.mov.to_point().length() < 0.1 { - body.vel = wall.normal().into(); + let direction = if ctrl.mov.to_point().length() < 0.1 { + wall.normal().into() } else { - body.vel = ctrl.mov.to_point(); - } - body.vel *= 5.0; + ctrl.mov.to_point() + }; + body.vel += direction * 5.0; body.pos += body.vel * 0.1; body.standing_on = None; }