simpleAttackMeleeByAngle method

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

Execute simple attack melee using animation

Implementation

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

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

  Vector2 diffBase = Vector2(
        this.center.x + nextPoint.dx,
        this.center.y + nextPoint.dy,
      ) -
      this.center;

  Rect positionAttack = this.toRect().shift(diffBase.toOffset());

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

  gameRef
      .visibleAttackables()
      .where((a) => a.rectAttackable().overlaps(positionAttack))
      .forEach((enemy) {
    enemy.receiveDamage(attacker, damage, id);
    final rectAfterPush = enemy.position.translate(diffBase.x, diffBase.y);
    if (withPush &&
        (enemy is ObjectCollision &&
            !(enemy as ObjectCollision)
                .isCollision(displacement: rectAfterPush)
                .isNotEmpty)) {
      enemy.translate(diffBase.x, diffBase.y);
    }
  });
}