ホーム > タグ > flash

flash

ですから奥さん、FlashDevelopにちょっとうれしいプラグイン3つなんです

2008-09-14追記 すみません!「trace文をショートカットキーで書いてくれる便利なヤツ」のurl間違えてました!

PCの操作で不便に感じることがあれば真っ先に思うのが、「誰かが作ってくれてるやろ」ですね。だからwindowsはやめられない。そんなことで、FlashDevelop回りで調べたら見つかったプラグイン3つです。

以下、すべてFlashDevelop3.0.0 beta7での設定です。

1. as3・as2でASDocを吐き出してくれるやつ

5分もかけずにas3のASDocを吐き出すらしい

厳密にはプラグインではありませんが、コマンドラインを勝手に叩いてくれます。

http://www.flashdevelop.org/community/viewtopic.php?t=918

  1. FlashDevelopを起動。
  2. 「tools」→「Custom Arguments」でkeyとvalue を設定します
    • name → "ASDoc",
    • value → flexのpath\bin\asdoc.exe,
  3. ツールバーに「ASDocを作成」するボタンを追加します。ソースは上記リンク先で。

FlashCS3用のプロジェクトだと、結構失敗します。コンポーネントとかはうまいこと指定しないとできないかもしれません。

2分くらいでas2でのASDoc(as2api)

デフォルトで入っていました。しかもGUIで。

  1. 「tools」→「Flash Tolls」→「AS2API GUI」
  2. 必要項目を入力
    • pagetitleはhtmlのタイトルとか
    • packageはASDoc化したいパッケージ。「com.katapad.*」みたいに書く。
    • Outputとclasspathはそのまんまなので適当に入力
  3. 「Generato Documentation」ボタンを押してできあがり!…って文字化けしてるじゃねーか!
    • 文字コードがiso-8859-1で書き出されるので文字化けします。ちょこっといじくる必要ありです。

      1. 「tools」→「Application Files」でエクスプローラが開くので「Tools/as2api」 を開く
      2. as2apigui.bat をテキストエディタで開きます。iso-8859-1と書かれてるとこをutf-8に変更して保存
      3. as2apigui.batを実行すると、ようやく文字化けが直ります。

文字化けがうざいですが、それでもかなりの時間短縮になりますね。

2. trace文をショートカットキーで書いてくれる便利なヤツ

andrewlucking.com � fdtracer
FlashDevelop Trace Plugin
http://www.andrewlucking.com/archives/category/fdtracer/
http://www.double-quotes.com/flashdevelop/trace-plugin/
  1. ダウンロードしたら「tools」→「Application Files」→pluginディレクトリにぶち込む
  2. FlashDevelop再起動

変数とかを選択して「ctrl + 0」もしくは「ctrl + shift + 0」でtraceがきれいな形で!スニペットのtracethisと組み合わせたら、かなりの量のtraceを自分で書かずにすみます。

2-1 trace文をのぞき見するplugin

間違えて上のtraceのプラグインとこに書いてたurlのプラグインです。

こいつはブラウザで見たswfのtrace文を拾ったりしてくれます。要debug playerです。

andrewlucking.com � fdtracer
http://www.andrewlucking.com/archives/category/fdtracer/
  1. ダウンロードしたらpluginディレクトリにぶち込みます
  2. F10押して設定を開きます。
  3. FDTracerの項目でflashplayerのlogファイルへのパスを設定({user}と書いてあるところをpcのユーザ名に)します
    • mm.cfgというテキストファイルを新規作成して、Cドライブ直下に置きます。中身は以下

      TraceOutputFileEnable=1
      ErrorReportingEnable=1
      TraceOutputFileName=C:Documents and Settingsユーザ名Application DataMacromediaFlash PlayerLogsflashlog.txt
  4. debugplayerを使ってその辺のサイトを見る。FlashDevelopのFDTracerパネルにたくさんtraceされてるはずです。マァ、いやらしい。

