12月 15 2009
Actionscript 2でfpsごとの処理をする時は onEnterFrame を使います。
問題はonEnterFrame が MovieClip でしか有効にならないことと、たくさんの MovieClip インスタンスで onEnterFrame を使うと実行スピードが落ちてしまい、コマ落ち状態に陥りやすくなること。
mx.transitions.OnEnterFrameBeacon を使えば MovieClip を継承していないクラス内でも onEnterFrame が使えるようになります。
mx.transitions.OnEnterFrameBeacon は _rootの深度:9876へcreateEmptyMovieClipで空のMovieClipを作成し、その MovieClipのonEnterFrame 関数から_global.MovieClip.broadcastMessage ("onEnterFrame")を実行します。
import mx.transitions.OnEnterFrameBeacon;
class BeaconTest {
function BeaconTest () {
OnEnterFrameBeacon.init();
MovieClip.addListener(this);
}
private function onEnterFrame () {
// do something
}
}
onEnterFrame が必要なインスタンスは MovieClip.addListener(listener:Object) する。
var listener:Object = {};
listener.onEnterFrame = function () {
};
MovieClip.addListener(listener);
mx.events.EventDispatcher と組み合わせて使う。
などで、複数の onEnterFrame 関数を作らずにたったひとつの onEnterFrame で処理することが可能になります。
12月 13 2009
Actionscript 2 でインスタンスの深度(重なり順)管理に使える関数は swapDepths, getDepth と限られている。
インスタンスを最前面にするには最前面のインスタンスを変数に保持し swapDepths させる。
そのつど getDepth を使って各インスタンスの深度を走査し最前面のインスタンスと swapDepths させる。
どちらにせよ深度を変えるのに使えるのは swapDepths なので、深度を交換することしかできません。
単純に深度を変更(最前面)し他のインスタンスの深度を変更したくない時はかなり面倒くさい処理を挟まないといけなくなります。
Adobe(当時はMacromedia)開発チームもそれは承知していたようでコンポーネントように便利なクラスを開発してくれています。
import mx.behaviors.DepthControl;
// 再背面
DepthControl.sendToBack(target:MovieClip);
// 最前面
DepthControl.bringToFront(target:MovieClip);
// 深度を1段階低く
DepthControl.sendBackward(target:MovieClip);
// 深度を1段階高く
DepthControl.bringForward(target:MovieClip);
関数内部では走査処理が走っているのでインスタンスの数が多くなると当然フレームレートは落ちてしまいます。
めんどうなことはクラス内部で全部処理してくれるので便利に使えます。
11月 07 2009
Actionscript 3 + Flash Player 10 の話題が旬なことは承知していますが、Actionscript 2 なネタ。
■ mx パッケージ 使いまくり
Flash CS3 以前から添付されてたけどなぜか undocument な Adobe 作成の mx パッケージ。
今では mx パッケージは Flex Builder 用のパッケージだけど、Flash では Actionscript 2 用のパッケージとして添付されています。
このライブラリが結構使えるんだ。
mx.events.EventDispatcher
Actionscript 2 でも addEventListener ができるスグレもの。
removeEventListener, dispatchEvent と Actionscript 3 と同名の関数が用意されてる。
使用方法はビルトインされている Actionscript 3 とはチョイ違う。
import mx.events.EventDispatcher;
var dispatcher:Object = {};
EventDispatcher.initialize (dispatcher);
EventDispatcher.initialize の引数に設定した空の Object に EventDispatcher から関数が移植(?)される。
変数 _level0.dispatcher = [オブジェクト #4, クラス 'Object'] {
addEventListener:[関数 'addEventListener'],
removeEventListener:[関数 'removeEventListener'],
dispatchEvent:[関数 'dispatchEvent'],
dispatchQueue:[関数 'dispatchQueue']
}
dispatchQueue は EventDispatcher クラス内部で使われる関数のようです。
●使い方
// リスナー(Object)作成
// イベントハンドラ(Function)作成
var listener1:Object = {};
listener.onPress = function (args:Object) {
trace("listene press type="+args.type+" value="+args.value);
}
// イベントにリスナー設定
dispatcher.addEventListener("onPress", listener);
// イベント発生時にdispatchEvent実行
button_mc.onPress = function () {
dispatcher.dispatchEvent({type:"onPress", value:"some value"});
}
dispatchEvent の引数にObjectを設定。
引数のObjectにtypeキーがあることが必須。
typeの値はイベント名(String)。
Actionscript 3 とは違い続けて任意の Key:Value をいくつでも設定可能。
*Actionscript 3 でもイベントハンドラに任意の値の設定はできます。めんどくさいけど・・・
Actionscript 2 でこんな回りくどいことをしてまで addEventListener を実装するかは意見もあるだろうとは思いますが、コードメンテナンスの上でお薦めです。
まぁ、Flash Player 10 対応のコンテンツを作る現在ではムダな知識のひとつですけどね。
でもたまにいるんだよね、今でも Flash Plaer 8 対応で作れって言う人。
9月 04 2008
HydroSequence, HydroTweenにはhue,saturation,contrast,brightnessをtweenできる。
FlashのColorMatrixFilterを時系列で更新している、コア部分はGrant SkinnerさんのColorMatrixクラスが移植されていた。
Actionscript 2時にリリースされ、自分なりにextendsしたクラスを作ったりもし大変お世話になったクラスの一つ。
AS3ように自分でアップデートしていたが実際にはAS3版もリリースされていたのは、HydroTweenのソースにクレジットが記述されていて気がついた。
AS2:http://www.gskinner.com/blog/archives/2005/09/flash_8_source.html
AS3:http://www.gskinner.com/blog/archives/2007/12/colormatrix_upd.html
AS2で作ったhue,saturation,contrast,brightnessシュミレーター。