You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haxe/Heaps中如何重复播放音频?单次播放后无法再次触发

Heaps.io(Haxe)WAV音频仅能播放一次的问题排查与解决

问题描述

使用Haxe的Heaps.io游戏引擎时,触发事件(按下P键)播放资源中的WAV音频,仅首次播放有效,后续多次触发无响应。按下Q键退出程序后,控制台输出:

(7) src/Main.hx:22: pong.wav
AL lib: (EE) alc_cleanup: 1 device not closed

已尝试的操作:

  • 在sound.play()前调用sound.stop(),无效
  • 使用Channels,问题依旧,且首次播放后无法播放其他音频

原始代码

import hxd.Event;
import hxd.System;
import hxd.Window;
import hxd.res.Sound;

class Main extends hxd.App {
    var sound: Sound = null;
    var window: Window;

    function onEvent(event: Event) {
        if (event.kind == EKeyDown) {
            if (event.keyCode == hxd.Key.P) {
                playSound();
            }
            if (event.keyCode == hxd.Key.Q) {
                System.exit();    
            }
        }
    }

    function playSound() {
        trace(sound);
        if (sound != null) {
            sound.play();
        }
    }

    override function init() {
        hxd.Res.initEmbed();

        window = Window.getInstance();
        window.addEventTarget(onEvent);

        if (Sound.supportedFormat(Wav)) {
            sound = hxd.Res.pong;
        }
    }
    
    override function update(dt: Float) {
        
    }

    public static function main() {
        new Main();
    }
}

解决方法

1. 确保每次播放创建新的音频实例

Heaps中Sound.play()返回SoundInstance对象,默认单次播放实例结束后无法重复触发。修改playSound函数,每次播放都生成新实例:

function playSound() {
    trace(sound);
    if (sound != null) {
        // 创建新的播放实例,保证每次触发都能播放
        var soundInstance = sound.play();
        // 若需要循环播放可设置:soundInstance.loop = true;
    }
}

2. 验证资源加载状态

在init函数中添加资源加载验证,确认音频资源是否正确加载:

override function init() {
    hxd.Res.initEmbed();

    window = Window.getInstance();
    window.addEventTarget(onEvent);

    if (Sound.supportedFormat(Wav)) {
        sound = hxd.Res.pong;
        if (sound == null) {
            trace("pong.wav 加载失败");
        } else {
            trace("pong.wav 加载成功");
        }
    } else {
        trace("当前环境不支持WAV格式");
    }
}

3. OpenAL警告说明

控制台的AL lib: (EE) alc_cleanup: 1 device not closed是程序退出时OpenAL设备未清理的警告,与音频无法重复播放的问题无关。若要解决该警告,可在退出前手动关闭音频设备,但不影响核心功能。

内容的提问来源于stack exchange,提问作者Nick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:01:07