在编译到Flash 8时,如何让Haxe播放声音文件?

时间:2010-01-20 07:47:57

标签: flash audio haxe

我在让Haxe在Flash 8中播放音频文件时遇到了一些麻烦。

在我的hx文件的顶部,我有:

import flash.MovieClip;
import flash.Sound;

并且,在类本身中,我预先加载了许多图像文件以及音频文件的名称。

我们的想法是制作带有音频内容的幻灯片。基本上,显示第一张幻灯片并播放与之关联的音频。

然后,完成该音频后,转到下一张幻灯片和下一个音频文件。我有幻灯片渐入淡出,但当我试图添加声音时,扬声器没有任何声音。

以下代码就是我正在做的事情 - 与音频[0]相关联的声音文件从未开始播放,我不知道为什么。

class Whatever {
    static var master : MovieClip;
    static var slides : Array<MovieClip>;
    static var audios : Array<String>;
    static var sound  : Sound;

    function new () {}

    static function main () {
        master = flash.Lib.current;
        slides = new Array<MovieClip> ();
        sound = new Sound (null);

        var app  : Whatever = new Whatever ();
        var num  : String;
        var j    : Int;
        var clip : MovieClip;

        // There are 12 pictures in this test, image[001-012].jpg.
        // Each has an associated audioNNN.mp3 file.

        for (j in 1...13) {
            // Right-justify, zero fill.

            num = "" + j;
            if (j <  10) num = "0" + num;
            if (j < 100) num = "0" + num;

            // Load each image, hiding all but the first.

            clip = master.createEmptyMovieClip ("clip_" + num, master.getNextHighestDepth());
            clip.loadMovie ("image" + num + ".jpg");
            if (j > 1) clip._alpha = 0;
            slides.push (clip);

            // Make another list of the audio files.

            audios.push ("audio" + num + ".mp3");
        }

        // Start the first audio file.

        sound.loadSound (audios[0], true);
    }
}

1 个答案:

答案 0 :(得分:2)

傻傻的我!

事实证明,我只是忘记在将值推送到它之前分配数组。为什么运行时允许您在没有错误的情况下执行此操作是一个单独的问题。

我所要做的就是改变代码:

slides = new Array<MovieClip> ();

为:

slides = new Array<MovieClip> ();
audios = new Array<String> ();

以便正确创建音频数组。


关于为什么推送到不存在的数组没有被运行时捕获,Professional haXe and Neko书中有一个有趣的片段(它今天才到达,看起来它将返回我的投资非常快速,这就是为什么我不介意给它一个无耻的插件)解释它,几乎就是我遇到的情况:

  

所以,现在您已经可以看到您遇到的问题,请在生成例外时查看Neko和Flash:

class UncaughtException {
    public static function main() {
        var t : Array <String> ;
        t.push("me");
    }
}
  

为Neko和Flash编译前面的类,然后同时运行它们。运行时,Flash播放器应显示空白屏幕,而Neko应用程序将生成以下文本:

Called from  line 1
Called from UncaughtException.hx line 6
Uncaught exception - Invalid field access : push

     

这是一个未被捕获的异常,这意味着它是您未在代码中捕获和处理的异常。前面的类的问题是在调用方法push之前没有实例化Array t,所以就虚拟机而言,没有名为push available的方法。

     

现在,问题是,Flash虚拟机会遇到与Neko虚拟机遇到的相同的墙,除了Flash虚拟机选择忽略错误并继续正常运行。这是否意味着甚至生成了异常?也许,但是,像大多数看不见的害虫一样,你需要抓住一个以证明它存在。