BINARYでloadしたSWFとかをClassに割り振れないのか? [ Flash ]

なんか方法ありそうな気がするのだけど、うまくいかないので書いてみる。

以下のようにbinaryでLoadするとして,

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, _onLoaded);
loader.load( new URLRequest( "dummy.swf" ) );
これをMovieClipとして利用するのにはEvent.COMPLETEでバイナリを格納。(実際使っているときはバイナリ管理のクラスをつかってますが)
_bytes = URLLoader( e.target ).data;
_bytes.objectEncoding = ObjectEncoding.AMF3;//これは別にいらんけど
で、実際addChildする際には
var loader1:Loader = new Loader();
loader1.loadBytes( _bytes );
addChild( loader1 );
っつー感じなのですが、これをたとえば"ahoaho"クラスとかに割り振って
new ahoaho();
とかでインスタンス化できるようにできんのか?っつーこと。

いや別にloader使ってaddChildでもいいのだけどさー。
なんか出来そうな気がするのだけど、うまく割り当てが出来ない。

追記:08/04/10 12:41:42
・registerClassAliasっつーのはなんか意味が良く分からないな・・。
・package外でdynamic class ahoaho { };とかやった場合
ahoaho.prototype.constructor = _bytes;
とかは駄目・・・。
当然
ahoaho = _bytes
も駄目っぽい。
無理なのかしらね?
っつーかconstructorじゃない気がするな・・・。そもそもByteArrayをそこに割り当てるのが間違っているような・・。この辺基礎がないから良く分からないな。もちっとやってみよっと。14時まで・・・

ちと何がやりたいか良く分からないので整理。
たとえばObjectとかを一度ByteArrayにして復活させるときにはこんな感じ。

private function _test_by_Object() {
registerClassAlias("hoge", hoge);
var o1:hoge = new hoge();
o1.year = 36;
o1.name = "トザキです";
var _bytes2:ByteArray = new ByteArray();
_bytes2.writeObject(o1);
_bytes2.position = 0;
var o2:hoge;
o2 = _bytes2.readObject();
trace(o2.name);//トザキです
trace(o2.year); //36
}
class hoge {
public var name:String;
public var year:int;
function hoge() {
trace("hogehoge");
}
}
こんな感じで利用できる。ただこれはインスタンス化されたものが対象であって、今やりたいなーと思っているのはクラス自体の上書き。
ちと仮に分かりやすいように、すでに上書きするクラスを用意してやるとこんなん
private function _test_by_class() {
registerClassAlias("hoge", hoge);
var _bytes2:ByteArray = new ByteArray();
_bytes2.writeObject(hoge);
_bytes2.position = 0;
hoge2 = _bytes2.readObject();
}
class hoge2 {
function hoge2() {
trace("hoge2");
}
}
一応インスタンス化せずに_bytes2.writeObject(hoge);はできてるんだけど、問題はhoge2への割り当て部分。今の書き方は当然アウトで。1188:代入が無効です。が戻ってくる。
これprototype.constructorでもないだろうし・・。なんだろう?
あと30分。

追記:08/04/10 13:56:46
うーん、駄目だなー。
あれか?readObjectじゃなくてreadClass見たいなのがいるのか?

ちなみにManipulating individual pixels -- Flash CS3

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.utils.ByteArray;
import flash.geom.Rectangle;

var bitmapDataObject1:BitmapData = new BitmapData(100, 100, false, 0x006666FF);
var bitmapDataObject2:BitmapData = new BitmapData(100, 100, false, 0x00FF0000);

var rect:Rectangle = new Rectangle(0, 0, 100, 100);
var bytes:ByteArray = bitmapDataObject1.getPixels(rect);

bytes.position = 0;
bitmapDataObject2.setPixels(rect, bytes);

var bitmapImage1:Bitmap = new Bitmap(bitmapDataObject1);
addChild(bitmapImage1);
var bitmapImage2:Bitmap = new Bitmap(bitmapDataObject2);
addChild(bitmapImage2);
bitmapImage2.x = 110;

var bytes:ByteArray = new ByteArray();
bytes.writeObject(bitmapDataObject1);
bytes.position = 0;
bitmapDataObject2 = bytes.readObject();
って訳にはいかないらしい。
writeObject、readObjectの対象が良く分かってないな・・・汗


トラックバック

このエントリーのトラックバックURL:
http://www.img8.com/mt/mt-tb.cgi/3297

コメント

僕はよくロードしたSWFをスキンライブラリ的に使ってるのですが、

loader.contentLoaderInfo.applicationDomain.getDefiniation("クラス名");

で、ロードしたSWF内で定義したリンケージクラスを引っ張ってこれます。

やったことありませんが、これでロードしたswfのルートドキュメントのクラスが取得できれば解決しそうな予感が。

あ、そですね。これはオデも良くやっていて、クラス定義してれば操作できるですが、クラス定義してないswfとかイメージとかをクラス化できないのかなーって。(まぁ画像の場合はbitmapdataで取り回したほうが便利ですが)

>やったことありませんが、これでロードしたswfのルートドキュメントのクラスが取得できれば解決しそうな予感が。
あ、これはオデもやったことがないです。取れるのかな?
後でやってみよっと。

コメントを投稿