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

N2-Works移転先

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


Loaderクラスをループ内で5つ作成し、Event.COMPLETEイベントリスナを設定すると、どうも2つしか動作してくれないようです。


この挙動だと、Loaderが読込み完了になるまでに異なるLoaderを作成してはいけないということになります。


ロード作業を行う時に時間を掛けたくないので、非同期にLoaderクラスを動作させるようにしたいのですが、同期をとらざるを得ないようですね(泣)

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

N2-Works移転先

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


以前の記事『ActionScript3.0における値渡しと参照渡し 』で配列、クラス、オブジェクトは参照渡しになります、と書いたと思います。


これは代入した時も同様でC/C++で言うところのポインタをコピーしているのと同義となります。



[C/C++のコード]
char *ptr;
char str[] = "hogehoge";
ptr = str;
printf("ptr = %s\n", ptr);

// 変更
str[0] = 'p';
str[4] = 'p';
printf("ptr = %s\n", ptr);

[出力結果]
ptr = hogehoge
ptr = pogepoge

[actionscript3.0のコード]
// 元オブジェクトを設定
var hoge:Object = new Object();
hoge["str"] = "hogehoge";

// 通常は参照コピーとなる
var reference:Object = hoge;
trace(reference["str"]);
hoge["str"] = "pogepoge";		// 元オブジェクトの値を変更
trace(reference["str"]);

[出力結果]
hogehoge
pogepoge


上記のコードのように参照コピーの場合は元の文字列を変更すると、コピー先の情報も変更されてしまいます。これはアドレスをコピーしているだけだからです。


ただ問題なのは、ActionScript3.0の場合C/C++のように明示的なポインタ指定が出来ず、単純に代入すると参照コピーになってしまう点です。


当然、値コピーが必要な場面がありますので、値コピー関数を自作しないといけません。


[C/C++のコード]
char str[] = "hogehoge";
char value[9];

for (unsigned int i=0; i<strlen(str); i++) {
    value[i] = str[i];
}
value[8] = '\0';
printf("value = %s\n", value);

// 変更
str[0] = 'p';
str[4] = 'p';
printf("value = %s\n", value);

[出力結果]
value = hogehoge
value = hogehoge

[actionscript3.0のコード]
// 元オブジェクトを設定
var hoge:Object = new Object();
hoge["str"] = "hogehoge";

// 値コピー関数を使用する
var value:Object = ValueCopy(hoge);
trace(value["str"]);
hoge["str"] = "pogepoge";		// 元オブジェクトの値を変更
trace(value["str"]);

// 値コピー関数
function ValueCopy(src:*) : *
{
    var clone:ByteArray = new ByteArray();
    clone.writeObject(src);
    clone.position = 0;
    return clone.readObject();
}

[出力結果]
hogehoge
hogehoge


結果としてC/C++と同じように行うにはByteArrayを利用しないといけないというのが分かると思います。


ValueCopyの引数と戻り値には*(ワイルドカード)を使用します。これはC/C++で言うところのvoid型のポインタと同じくどの型でも許容するものです。


必要な時は使用してみて下さい。

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

N2-Works移転先

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


BitmapをSpriteに配置した後、イベントリスナーを設定しようとして動作しなかったのでメモ。


addEventListenerメソッドは使用できるのでMouseEvent.MOUSE_DOWNイベントにリスナを定義したのですが、左クリックをBitmap上で実行してもリスナが動作しないのです。


おかしいと思い、例によってActionScript3.0のリファレンスで『Bitmap 』を見ると以下のような記載がありました。


注意:Bitmap クラスは InteractiveObject クラスのサブクラスではないため、マウスイベントを送出できません。
しかし、ビットマップオブジェクトを格納した表示オブジェクトコンテナの addEventListener() メソッドを使用できます。


なるほど『InteractiveObject 』の項を見ると、マウスとキーボードを使用してユーザーが操作できるすべての表示オブジェクトの抽象基本クラスとなっています。InteractiveObjectを継承していないのでマウスイベントを発行しないというわけです。


Bitmapインスタンスにマウスイベントを発行するように見せかけるには、透明Spriteのインスタンスでも配置するしかないですね。