paint method

  1. @override
void paint(
  1. Canvas canvas,
  2. Size size,
  3. double p,
  4. Offset center,
  5. Color base, {
  6. double radiusMultiplier = 1.0,
  7. Offset positionOffset = Offset.zero,
})
override

Implementation

@override
void paint(Canvas canvas, Size size, double p, Offset center, Color base,
    {double radiusMultiplier = 1.0, Offset positionOffset = Offset.zero}) {
  final progress = (p * speed).clamp(0.0, 1.0); // ❶ skala progress

  final c = center + positionOffset;
  final explosionR = size.width * .6 * radiusMultiplier;
  const pixelCount = 60;
  const baseSize = 3.0;

  for (int i = 0; i < pixelCount; i++) {
    final rnd = math.Random(i * 97);
    final angle = rnd.nextDouble() * 2 * math.pi;
    final speedFactor = .5 + rnd.nextDouble(); // 0.5–1.5

    double dist, sizePx, opacity;

    if (progress < .2) {
      final t = progress / .2;
      final startDist = explosionR * (.3 + rnd.nextDouble() * .7);
      dist = startDist * (1 - t);
      sizePx = baseSize * (.5 + t * .5);
      opacity = .3 + t * .7;
    } else if (progress < .6) {
      final t = (progress - .2) / .4;
      dist = explosionR * math.pow(t, 1.5) * speedFactor;
      sizePx = baseSize * (1 + rnd.nextDouble() * .5);
      opacity = 1;
    } else {
      final t = (progress - .6) / .4;
      dist = explosionR * (speedFactor + .2 * t * speedFactor);
      sizePx = baseSize * (1 - t * .5);
      opacity = 1 - t;
    }

    final pos = c + Offset(math.cos(angle) * dist, math.sin(angle) * dist);

    // warna (HSV shift opsional)
    Color col = base;
    if (enableHueTilt) {
      final hsl = HSLColor.fromColor(base);
      final shift = (angle / (2 * math.pi)) * 360 * hueTiltRange;
      col = hsl
          .withHue((hsl.hue + shift) % 360)
          .withSaturation((hsl.saturation * saturationBoost).clamp(0, 1))
          .toColor();
    }
    col = col.withOpacity(opacity);

    canvas.drawCircle(pos, sizePx * radiusMultiplier, Paint()..color = col);

    // highlight 20 %
    if (rnd.nextDouble() < .2) {
      canvas.drawCircle(
          pos.translate(-sizePx * .25, -sizePx * .25),
          sizePx * .2,
          Paint()..color = Colors.white.withOpacity(opacity * .8));
    }
  }
}