如何使火焰中的粒子淡出?

问题描述 投票:0回答:1

我能够使用下面的代码创建一个在点击时显示文本的粒子。有可能让这个粒子淡出吗? (在这个问题中,“淡出”是指调整不透明度。)

import 'package:flame/components.dart';
import 'package:flame/game.dart';
import 'package:flame/input.dart';
import 'package:flame/particles.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const FooApp());
}

class FooApp extends StatelessWidget {
  const FooApp({super.key});

  @override
  Widget build(BuildContext context) {
    return const MaterialApp(
      debugShowCheckedModeBanner: false,
      home: GameWidget.controlled(gameFactory: TextGame.new),
    );
  }
}

class TextGame extends FlameGame {
  @override
  Future<void> onLoad() async {
    super.onLoad();

    await add(
      ButtonComponent(
        position: Vector2(size.x * 0.5, size.y * 0.5),
        onPressed: () {
          add(
            ParticleSystemComponent(
              position: Vector2(size.x * 0.5, size.y * 0.5),
              particle: AcceleratedParticle(
                lifespan: 2.0,
                speed: Vector2(0, 50),
                child: ComponentParticle(
                  component: TextComponent(
                    anchor: Anchor.center,
                    text: "Taped!",
                  ),
                ),
              ),
            ),
          );
        },
        button: TextComponent(
          text: 'B',
          textRenderer: TextPaint(
            style: const TextStyle(
              fontSize: 88,
              color: Colors.white,
            ),
          ),
        ),
        anchor: Anchor.center,
      ),
    );
  }
}

参考资料:

flutter dart flame
1个回答
0
投票

是的!您可以实现自己的自定义粒子并使用其更新方法来更改不透明度。

例如,您可以扩展

CircleParticle
并提供一个实现来缓慢降低不透明度直至达到零。

class MyParticle extends CircleParticle {
  MyParticle({required super.paint});

  @override
  void update(double dt) {
    super.update(dt);

    final newAlpha = (paint.color.a - 0.5 * dt).clamp(0.0, 1.0);
    paint.color = paint.color.withValues(alpha: newAlpha);
  }
}

您还可以尝试与其他粒子组合,使用 Flutter 曲线实现非线性行为等等。

作为一个更完整的示例,这个实现会发射一阵红色粒子,然后逐渐消失。

© www.soinside.com 2019 - 2024. All rights reserved.