runRandomMovement method

void runRandomMovement(
  1. double dt, {
  2. bool runOnlyVisibleInCamera = true,
  3. double speed = 20,
  4. int maxDistance = 50,
  5. int minDistance = 0,
  6. int timeKeepStopped = 2000,
  7. bool useAngle = false,
})

Method that bo used in update method.

Implementation

void runRandomMovement(
  double dt, {
  bool runOnlyVisibleInCamera = true,
  double speed = 20,
  int maxDistance = 50,
  int minDistance = 0,
  int timeKeepStopped = 2000,
  bool useAngle = false,

  /// milliseconds
}) {
  if (runOnlyVisibleInCamera && !isVisibleReduction) {
    return;
  }

  if (_targetRandomMovement == Vector2.zero()) {
    if (checkInterval(_KEY_INTERVAL_KEEP_STOPPED, timeKeepStopped, dt)) {
      int randomX = _random.nextInt(maxDistance);
      randomX = randomX < minDistance ? minDistance : randomX;
      int randomY = _random.nextInt(maxDistance);
      randomY = randomY < minDistance ? minDistance : randomY;

      int randomNegativeX = _random.nextBool() ? -1 : 1;
      int randomNegativeY = _random.nextBool() ? -1 : 1;
      _targetRandomMovement = position.translate(
        randomX.toDouble() * randomNegativeX,
        randomY.toDouble() * randomNegativeY,
      );
      if (useAngle) {
        angle = BonfireUtil.angleBetweenPoints(
          rectConsideringCollision.center.toVector2(),
          _targetRandomMovement,
        );
      }
    }
  } else {
    bool canMoveX = (_targetRandomMovement.x - x).abs() > speed;
    bool canMoveY = (_targetRandomMovement.y - y).abs() > speed;

    bool canMoveLeft = false;
    bool canMoveRight = false;
    bool canMoveUp = false;
    bool canMoveDown = false;
    if (canMoveX) {
      if (_targetRandomMovement.x > x) {
        canMoveRight = true;
      } else {
        canMoveLeft = true;
      }
    }
    if (canMoveY) {
      if (_targetRandomMovement.y > y) {
        canMoveDown = true;
      } else {
        canMoveUp = true;
      }
    }
    bool onMove = false;
    if (useAngle) {
      if (canMoveX && canMoveY) {
        onMove = moveFromAngle(speed, angle);
      }
    } else {
      if (canMoveLeft && canMoveUp) {
        onMove = moveUpLeft(speed, speed);
      } else if (canMoveLeft && canMoveDown) {
        onMove = moveDownLeft(speed, speed);
      } else if (canMoveRight && canMoveUp) {
        onMove = moveUpRight(speed, speed);
      } else if (canMoveRight && canMoveDown) {
        onMove = moveDownRight(speed, speed);
      } else if (canMoveRight) {
        onMove = moveRight(speed);
      } else if (canMoveLeft) {
        onMove = moveLeft(speed);
      } else if (canMoveUp) {
        onMove = moveUp(speed);
      } else if (canMoveDown) {
        onMove = moveDown(speed);
      }
    }

    if (!onMove) {
      _cleanTargetMovementRandom();
    }
  }
}