0

使用 Flame 和 Flame Audio,我无法解决问题。FlameAudio 返回的 AudioPlayer 上的 stop 函数不会停止循环播放。我不确定这是我的代码中的问题、AudioPlayer 中的问题还是 FlameAudio 的问题。

下面是在开始时启动声音的一段代码,应该在结束时停止或取消。使用单个指针拖动它可以工作。但是,当使用带有多个指针的 multidrag 并同时释放所有声音时,声音会继续播放。当至少有一次拖动处于活动状态时,代码应该只播放一种声音。

谁能告诉我,如果我做错了什么或者有错误。在我的手机上显示问题的最小工作示例可在https://github.com/markohrastovec/flame_audio_test获得。

  @override
  void onDragStart(int pointerId, DragStartInfo info) async {
    if (loopPlayer == null && activeDrag.isEmpty) {
      loopPlayer = await FlameAudio.audioCache.loop('sfx/flame.mp3');
    }
    activeDrag.add(pointerId);
  }

  @override
  void onDragEnd(int pointerId, DragEndInfo info) async {
    activeDrag.remove(pointerId);
    if (loopPlayer != null && activeDrag.isEmpty) {
      int result = await loopPlayer!.stop();
      loopPlayer = null;
    }
  }

  @override
  void onDragCancel(int pointerId) async {
    activeDrag.remove(pointerId);
    if (loopPlayer != null && activeDrag.isEmpty) {
      int result = await loopPlayer!.stop();
      loopPlayer = null;
    }
  }

4

1 回答 1

1

我认为这是由于onDragStart方法是异步的,它实际上创建了多个播放器,并将第一个创建的播放器替换为变量中的新播放器。如果您onDragStart改为执行以下操作,是否会发生这种情况:

  @override
  void onDragStart(int pointerId, DragStartInfo info) async {
    if (loopPlayer == null && activeDrag.isEmpty) {
      activeDrag.add(pointerId);
      loopPlayer = await FlameAudio.audioCache.loop('sfx/flame.mp3');
    } else {
      activeDrag.add(pointerId);
    }
  }
于 2021-12-19T17:42:48.647 回答