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
相关产品推荐
相关产品推荐

