diff --git a/engine/src/actors.rs b/engine/src/actors.rs index eca9a8d..bbe6144 100644 --- a/engine/src/actors.rs +++ b/engine/src/actors.rs @@ -88,17 +88,29 @@ impl Actor { if self.collides_at(grid, self.x, new_y) { if self.vy > 0.0 { - let mut sy = new_y; - while sy <= new_y + self.h as f32 && self.collides_at(grid, self.x, sy) { - sy -= 1.0; + let mut gy = (self.y + self.h as f32) as u32; + let max_y = (new_y + self.h as f32 + 2.0) as u32; + while gy <= max_y.min(grid.height) { + if grid.get(self.x.floor() as u32, gy) != 0 { + let props = &crate::material::PROPS[grid.get(self.x.floor() as u32, gy) as usize]; + if props.is_solid && !props.is_powder { + self.y = gy as f32 - self.h as f32; + break; + } + } + gy += 1; } - self.y = sy; } else { - let mut sy = new_y; - while sy >= new_y - self.h as f32 && self.collides_at(grid, self.x, sy) { - sy += 1.0; + let mut gy = (new_y - 2.0).max(0.0) as u32; + while gy > 0 { + let mat = grid.get(self.x.floor() as u32, gy); + let props = &crate::material::PROPS[mat as usize]; + if props.is_solid && !props.is_powder { + self.y = (gy + 1) as f32; + break; + } + gy -= 1; } - self.y = sy; } self.vy = 0.0; } else {