canMove method

bool canMove(
  1. Direction direction, {
  2. double? displacement,
  3. 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,
      );
  }
}