May 1, 2009

[AS3]実行時に未定義のプロパティにアクセスする方法

例えばライブラリから読み込んだSpriteの子Spriteにインスタンス名でアクセスしたいとか。これを普通にライブラリから読み込んだSpriteの子にアクセスしようとして、

//ライブラリからアタッチ
var sp:Sprite = new spriteAttachedFromLibrary() as Sprite;
//子Spriteにアクセス
var spChild:Sprite = sp.spriteAttachedFromLibraryChild;

とすると、
1119: 未定義である可能性が高いプロパティ "インスタンス名" に静的型 flash.display:Sprite の参照を使用してアクセスしています。
と怒られる。

これを回避するためには[]演算子でストリングリテラルを使ってアクセスする。
上記の場合だと、

//ライブラリからアタッチ
var sp:Sprite = new spriteAttachedFromLibrary() as Sprite;
//[]演算子で子Spriteにアクセス
var spChild:Sprite = sp[ "spriteAttachedFromLibraryChild" ];

こうするとエラー回避してアクセスできる。(via 凹村さん、ありがとうございました。)

#追記(09.05.01)
凹村さんに再度コメントいただきました。こういう時はgetChildByNameを使って子Spriteの参照引っ張ってくる方が妥当みたい。もしくはdynamicクラスのMovieClipを継承させて、そのままドットシンタックスでアクセスするか。


ちなみに以前むねごんさんに教えて頂いたんですが、これを応用するとFlashPlayerの上位バージョンで追加された新しいメソッドなども使える。
例えばFP10からFileReferenceに追加されたsaveメソッド、これをFP9までしか描き出せないFlashCS3からも利用できる。

var fr:FileReference = new FileReference();
fr[ "save" ]( byte, name );

書き方はこんな感じ。
ただしこのまま描き出したswfは対応バージョンが9になっているので、このsaveメソッドが実行されるとエラーがでる。なのでバイナリエディタでswfの対応バージョンを9から10に書き換えてやる。やり方はバイナリエディタでswfを開いて、4バイトめの「09」を「0A」に書き換えて保存。こんだけ。これでFlashCS3からもfileReference.saveを使ったローカルファイルアクセスができる。

使用は自己責任でお願いします。

posted at 06:00 PM

 

コメント

凹村

普通に作る限りライブラリから読み込んだものはMovieClip継承してるから、MovieClip型の変数で参照すべきなのかも(MovieClipはdynamicクラスだから普通にアクセスできる)。spriteAttachedFromLibrary型にするってのもできるけど。それか、DisplayObjectContainerらしく、getChildByNameを使うべきなのかも。

2009年5月 1日 21:36



Bouze

あ、わざわざSprite継承に変えて読みこんでました。Spriteはdynamicじゃないんですね。

この場合だとgetChildByName使うのがスマートっぽいですね。getChildByName知りませんでした…。

お忙しいところありがとうございます。

2009年5月 1日 22:24



コメント





About the author

西村斉輝(にしむらなおき)

1984年兵庫県生まれ。
現在多摩美術大学GD科在籍。
パーソナルサイト
source laboratory™運営。

Syndication

Powerd by
MovableType 4.1