3. addEventListenerのrollOverHandlerとかをrollOutHandlerに勝手に書き換えてくれたりする、今回紹介する最強のplugin

以下にムービー付きで紹介されてます。今日は徹夜なのにブログを書く気にさせてくれるほど、ものすごい便利です。

FlashDevelop Duplicate Plugin
http://jde.name/duplicate/
mc.addEventListener(MouseEvent.ROLL_OVER, rollOverHandler);

と書いた文を複製すると

mc.addEventListener(MouseEvent.ROLL_OUT, rollOutHandler);

Eventのtypeとハンドラまで「out」に書き換えて複製してくれます。まだ続けて複製するとclick、doubleClickまで書いてくれます。ヤッベー。ヤッベヤッベ。

mc.addEventListener(MouseEvent.CLICK, clickHandler);
mc.addEventListener(MouseEvent.DOUBLE_CLICK, doubleclickHandler);

他にもtrue→falseを切り替えたり、連番を自動で振ったりとかなり便利です。ありがとう、神様。

AS2で遅くなる書き方を研究しようか

上条さんとこで、AS2でOOPをやると遅くなる可能性があると書いてあって泣いた。

AS3 で動的言語のススメ

AS2 における型の使用は、オーサリング時の ”生産性向上のベストプラクティス” としての位置づけ以上ではないわけです。実際 OOP をまじめに追求するほど AS2 のアプリケーションは遅くなる傾向を持っています。

気になったので、単純なカウントアップでベンチマークをとった。

試したところは以下

  • タイムラインに書くかクラスに書くか
  • 型宣言の有無
  • 処理をfunctionにくるむかどうか

AS2でタイムラインに書く。型宣言はなし

//型宣言なし
var startTime = getTimer();
var trialNum = 100000;
var cnt = 0;

for (var i:Number = 0; i < trialNum; i++) {
	cnt++;
}
benchmark();

function benchmark()
{
	var endTime = getTimer();
	trace("time: " + (endTime - startTime));
}
//だいたい228

AS2でタイムラインに書く。型宣言あり・カウントアップは生で書く

//型宣言あり
var startTime:Number = getTimer();
var trialNum:Number = 100000;
var cnt:Number = 0;

for (var i:Number = 0; i < trialNum; i++) {
	cnt++
}

benchmark();

function benchmark()
{
	var endTime:Number = getTimer();
	trace("time: " + (endTime - startTime));
}

//だいたい230

AS2でタイムラインに書く。型宣言あり・カウントアップはfunctionにくるむ

リファクタリングの本やOOPの本を読んでいると、できるだけ細かいfunctionに分けるべきだ、と書いてある。確かにそのほうがやりやすいが、やればやるほど遅くなる気はしていた。

//型宣言あり,function
var startTime:Number = getTimer();
var trialNum:Number = 100000;
var cnt:Number = 0;

for (var i:Number = 0; i < trialNum; i++) {
	countUp();
}

benchmark();

function countUp():Void
{
	cnt++;
}

function benchmark():Void
{
	var endTime:Number = getTimer();
	trace("time: " + (endTime - startTime));
}

//だいたい709

クラスに書く

クラスに書いてみた。やってる中身は上とほとんど一緒。試したのは以下。

  • 型あり
  • 型あり・function
  • 型あり・別クラスstatic function
  • 型あり・別クラスを参照static function
    「型あり・別クラスstatic function」は

    for (var i:Number = 0; i < trialNum; i++) {
    	cnt = sandbox.BenchTest.countUp(cnt);
    }

「型あり・別クラスstatic function」は

var test:BenchTest = BenchTest;
for (var i:Number = 0; i < trialNum; i++) {
	cnt = test.countUp(cnt);
}

AS2速度まとめ

型なし 型あり 型あり・function 型あり・別クラスstatic function 型あり・別クラスを参照static function
タイムライン 228 230 708 455
クラス 102 101 245 313 227

ループ処理だけでの単純な比較なので、あまりあてにならない。

