ノベルゲームプレーヤーにFlash8で作成したSWFのロゴを表示させようとした時にLoaderクラスのloadBytesメソッドでエラーが出たので解決法をメモ。


現在制作しているノベルゲームエンジンはリソースファイルを外部で連結させる形を取っており、Loaderクラスを用いて、取得したバイナリデータからBitmapインスタンスなどを作成する仕様となっています。


以前のコラム『画像ファイルから動的にBitmapクラスを作成 』でも書いたとおり、画像ファイルの場合は問題なかったのですが、今回SWFをバイナリから取得してAVM1Movieインスタンスを作成する時にエラーが発生しました。


コードは以下の通り。


// SWFの読込み
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, SwfLoaderCompleteHandler);
loader.loadBytes({SWF連結ファイルから取得したByteArray});

[エラーメッセージ]
[Fault] exception, information=SecurityError: Error #3015: 
Loader.loadBytes() is not permitted to load content with executable code.


エラー内容を読むと、「実行コードの中にLoaderクラスでバイナリをロードする許可がないのにロードしようとしている」という例外が発生しているとあります。

ですから実行を許可すればよいので、以下のようにLoaderContextを適用します。


// SWFの読込み
var context:LoaderContext = new LoaderContext();
context.allowLoadBytesCodeExecution = true;
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, SwfLoaderCompleteHandler);
loader.loadBytes({SWF連結ファイルから取得したByteArray}, context);


デフォルトではloadBytesの第2引数はnullとなっていますので、許可しない設定となっています。

でもBitmapインスタンスをロードした時は何も言われなかったのですが、何故なんでしょうか?


まあ解決したので良しとしましょう。皆様も上記のようなエラーコードが出力された時は参考にして下さい。


AIRやFLASHなどを表示するのに不便なので、ブログから自作サイトに移転します。

N2-Works移転先

今後はこちらで更新を行っていきます。


久しぶりにオーサリングツール(Flash8)でN2-Worksのロゴを作成していたのですが、ColorTransformの使い方をすっかり忘れていたのでメモ。


インスタンスの色を変更したい時にTransformとセットで使用します。


// 変更対象のインスタンスのTransformを作成
var trans:Transform = new Transform({色を変更したいインスタンス名});

// 現在の色に影響されない色変更(赤、アルファは引き継ぐ)
var color:ColorTransform = new ColorTransform();
color.redMultiplier   = 0;
color.greenMultiplier = 0;
color.blueMultiplier  = 0;
color.alphaMultiplier = 1.0;
color.redOffset       = 0xff;
color.greenOffset     = 0;
color.blueOffset      = 0;
color.alphaOffset     = 0;

// TransformにColorTransformを挿入
trans.ColorTransform = color;


ColorTransformの各プロパティの値は以下の式に使用されます。


新しい赤色   = (現在の赤色   * redMultiplier   ) + redOffset;
新しい緑色   = (現在の緑色   * greenMultiplier ) + greenOffset;
新しい青色   = (現在の青色   * blueMultiplier  ) + blueOffset;
新しい透過色 = (現在の透過色 * alphaMultiplier ) + alphaOffset;


というわけで、(ARGB)Multiplierに0が設定されているとインスタンスの色を引き継がないので、(ARGB)Offsetに設定したカラーコードが反映されます。


単に色を設定したい場合はこう使用した方が分かりやすいですね。


AIRやFLASHなどを表示するのに不便なので、ブログから自作サイトに移転します。

N2-Works移転先

今後はこちらで更新を行っていきます。


表題の通り、今回はActionScript3.0における値渡しと参照渡しについてのお話です。


C/C++はポインタがありますし、PHPやPERLにはリファレンス(参照)が明示的に指定できますので分かりやすいのですが、ActionScriptにはどうやらそういう文法がないようです。


で、調査の結果


・配列(Array)

・クラス(Class)

・オブジェクト(Object)


は参照渡しになるようです。

それ以外は値渡しになります。


では実験してみましょう。

var i:int = 1;
hoge(i);
trace(i);

function hoge(i:int) : void
{
    i++;
}

[出力結果]
1


値渡しになっていますね。

ではこうするとどうでしょうか。


var i:Array = new Array();
i.push(1 as int);
hoge(i);
trace(i[0]);

function hoge(i:Array) : void
{
    i[0]++;
}

[出力結果]
2


配列の場合は参照渡しになっていますね。

では捻ってFunction(関数)ならどうでしょうか。

var func:Function = function() : int { return 1; };
trace(func());
hoge(func);
trace(func());

function hoge(func:Function) :void
{
    func = function () : int { return 2; };
}

[出力結果]
1
1


どうやらFunctionは値渡しですね。


ClassとObjectは皆さんで試して下さい。ちなみに同じ配列なので省略しましたが、ByteArrayも参照渡しでした。


というわけでcloneメソッドは明示的に値渡しをしたい時などに使用すればよさそうですね。この辺りの理解を曖昧にしていると意図しない挙動を起こしそうなので気をつけましょう。