seeAndMoveToPlayer method

PolygonShape? seeAndMoveToPlayer({
  1. dynamic closePlayer(
    1. Player
    )?,
  2. BoolCallback? notObserved,
  3. VoidCallback? observed,
  4. VoidCallback? notCanMove,
  5. double radiusVision = 32,
  6. double margin = 2,
  7. double? visionAngle,
  8. double? angle,
  9. bool runOnlyVisibleInScreen = true,
  10. MovementAxis movementAxis = MovementAxis.all,
})

Checks if the player is within range. If so, move to it. visionAngle in radians. angle in radians.

Implementation

PolygonShape? seeAndMoveToPlayer({
  Function(Player)? closePlayer,
  // return true to stop move.
  BoolCallback? notObserved,
  VoidCallback? observed,
  VoidCallback? notCanMove,
  double radiusVision = 32,
  double margin = 2,
  double? visionAngle,
  double? angle,
  bool runOnlyVisibleInScreen = true,
  MovementAxis movementAxis = MovementAxis.all,
}) {
  if (runOnlyVisibleInScreen && !_comp.isVisible) {
    return null;
  }

  return seePlayer(
    radiusVision: radiusVision,
    visionAngle: visionAngle,
    angle: angle,
    observed: (player) {
      observed?.call();
      final movement = _movement;
      if (movement == null) {
        return;
      }
      final move = movement.moveTowardsTarget(
        target: player,
        close: () => closePlayer?.call(player),
        margin: margin,
        movementAxis: movementAxis,
      );
      if (!move) {
        notCanMove?.call();
      }
    },
    notObserved: () {
      final canStop = notObserved?.call() ?? true;
      if (canStop) {
        _movement?.stop();
      }
    },
  );
}