seeAndMoveToAttackRange method
void
seeAndMoveToAttackRange({
- required dynamic positioned(),
- VoidCallback? notObserved,
- double radiusVision = 32,
- double? minDistanceCellsFromPlayer,
- bool runOnlyVisibleInScreen = true,
Checks whether the player is within range. If so, move to it.
Implementation
void seeAndMoveToAttackRange({
required Function(Player) positioned,
VoidCallback? notObserved,
double radiusVision = 32,
double? minDistanceCellsFromPlayer,
bool runOnlyVisibleInScreen = true,
}) {
if (isDead) return;
if (runOnlyVisibleInScreen && !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(
center.x,
center.y,
);
Vector2 playerPosition = Vector2(
playerRect.center.dx,
playerRect.center.dy,
);
double dist = myPosition.distanceTo(playerPosition);
if (dist >= distance) {
moveFromAngleDodgeObstacles(0, radAngle);
idle();
return;
}
bool onMove = moveFromAngleDodgeObstacles(
speed,
getInverseAngleFromPlayer(),
);
if (!onMove) {
idle();
}
},
notObserved: () {
idle();
notObserved?.call();
},
);
}