diff --git a/physics_engine.vhd b/physics_engine.vhd index a1d75b6..a96e367 100644 --- a/physics_engine.vhd +++ b/physics_engine.vhd @@ -192,8 +192,9 @@ begin end if; -- == LEFT WALL == - if px(9) = '1' or px <= LEFT_WALL then - px := LEFT_WALL; + -- Detect underflow: moving left (vx negative) but px wrapped to > pos_x + if (vx(9) = '1' and px > pos_x) or px <= LEFT_WALL + SIZE then + px := LEFT_WALL + SIZE; bounced := '1'; bounce_wall := '1'; bounce_speed := (not vx) + 1; vx := (not vx) + 1; @@ -203,8 +204,8 @@ begin end if; -- == RIGHT WALL == - if px >= RIGHT_WALL then - px := RIGHT_WALL; + if px >= RIGHT_WALL - SIZE then + px := RIGHT_WALL - SIZE; bounced := '1'; bounce_wall := '1'; bounce_speed := vx; vx := (not vx) + 1; diff --git a/visualizer.py b/visualizer.py index 25a4b4f..e8d31e5 100644 --- a/visualizer.py +++ b/visualizer.py @@ -32,7 +32,7 @@ BOUNCE_SHIFT = 3 # energy loss = vel >> 3 (keep 87.5%) GROUND = 440 CEILING = 16 LEFT_WALL = 8 -RIGHT_WALL = 620 +RIGHT_WALL = 631 GROUND_TOP = 448 CEIL_BOT = 8 @@ -215,8 +215,8 @@ def main(): vy = to_unsigned(svy) # --- Left wall bounce --- - if px <= LEFT_WALL: - px = LEFT_WALL + if px <= LEFT_WALL + SIZE: + px = LEFT_WALL + SIZE bounced = True; bounce_wall = True bounce_speed = abs(to_signed(vx)) vx = negate(vx) @@ -226,8 +226,8 @@ def main(): vx = to_unsigned(svx) # --- Right wall bounce --- - if px >= RIGHT_WALL: - px = RIGHT_WALL + if px >= RIGHT_WALL - SIZE: + px = RIGHT_WALL - SIZE bounced = True; bounce_wall = True bounce_speed = abs(to_signed(vx)) vx = negate(vx)