canMove method
bool
canMove(
- Direction direction, {
- double? displacement,
- Iterable<
ShapeHitbox> ? ignoreHitboxes,
Check if the component can move in the specified direction without collision
This is an optimized version of the canMove function that:
- Uses fewer raycasts for better performance
- Has cleaner collision detection logic
- Properly handles diagonal movement checking
Implementation
bool canMove(
Direction direction, {
double? displacement,
Iterable<ShapeHitbox>? ignoreHitboxes,
}) {
// Calculate maximum distance to check based on speed and delta time
final maxDistance = displacement ?? (speed * (lastDt * 2));
// For diagonal directions, check both component directions
switch (direction) {
case Direction.upLeft:
return canMove(
Direction.up,
displacement: maxDistance,
ignoreHitboxes: ignoreHitboxes,
) &&
canMove(
Direction.left,
displacement: maxDistance,
ignoreHitboxes: ignoreHitboxes,
);
case Direction.upRight:
return canMove(
Direction.up,
displacement: maxDistance,
ignoreHitboxes: ignoreHitboxes,
) &&
canMove(
Direction.right,
displacement: maxDistance,
ignoreHitboxes: ignoreHitboxes,
);
case Direction.downLeft:
return canMove(
Direction.down,
displacement: maxDistance,
ignoreHitboxes: ignoreHitboxes,
) &&
canMove(
Direction.left,
displacement: maxDistance,
ignoreHitboxes: ignoreHitboxes,
);
case Direction.downRight:
return canMove(
Direction.down,
displacement: maxDistance,
ignoreHitboxes: ignoreHitboxes,
) &&
canMove(
Direction.right,
displacement: maxDistance,
ignoreHitboxes: ignoreHitboxes,
);
case Direction.up:
case Direction.down:
case Direction.left:
case Direction.right:
return !_hasCollisionInDirection(
direction,
maxDistance,
ignoreHitboxes,
);
}
}