[AS][?]ArgumentError: Error #2015: BitmapData が無効です。エラーの謎

エラー:ArgumentError: Error #2015: BitmapData が無効です。
書籍:ActionScript3.0エラーアーカイブスによると、このエラーの主な原因は、

1.BitmapDataインスタンスの幅または高さが制限範囲(1~8191px)を超えている。
2.BitmapDataインスタンスのピクセルの総数が1677215pxを超えている。

ということらしいのですが、じゃあこれはどういうことだ?ということがおきたのでメモ。


//フレームアクション
for(var i:uint = 0; i < 11; i++){//i < 10のときは実行可能
	var bmd:BitmapData = new BitmapData(4000, 4000,true,0x11FFCC00);
}

これを実行するの上記エラーになります。
(ちなみにfor文を10回繰り返しではエラーにならない。11回でエラーになる)

これは主な原因の1,2も満たしていないのでその他の原因ということでしょうか。
憶測として、BitmapDataは全体でのピクセル数の制限があるのでは?ということで、
上記の場合は、4000×4000×11 = 176000000ピクセルとなります。
このくらいが限界なのかと、ためしに、以下のように書き換えてみると同じようにエラー
(2000×8000×11 = 176000000 でピクセル総数は同じ)


for(var i:uint = 0; i < 11; i++){//i < 10のときは実行可能
	var bmd:BitmapData = new BitmapData(2000, 8000,true,0x11FFCC00);
}

うんうん、予想通り。
じゃあ、これもエラーだよねと、以下のようにすると、(1000×1000×176=176000000)
これは想定外にOK・・・


for(var i:uint = 0; i < 176; i++){//i<700くらいでやっとエラーになる。
	var bmd:BitmapData = new BitmapData(1000, 1000,true,0x11FFCC00);
}

繰り返し数を700回くらいにするとやっとエラーになります。

うーん、どういうことなんだろう。。。

これで現実的に困ったのはEnterFrameの処理でBitmapDataを生成しまくってたら、この現象になってしまったということ。
具体的には、BitmapData作って、BitmapにあててaddChildして、一定時間がたったら、そのBitmapをremoveChildして~の繰り返しをしてたのだけど、しばらく動かしているとこのエラーが発生。
一応解決策は、BitmapをremoveChildする際に、BitmapData.dispose()してあげれば大丈夫な感じだったけど、原因がはっきりしないのが、なんだか気持ち悪い。。。

[AS][?]FLV読み込み時のonMetaDataを取得するタイミングがわからない

ちょっと気持ち悪いのでメモ

◆現象◆
簡単なFLVプレイヤーでインターフェースは再生ボタンと、頭出しボタン。
FLVPlaybackではなく、Videoオブジェクトによる自作。
この記事にかいてあるLoadMovieクラスの拡張版のような感じ。
(実際はもっとごちゃごちゃしてるのであとで時間ができたら簡略版を作って検証・記載する、つもり)
NetStream.clientにて、onMetaDataを取得するようにしてある。
NetStream.play(“xxx.flv”)で、MetaDataが取得は問題ないのだけど、頭だしボタンを押したときもMetaDataが取得される場合がある。
(読み込むFLVファイルによっては、頭出ししてもMetaDataが取得されない場合がある)
頭出しの処理は、NetStream.seek(0);

seek(0)から再生させたときにonMetaDataを取得するということなのか?
(seek(0)のタイミングではなくって、そこから再生させたら、みたいな感じ)
flvファイルによって、上記条件でMetaDataを取得したり、しなかったりという感じが???なのです。
原因よくわからんのでとりあえず例外処理書いたけど、なんか気持ち悪い。

[JSFL][?]JSFLでモーショントゥイーン(色)させる

久しぶりにタイムラインでの作業。
MCのカラーを黒→赤、または赤→黒といったモーション(時間は4フレーム)で行うという作業が大量に発生。
最初はとりあえずクラシックトゥイーンにショートカットを割り当ててシコシコやっていたけど、よく考えたら、全部コマンド化して一括に実行すればいいんじゃね?と思い、試してみました。

まずはヒストリパネルから、必要な手順を選んでjsfl化しようと思ったのですが・・・
フレームの移動の部分をjsfl化してくれないので無理ということに。
※ヒストリパネルからコマンド作成は、↓の記事が参考になりました。
Mattari Blog:jsflのすすめ

じゃあ、足りない部分は自分でjsfl書いてみる!ということでjsfl初チャレンジ!!

で、できたのがこちら。


// 赤になる
// This command was recorded by Adobe Flash CS4.

//タイムラインを変数で保持
var path = fl.getDocumentDOM().getTimeline();

// インスタンスの濃淡: '#ff0000', 100%
fl.getDocumentDOM().setInstanceTint('#ff0000', 100);

//フレーム数を取得
var fr4 = path.currentFrame-4;

//指定したフレームをキーフレームに変換
path.convertToKeyframes(fr4);

//指定したフレーム数をモーショントゥイーンに変換
path.createMotionTween(fr4);

// 黒になる
// This command was recorded by Adobe Flash CS4.

var path = fl.getDocumentDOM().getTimeline();

// インスタンスプロパティ: colorMode, none
fl.getDocumentDOM().setElementProperty('colorMode', 'none');

