代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

在编译到Flash8时,如何让haxe播放声音文件?

  •  1
  • paxdiablo  · 技术社区  · 15 年前

    我在让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 回复  |  直到 15 年前
        1
  •  2
  •   paxdiablo    15 年前

    愚蠢的我!

    结果发现,我只是忘记了在将值推送到数组之前分配数组。为什么运行时允许您在没有错误的情况下这样做是一个单独的问题。

    我所要做的就是把代码从:

    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之前没有实例化数组t,就虚拟机而言,没有名为push的方法可用。

    现在,事实是,flash虚拟机会碰到与neko虚拟机相同的墙,只是flash虚拟机选择忽略错误并继续正常工作。这是否意味着甚至生成了异常?也许,但是,像大多数看不见的害虫一样,你需要捕捉一个来证明它的存在。