simpleAttackMeleeByAngle method

void simpleAttackMeleeByAngle({
  1. required Future<SpriteAnimation> animationTop,
  2. required double damage,
  3. required double radAngleDirection,
  4. dynamic id,
  5. required double height,
  6. required double width,
  7. bool withPush = true,
})

Execute simple attack melee using animation

Implementation

void simpleAttackMeleeByAngle({
  required Future<SpriteAnimation> animationTop,
  required double damage,
  required double radAngleDirection,
  dynamic id,
  required double height,
  required double width,
  bool withPush = true,
}) {
  double angle = radAngleDirection;

  double nextX = height * cos(angle);
  double nextY = width * sin(angle);
  Offset nextPoint = Offset(nextX, nextY);

  Offset diffBase = Offset(
        this.position.center.dx + nextPoint.dx,
        this.position.center.dy + nextPoint.dy,
      ) -
      this.position.center;

  Vector2Rect positionAttack = this.position.shift(diffBase);

  gameRef.add(AnimatedObjectOnce(
    animation: animationTop,
    position: positionAttack,
    rotateRadAngle: angle,
  ));

  gameRef
      .visibleAttackables()
      .where((a) =>
          (this is Player
              ? a.receivesAttackFromPlayer()
              : a.receivesAttackFromEnemy()) &&
          a.rectAttackable().overlaps(positionAttack))
      .forEach((enemy) {
    enemy.receiveDamage(damage, id);
    final rectAfterPush =
        enemy.position.position.translate(diffBase.dx, diffBase.dy);
    if (withPush &&
        (enemy is ObjectCollision &&
            !(enemy as ObjectCollision)
                .isCollision(displacement: rectAfterPush)
                .isNotEmpty)) {
      enemy.translate(diffBase.dx, diffBase.dy);
    }
  });
}