実際のところどっちが速いのかよくわからん、という結果になった。とりあえず、タイムラインでのfunctionがやたら遅いということがわかった。アクティベーションオブジェクトのせいだろうか。

でも、OOPにのっとってめちゃくちゃ細かく分割すると、遅くなることは事実だろう。わりと、お茶濁しな結果に!

AS3とAS2での差はクラスのメンバにあるかどうかでかなり変わる

AS3では

var point:Point = new Point(x,y)
point.x++;

と書くとめちゃくちゃ早い。メンバ変数であるかどうかがかなりの違いの模様。

これを単なるオブジェクトとして扱うとめちゃんこ遅くなる。ハッシュがどうのこうのらしい。配列はそこそこ早い。
PointとArrayで速度比較

var obj:Object = new Object();
obj.x = 1;
obj.x++;

AS2ではどれをやってもほとんど同じ速度だった。

さっさとAS3に全部移りたいぜ!

//var point:Point = new Point(1, 1);
//var obj:Object = new Object();
//obj.x = 1;
var array:Array = [1];
for (var i:Number = 0; i < trialNum; i++) {
	//point.x++;
	//obj.x++;
	array[0]++;
}
AS2でメンバとかの速度
point.x++; obj.x++; array[0]++;
94 93 106

いまさらDelegate.createを理解しようと思ったけれど、謎が深まった愛され系の俺

長らくAS2でお世話になっているおまじない、Delegate.create。ただなんとなしに使うのではなく、そろそろ理解しようと思い調べてみました。

理解するためには2つ必要でした。

  1. argumentsオブジェクトの理解
  2. Functionクラスの理解

argumentsオブジェクトの理解

argumentsオブジェクトは引数オブジェクトのことです。アクセスするには配列演算子を用いますが、単なる配列とは異なるようです。

argumentsオブジェクトにはcallerとcalleeプロパティが存在します。

arguments.caller

現在実行中の関数を呼び出した関数への参照となります。関数オブジェクトはdynamicクラスなので、あとからいくらでもプロパティを追加できるので、実際に参照しているのかテストしてみましょう。

function firstStep(){
	secondStep();
}
firstStep._x = 1;

function secondStep(){
	trace(arguments.caller._x);
	arguments.caller._x++;
}
firstStep();   //1が出力される
firstStep();   //2が出力される
firstStep();   //3が出力される

arguments.callee

現在実行中の関数への参照となります。

Functionクラスの理解

Function.apply()

Function.apply(scope:Object, [argArray: Array ]) :Void

functionオブジェクトのthisを置き換えるのがこのapplyメソッド。
これをうまく使えばmc.onReleaseなどのthisが変わるめんどくささから解放されます。

以上を踏まえて、mx.utils.Delegate.create()では何をしているのかというと

まずはmx.utils.Delegate.create()のコードを見てみましょう。

static function create(obj:Object, func:Function):Function
{
	var f = function()
	{
		var target = arguments.callee.target;
		var func = arguments.callee.func;
		return func.apply(target, arguments);
	};

	f.target = obj;
	f.func = func;
	return f;
}
  1. functionオブジェクト(var f)を作成
  2. functionオブジェクトに匿名関数を参照させる
  3. functionオブジェクトはdynamicクラスなので、追加プロパティを作れる
    • scopeとなるobjectと関数を保持させる
  4. 匿名関数内で、arguments.calleeを使って、自身(現在の関数)を参照し、
    • 先ほど保持したscopeと関数を拾う。
    • func.apply()で意図したscopeにfuncを割り当てる(thisを変える)

だいたいこんな感じでした。しかしながら、func.apply()には同時に引数も渡せるはずです。なので、ちょっと付け足してみました。

static function createWithArgs(obj:Object, func:Function, args:Array):Function
{
	var f = function()
	{
		var target = arguments.callee.target;
		var func = arguments.callee.func;
		return func.apply(target, arguments.callee.args.concat()); //ここを追加
	};

	f.target = obj;
	f.func = func;
	f.args = args; //ここを追加
	return f;
}

