32 lines
1.6 KiB
Markdown
32 lines
1.6 KiB
Markdown
# Design: Physics & Puck Dynamics (M2)
|
|
|
|
## Goal
|
|
Implement basic physical properties for the puck to make movement feel natural: gradual slowing down (friction) and energy loss upon hitting boundaries (restitution).
|
|
|
|
## Architecture
|
|
The physics logic will be integrated into the `World.Update` loop. Constants for physical properties will be defined to allow easy tuning of the game feel.
|
|
|
|
## Implementation Details
|
|
|
|
### 1. Physical Constants
|
|
The following constants will be introduced:
|
|
- `PuckFriction`: Multiplier applied to velocity every frame (e.g., `0.99`).
|
|
- `PuckRestitution`: Multiplier applied to velocity upon boundary collision (e.g., `0.8`).
|
|
- `StopThreshold`: Minimum velocity magnitude below which the puck is forced to a complete stop (e.g., `0.1`).
|
|
|
|
### 2. Movement Logic (World.Update)
|
|
The update loop for the puck will follow these steps:
|
|
1. **Apply Friction**: `velocity = velocity * PuckFriction`.
|
|
2. **Stop Check**: If `length(velocity) < StopThreshold`, then `velocity = (0, 0)`.
|
|
3. **Position Update**: `position = position + velocity`.
|
|
4. **Boundary Collision**:
|
|
- If the puck hits a boundary (considering its radius):
|
|
- Invert the velocity component perpendicular to the boundary.
|
|
- Multiply the resulting velocity by `PuckRestitution`.
|
|
- **Correction**: Snap the puck's position to be exactly on the boundary edge to prevent it from getting stuck inside the wall.
|
|
|
|
## Success Criteria
|
|
- The puck gradually slows down and eventually stops.
|
|
- The puck loses speed after bouncing off the walls.
|
|
- The puck does not get stuck in the boundaries.
|