1

Flash 8 で Haxe にオーディオ ファイルを再生させるのに問題があります。

私の hx ファイルの先頭には、次のものがあります。

import flash.MovieClip;
import flash.Sound;

そして、クラス自体の中で、オーディオ ファイルの名前と共に多くの画像ファイルをプリロードします。

アイデアは、オーディオ コンテンツでスライド ショーを行うことです。基本的に、最初のスライドを表示し、それに関連付けられたオーディオを再生します。

次に、オーディオが終了したら、次のスライドと次のオーディオ ファイルに進みます。スライドのフェードインとフェードアウトは問題ありませんが、サウンドを追加しようとすると、スピーカーから何も出てきません。

次のコードは私が行っていることです。audios[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);
    }
}
4

1 に答える 1

2

愚かな私!

配列に値をプッシュする前に配列を割り当てるのを忘れていたことがわかりました。ランタイムがエラーなしでそれを可能にする理由は、別の問題です。

私がしなければならなかったのは、コードを次のように変更することだけでした。

slides = new Array<MovieClip> ();

に:

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

オーディオ配列が適切に作成されるようにします。


存在しない配列へのプッシュがランタイムによってキャッチされなかった理由については、Professional haXe and Neko book に興味深いスニペットがあります (これは今日到着したばかりで、私の投資が非常に迅速に回収されるようです。これが理由です)。それを説明する恥知らずなプラグインを与えてもかまいません)、私が遭遇した状況とほぼ同じです:

何に直面しているかがわかったので、例外を生成するときに Neko と Flash の両方を見てみましょう。

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

Neko と Flash の両方について前述のクラスをコンパイルし、両方を実行します。実行すると、Flash Player は空白の画面を表示するはずですが、Neko アプリケーションは次のテキストを生成します。

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

これはキャッチされていない例外です。つまり、コードでキャッチして処理していない例外です。上記のクラスの問題は、メソッド push が呼び出される前に Array t がインスタンス化されなかったため、仮想マシンに関する限り、利用可能な push と呼ばれるメソッドがないことです。

さて、問題は、Flash 仮想マシンがエラーを無視して通常どおり続行することを選択したことを除いて、Neko 仮想マシンが遭遇したのと同じ壁に Flash 仮想マシンがぶつかったということです。これは、例外が生成されたことを意味しますか? たぶん、しかし、ほとんどの目に見えない害虫と同様に、それが存在することを証明するには、1つを捕まえる必要があります.

于 2010-01-21T04:02:30.357 に答える