positionsItselfAndKeepDistance method

void positionsItselfAndKeepDistance(
  1. GameComponent target, {
  2. required dynamic positioned(
    1. GameComponent
    ),
  3. double radiusVision = 32,
  4. double? minDistanceFromPlayer,
  5. bool runOnlyVisibleInScreen = true,
})

Checks whether the component is within range. If so, position yourself and keep your distance. Method that bo used in update method.

Implementation

void positionsItselfAndKeepDistance(
  GameComponent target, {
  required Function(GameComponent) positioned,
  double radiusVision = 32,
  double? minDistanceFromPlayer,
  bool runOnlyVisibleInScreen = true,
}) {
  if (runOnlyVisibleInScreen && !this.isVisible) return;
  double distance = (minDistanceFromPlayer ?? radiusVision);

  Rect rectTarget = getRectAndCollision(target);
  double centerXPlayer = rectTarget.center.dx;
  double centerYPlayer = rectTarget.center.dy;

  double translateX = 0;
  double translateY = 0;

  double speed = this.speed * this.dtUpdate;

  Rect rectToMove = getRectAndCollision(this);

  translateX = rectToMove.center.dx > centerXPlayer ? (-1 * speed) : speed;
  translateX = _adjustTranslate(
    translateX,
    rectToMove.center.dx,
    centerXPlayer,
    speed,
  );

  translateY = rectToMove.center.dy > centerYPlayer ? (-1 * speed) : speed;
  translateY = _adjustTranslate(
    translateY,
    rectToMove.center.dy,
    centerYPlayer,
    speed,
  );

  if ((translateX < 0 && translateX > -0.1) ||
      (translateX > 0 && translateX < 0.1)) {
    translateX = 0;
  }

  if ((translateY < 0 && translateY > -0.1) ||
      (translateY > 0 && translateY < 0.1)) {
    translateY = 0;
  }

  double translateXPositive = rectToMove.center.dx - rectTarget.center.dx;
  translateXPositive =
      translateXPositive >= 0 ? translateXPositive : translateXPositive * -1;

  double translateYPositive = rectToMove.center.dy - rectTarget.center.dy;
  translateYPositive =
      translateYPositive >= 0 ? translateYPositive : translateYPositive * -1;

  if (translateXPositive >= distance &&
      translateXPositive > translateYPositive) {
    translateX = 0;
  } else if (translateXPositive > translateYPositive) {
    translateX = translateX * -1;
    positioned(target);
  }

  if (translateYPositive >= distance &&
      translateXPositive < translateYPositive) {
    translateY = 0;
  } else if (translateXPositive < translateYPositive) {
    translateY = translateY * -1;
    positioned(target);
  }

  if (translateX == 0 && translateY == 0) {
    if (!this.isIdle) {
      this.idle();
    }
    positioned(target);
    return;
  }

  translateX = translateX / this.dtUpdate;
  translateY = translateY / this.dtUpdate;

  if (translateX > 0 && translateY > 0) {
    moveDownRight(translateX, translateY);
  } else if (translateX < 0 && translateY < 0) {
    moveUpLeft(translateX.abs(), translateY.abs());
  } else if (translateX > 0 && translateY < 0) {
    moveUpRight(translateX, translateY.abs());
  } else if (translateX < 0 && translateY > 0) {
    moveDownLeft(translateX.abs(), translateY);
  } else {
    if (translateX > 0) {
      moveRight(translateX);
    } else {
      moveLeft(translateX.abs());
    }
    if (translateY > 0) {
      moveDown(translateY);
    } else {
      moveUp(translateY.abs());
    }
  }
}