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の対象が良く分かってないな・・・汗

コメント
僕はよくロードしたSWFをスキンライブラリ的に使ってるのですが、
loader.contentLoaderInfo.applicationDomain.getDefiniation("クラス名");
で、ロードしたSWF内で定義したリンケージクラスを引っ張ってこれます。
やったことありませんが、これでロードしたswfのルートドキュメントのクラスが取得できれば解決しそうな予感が。
投稿者: fladdict | 2008年04月10日 15:13
あ、そですね。これはオデも良くやっていて、クラス定義してれば操作できるですが、クラス定義してないswfとかイメージとかをクラス化できないのかなーって。(まぁ画像の場合はbitmapdataで取り回したほうが便利ですが)
>やったことありませんが、これでロードしたswfのルートドキュメントのクラスが取得できれば解決しそうな予感が。
あ、これはオデもやったことがないです。取れるのかな?
後でやってみよっと。
投稿者: +39 | 2008年04月10日 17:17