« 貼れるのかテスト | Home | mx.utils.Base64Encoder »

Apr 102008

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

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

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

4 Comments

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

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

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

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

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

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

こんにちは。

一応、以下のような感じでnewできました。

//ロードされたMC
var mc:MovieClip = loader.content as MovieClip;
//ロードされたMCのクラス名
var className:String = getQualifiedClassName(mc);
//ロードされたMCのクラス
var classRef:Class = mc.loaderInfo.applicationDomain.getDefinition(className) as Class;
//newして複製
addChild(new classRef());

ただ、たまにプレイヤーがクラッシュしてしまう気がします。
あんまり突っ込んでないので気のせいかもしれません。。

おお!なるほど!
クラスはそれ自体ではないということですね・・。なるほど・・。
ちょっと後日試してみます。

>ただ、たまにプレイヤーがクラッシュしてしまう気がします。
これは・・怖いですね・・・。
プレイヤーが固まってしまう感じですか?

Leave a comment

Search and Archives