moveToPosition method
Move component towards a target position with smart pathfinding
This is an improved version of moveToPosition that:
- Uses more precise distance calculations
- Has better diagonal movement logic
- Cleaner code structure and better performance
- Returns true if movement occurred, false if already at target
Implementation
bool moveToPosition(
Vector2 targetPosition, {
double? speed,
bool useCenter = true,
}) {
final moveSpeed = speed ?? this.speed;
final diagonalSpeed = moveSpeed * Movement.diagonalFactor;
final rect = rectCollision;
// Get current position (center or top-left based on useCenter)
final currentPos = useCenter ? rect.centerVector2 : rect.positionVector2;
// Calculate the difference vector
final diff = targetPosition - currentPos;
// Calculate movement thresholds based on speed and delta time
final dtSpeed = moveSpeed * lastDt * 1.1; // Add small buffer
final dtDiagonalSpeed = diagonalSpeed * lastDt * 1.3;
// Check if we're close enough to the target (arrived)
if (diff.length < dtSpeed) {
stop(); // Stop moving when we arrive
return false;
}
final absDiffX = diff.x.abs();
final absDiffY = diff.y.abs();
// Determine movement type and execute
if (absDiffX > dtDiagonalSpeed && absDiffY > dtDiagonalSpeed) {
// Diagonal movement - both components are significant
_executeDiagonalMove(diff, moveSpeed);
} else if (absDiffX > dtSpeed) {
// Horizontal movement only
if (diff.x > 0) {
moveRight(speed: moveSpeed);
} else {
moveLeft(speed: moveSpeed);
}
} else if (absDiffY > dtSpeed) {
// Vertical movement only
if (diff.y > 0) {
moveDown(speed: moveSpeed);
} else {
moveUp(speed: moveSpeed);
}
} else {
// Very close - make a direct translation to avoid oscillation
final directMovement = diff.normalized() * dtSpeed;
position += directMovement;
}
return true;
}