//フレーム数を取得
var fr4 = path.currentFrame-4;

//指定したフレームをキーフレームに変換
path.convertToKeyframes(fr4);

//指定したフレーム数をモーショントゥイーンに変換
path.createMotionTween(fr4);

使い方としては、トゥイーンを終了させたい位置にキーフレームを打って、上記のコマンドを実行すると、
それぞれ4個前のフレームから始まるモーショントゥイーンが設定されます。

本当は、最初のキーフレームを打つ部分もjsflにまとめたかったのだけど、その処理を入れると色のプロパティを変更する処理が実行されなかったのよね・・・
なんかできそうな気はするけど、こんどえらい人に聞いてみよう。

[AS][?]progression addCommandのexecute()について

_onload(),_onInit(),_onCastAdded(),_onCastRemoved(),_onGoto()などのoverride系のメソッドの中のaddCommand()は、execute()無しで、自動的に実行されるみたい。

addCommand()はリスト(CommandList?)にコマンドを追加するメソッドで、色んなクラスに入っている。
が、しかし、
CommandListクラスのメソッドのaddCommand()と
SceneObjectクラスのメソッドのaddCommand()とでは
動作の意味が若干違うみたい。(ドキュメントに書いてあることが違うし)

[AS][?]xmlから取得したデータをBoolean型として認識するには?

なんかうまくできなかった。

[AS][?]loaderInfo.addEventListener( Event.COMPLETE, _complete );

loaderInfo.addEventListener( Event.COMPLETE, _complete );
↑これってメインのタイムラインとかドキュメントクラスには書いといた方がいいのかな?

[AS][?]progression ParallelListとかSerialListについて

まずはドキュメントのサンプルより

パラレルリストの中にパラレルリストを作って実行しているがメリットがわからない・・・

var list:ParallelList = new ParallelList();
list.addCommand(
new ParallelList( null,
new Trace("この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" )
);
list.execute();

コマンド内に書くとexecute();無しでも自動で実行されるのでシンプルな感じ
↓これで上と同じ意味になってるっぽいけど厳密には違うのかしら?

addCommand(
new ParallelList( null,
new Trace( "この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" ),
new Wait( 1000 ),
new Trace( "この Trace コマンドは同時に実行されます。" )
)
);

[AS][?]progressionでのprogression.containerについて

gihyoでのプログレッション特集4のサンプルでの疑問点

各シーンの閉じるボタンを表示リストに追加する際に、各シーンに割り当ててるページ(CastSprite)ではなく、SceneObject自体に追加している。
これは、閉じるボタンの戻り先を設定をする際、SceneObjectじゃないと、sceneId:progression.root.sceneIdが使えないから・・・でいいののか?
(CastSpriteはprogressionプロパティをもっていないので)

それでも、CastSpriteに閉じるボタンをおきたいときは、
progression.root.sceneIdをtraceすると中身は”/index”だったので、、、
var sId:SceneId = new SceneId(“/index”);とSceneIdのインスタンスを用意して
sceneId:sId;
としてあげればOKでした。

[AS][?]最初のフレームに書き出し、について

元記事

AS2で、attachMovieを使ってステージに配置するとき、リンケージプロパティの、最初のフレームに書き出しにチェックが入っているときの注意。
これは1フレーム目のフレームアクションよりも先に、attachMovieされてしまうということだろうか?
つまり1フレーム目のフレームアクションにローディング処理が書かれていても、先にattachされてしまっているために、attachした分の読み込み状況が確認できないという事態になるのだろう。

対処法は元記事に書かれているとおり。

ただ最初のフレームに書き出しにチェックを外した場合、ステージ上にattachするMCをあらかじめ配置しておかないといけない。

(attachの仕方はこちらもかなり参考になる。)

ということは改めてattachする意味ってあるのか?
最初からステージに置いとけなくてattachがmustなケースってどんなケースだろ。

>追記
クラスをリンケージしたMCを使うときは、このケースがmustっぽいかな。

[AS][?]オブジェクトの変数名をfor文で回せるの?

どうやればいいのだろう。
これだと、nullになっちゃう。
配列につっこんで管理するしかないのか?


for(var i:uint = 0; i<3;i++){
	var sh0:Sprite;
	var sh1:Sprite;
	var sh2:Sprite;

	var sp:Shape = "sh"+i  as Shape;
	sp = new Shape();
	var spg = sp.graphics;

	spg.lineStyle(5,0xff0000,1,true);
	spg.moveTo(0,0);
	spg.curveTo(100,100,i*50,200+i*10);
	spg.endFill();

	addChild(sp);
}
trace(sh1);//nullになる

///////////////////////////////////////
//12/5 追記
//根本的に書き方がおかしかった
//これなら参照できるけど、sh0,sh1,sh2の定義がfor文で重複してる。。。
//もう少しマシな書き方がありそう・・・


for(var i:uint = 0; i<3;i++){
	var sh1:Shape;
	var sh2:Shape;
	var sh0:Shape;

	var sp:Shape = new Shape();
	this["sh"+i] = sp
	var spg = sp.graphics;

	spg.lineStyle(5,0xff0000,1,true);
	spg.moveTo(0,0);
	spg.curveTo(100,100,i*50,200+i*10);
	spg.endFill();

	addChild(sp);
}
trace(sh1)