seeAndMoveToAttackRange<T extends GameComponent> method

void seeAndMoveToAttackRange<T extends GameComponent>({
  1. dynamic positioned(
    1. T
    )?,
  2. BoolCallback? notObserved,
  3. dynamic observed(
    1. T
    )?,
  4. double radiusVision = 32,
  5. double? visionAngle,
  6. double? angle,
  7. double? minDistanceFromPlayer,
  8. bool useDiagonal = true,
})

Checks whether the T components are within attack range. If so, move to them and call positioned when in range. visionAngle in radians. angle in radians.

Implementation

void seeAndMoveToAttackRange<T extends GameComponent>({
  Function(T)? positioned,
  // return true to stop move.
  BoolCallback? notObserved,
  Function(T)? observed,
  double radiusVision = 32,
  double? visionAngle,
  double? angle,
  double? minDistanceFromPlayer,
  bool useDiagonal = true,
}) {
  if (_comp is WithLife && _comp.isDead) {
    return;
  }

  seeComponentType<T>(
    radiusVision: radiusVision,
    visionAngle: visionAngle,
    angle: angle ?? _defaultAngle(),
    observed: (targets) {
      final target = targets.first;
      observed?.call(target);
      final minD = minDistanceFromPlayer ?? (radiusVision - 5);
      final movement = _movement;
      if (movement == null) {
        return;
      }
      if (useDiagonal) {
        final inDistance = movement.keepDistance(target, minD);
        if (inDistance) {
          movement.direction = movement.util.getDirectionToTarget(target);
          if (!movement.isIdle) {
            movement.stop();
          }
          positioned?.call(target);
        }
      } else {
        movement.positionsItselfAndKeepDistance(
          target,
          minDistanceFromPlayer: minD,
          radiusVision: radiusVision,
          positioned: (t) {
            movement.direction = movement.util.getDirectionToTarget(t);
            if (!movement.isIdle) {
              movement.stop();
            }
            positioned?.call(t);
          },
        );
      }
    },
    notObserved: () {
      final canStop = notObserved?.call() ?? true;
      if (canStop) {
        _movement?.stop();
      }
    },
  );
}