seeAndMoveToAttackRange<T extends GameComponent> method
void
seeAndMoveToAttackRange<T extends GameComponent>({})
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();
}
},
);
}