Calculations from the world's 2D to the wall's 1D
[kaka/rust-sdl-test.git] / src / core / object / character.rs
index 3d789f2..b2ec5cf 100644 (file)
@@ -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<Box<dyn State>> {
-       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