applyメソッドの第2引数にarguments.callee.args.concat()を追加するとうまく引数を登録できます。
引数の配列となるargsはconcatしないとうまく動作しません。

このあたりがさっぱりわからなかったので、ググってみましたがめぼしいものは見つからずさらに謎の動作まで見つけてしまいました。

http://library.sfug.ch/trac/browser/trunk/doc/as2/examples/sfug_as2lib/ch/sfug/utils/Delegate.as

ここはarguments.shift()でscopeとfuncを定義してるあたりがおもしろいですね。concat(arguments)でさらにdelegateした後で呼び出したときの引数も定義しています。なぜargumentsが使えるのかがなんとなくでしかわからないので、完全なる理解にはしばらく時間がかかりそうです。

as3はじめました

さてみなさん、ときめいていますか?僕は元気です。心配しないでください。I’m fine thank you.

前回のエントリで目標を設定しました。2008-03-31までにActionScript3.0アニメーションという本を読了するのが目標です。なのでちょこちょこ記していきます。

単にサンプルを書くだけではつまらないので、TOPページにおいてあるunkoFlashをas3にして、リファクタリングする作業も合わせて課題にします。

まずはサンプルを作ったりする前に事前準備ですね。

制作環境

マシンとソフト

  • WinXP
  • Flash CS3 IDE
    (コンパイルするだけ)
  • FlashDevelop
    (メインのエディタ。コード補完が最強なので、as2とas3の違いによる単純な書き損じを減らせる)
  • Flex SDK
    (コンパイルするだけだがまだ導入してない。誰かが背中を押してくれたら試す)

as2との違い

なんやかんややる前に事前に調査しとく。

イベント処理

  • Sprite.addEventListner()で自身がイベントをリスンしていることを伝える
  • MouseEvent.MOUSE_DOWN == onPress
  • MouseEvent.CLICK == onRelease
  • onReleaseOutsideが削除(歓迎!)

プロパティ

  • _xなどアンダーバーがなくなる
  • rootとmaskがプロパティになった

データ型

データ型が増えた。以下増えたやつ

データ型 初期値 範囲 使いどころ
int 0 正負の整数
(-21億~+21億)
整数
uint 0 正の整数
(0~42億)
forでi++するとき

MCやSpriteなどの重なりとかDisplayオブジェクトらへん

  • stage.framerateでFPSを変更しまくれる
  • rootの扱いがよくわからん。lockrootとかどうなるのか。そのへんを大重さんが書いてたけどいまいちわかってないので、もう少し勉強。外部swfからメインタイムラインにはどうやってアクセスするのか。
  • as3からaddChild方式に変わった。htmlのDOMに似た感じ。
  • container.setChildIndex()などで順序を切り替えていく

どこからどうログしていけばいいのか難しいですが、覚えたいことはログしていきます。

IEでSWFObjectを使うときの一つの注意点

2009-05-19追記 対処法をちょこっと書きました http://katapad.com/wp/2009/05/19/stage_size_zero_issue_with_swfobject_on_ie

IEでwidth: 100%、height: 100% のswfを埋め込むときにハマったのでメモ。

IEのムチャクチャな描画速度は、SWFObject を軽く凌ぐようで見事にハマってしまった。リスト化してメモ。

  • IEのflash設置速度が速い
  • しかし、SWFObjectの処理速度は遅い
  • SWFObjectで設定した幅、高さを計算する前に、FLASHの1フレーム目を描画してしまう
  • 結果、Stageの幅、高さが0の状態でswfを描画してしまう。

だいたいこのような感じ。IEは描画だけは恐ろしく速い。

解決策は、Flashの1フレーム目に空のフレームをおくことで対処できた。 以前、スーパープログラマに似たような現象を教えて頂いてたのだが、半信半疑だったのでやってなかった。 半信半疑で本当にすみません。額を床につけるほうの土下座をします。

Home > Tags > flash


Search
Feeds
Meta

Return to page top