simpleAttackMelee method

void simpleAttackMelee({
  1. required Future<SpriteAnimation> attackEffectTopAnim,
  2. required double damage,
  3. required double height,
  4. required double width,
  5. int? id,
  6. bool withPush = false,
  7. double? radAngleDirection,
  8. VoidCallback? execute,
  9. int interval = 1000,
})

Execute simple attack melee using animation

Implementation

void simpleAttackMelee({
  required Future<SpriteAnimation> attackEffectTopAnim,
  required double damage,
  required double height,
  required double width,
  int? id,
  bool withPush = false,
  double? radAngleDirection,
  VoidCallback? execute,
  int interval = 1000,
}) {
  if (!this.checkInterval('attackMelee', interval, dtUpdate)) return;

  if (isDead) return;

  double angle = radAngleDirection ?? this.currentRadAngle;

  double nextX = this.height * cos(angle);
  double nextY = this.height * 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: attackEffectTopAnim,
    position: positionAttack,
    rotateRadAngle: angle,
  ));

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

  if (execute != null) execute();
}