followComponent method

void followComponent(
  1. GameComponent target,
  2. double dt, {
  3. required dynamic closeComponent(
    1. GameComponent
    ),
  4. double margin = 10,
})

This method move this component to target Need use Movement mixin. Method that bo used in update method.

Implementation

void followComponent(
  GameComponent target,
  double dt, {
  required Function(GameComponent) closeComponent,
  double margin = 10,
}) {
  final comp = getRectAndCollision(target);
  double centerXPlayer = comp.center.dx;
  double centerYPlayer = comp.center.dy;

  double translateX = 0;
  double translateY = 0;
  double speed = this.speed * dt;

  Rect rectToMove = rectConsideringCollision;

  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;
  }

  Rect rectPlayerCollision = Rect.fromLTWH(
    comp.left - margin,
    comp.top - margin,
    comp.width + (margin * 2),
    comp.height + (margin * 2),
  );

  if (rectToMove.overlaps(rectPlayerCollision)) {
    closeComponent(target);
    if (!this.isIdle) {
      this.idle();
    }
    return;
  }

  translateX = translateX / dt;
  translateY = translateY / dt;

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