seeAndMoveToAttackRange method

void seeAndMoveToAttackRange({
  1. required dynamic positioned(
    1. Player
    ),
  2. double radiusVision = 32,
  3. double? minDistanceCellsFromPlayer,
  4. bool runOnlyVisibleInScreen = true,
})

Checks whether the player is within range. If so, move to it.

Implementation

void seeAndMoveToAttackRange({
  required Function(Player) positioned,
  double radiusVision = 32,
  double? minDistanceCellsFromPlayer,
  bool runOnlyVisibleInScreen = true,
}) {
  if (isDead) return;
  if (runOnlyVisibleInScreen && !this.isVisible) return;

  seePlayer(
    radiusVision: radiusVision,
    observed: (player) {
      positioned(player);

      Rect playerRect = player is ObjectCollision
          ? (player as ObjectCollision).rectCollision
          : player.toRect();
      double distance = (minDistanceCellsFromPlayer ?? radiusVision);
      double _radAngle = getAngleFromPlayer();

      Vector2 myPosition = Vector2(
        this.center.x,
        this.center.y,
      );

      Vector2 playerPosition = Vector2(
        playerRect.center.dx,
        playerRect.center.dy,
      );

      double dist = myPosition.distanceTo(playerPosition);

      if (dist >= distance) {
        this.moveFromAngleDodgeObstacles(0, _radAngle);
        this.idle();
        return;
      }

      bool onMove = this.moveFromAngleDodgeObstacles(
        speed,
        getInverseAngleFromPlayer(),
      );

      if (!onMove) {
        this.idle();
      }
    },
    notObserved: () {
      this.idle();
    },
  );
}