Entries of flash

AS3メモ Commandライブラリ欲しい

AS3色々触った感想としては、サクサク実験する為にはCommandパターン用のライブラリが是非とも欲しいなぁ。
些細なカスタマイズや動作の定義をするごとに、イベントリスナー割り当てたり、サブクラス作ったりするのはかったるすぎる。

Commandクラスってのは、インスタンス作成時に呼び出したい関数と引数を登録して、execute()実行時に登録した関数を実行してくれるクラスの俗称。

考えてるのはだいたいこんなの。

オーソドックスなコマンド

var command:Command = new Command( オブジェ参照, 関数参照, [パラメータ]);
command.execute()  //これで指定の関数を実行

遅延コマンド

var command:DelayCommand = new DelayCommand( オブジェ参照, 関数参照, [パラメータ], 遅延フレーム数);
command.execute()  //これでnフレーム後に関数が実行される

一括実行コマンド

var command:MacroCommand = new MacroCommand( [command1, command2, command3] );
command.execute()  //これで、一連のコマンドが順番に実行される

うーん、あと欲しいのは、なんかエクスプレッションで分岐できるコマンドとかかな・・・

こういうクラス作って、クリックしたら割り当てたコマンドを実行してくれるボタンクラスを作れば、onPressの代替としてFlash9でも結構スムーズに試行錯誤ができそう。

AS3 ライブラリアイテムに関連付けたクラスのサブクラスは、アイテムに関連づけられない

ふ ざ け る な 致 命 的 設 計 ミ ス だ !

どういうことかというと、FldButtonクラスを作ってライブラリのアイテムと関連づけた場合、 そのサブクラスであるFldCheckBoxをライブラリのアイテムに関連づけようとすると、

The class net.fladdict.simpleUi.button.FldCheckBox cannot extend net.fladdict.simpleUi.button.FldButton since both are associated with library symbols or the main timeline.(両方ライブラリかタイムラインに関連づけられてっから、FldCheckBoxはFldButttonを継承できないんだカス!)

といわれる。

つまり、アイテム毎に「関連付け専用」のサブクラス作っとかないと、アイテムと関連づけられるサブクラスを作れないって、これオーサリング環境でAS3組むなら致命的じゃないですかね?

これさ、FldButton作ったら、リンケージする為だけにFldButtonLinkageってクラス作って使用するようにしないとダメじゃん。そうしないとリンケージ可能なサブクラスFldCheckBoxが作れない。

Flash9のリンケージで、ダミークラスを作るときにダミークラスを一律MovieClipのサブじゃなくて、ちゃんとスーパークラスを指定できるようにしてもらえれば、問題解決なんだけどFlash9の機能要望ってどこに送ればいいんでしょ。

オーサリング環境じゃすんげぇ使いづらいよ、コレ!。

AS3メモ AS3ボタンコンポーネントアイデア

にごりゆず酒を一人でガブ飲みしていたら、脳内にActionScriptの神が降臨した。

AS3の1アイテム1クラスという構造の中で、複数のスキンを適用できる再利用可能なボタンコンポーネントの作り方を考えていたのですが、ようやっと現実味のある案を思いついた。

なんていうか、解決してみればすごいシンプルな手法でいけそう。
SimpleButtonクラスを拡張してボタンコンポーネントをつくり、拡張SimpleButtonコンポーネントが親MCをスキンとして使用すればよいのではないかと。

こうすれば「ボタン」という機能は拡張SimpleButtonが1つのクラスで担当でき、拡張SimpleButtonを内包するだけであたらしい外見のボタンが作成できるので、スキン毎にasファイルを容易する必要はなくなります。

オーサリング環境で使用する場合には、拡張SimpleButtonを内包したアイテムはステージ上に置くだけで機能しますし、スクリプトからアタッチする場合はスキンとなるMCを配置すれば、ボタンとしての機能は自動的に追随します。 

あぁ、なるほど!! こうすればよかったんだ!!!!!!!!!
ちょっと酔っ払ってるけど、いまから検証しる。

AS3 XMLにネームスペースがあると普通には値が取得できない2

色々実験して、一応、正しい(?)対処方法を発見。
なんかXMLが大嫌いになった僕がいました。

amazon apiの場合、ネームスペースが

xmlns="http://webservices.amazon.com/AWSECommerceService/2005-10-05"

なので、

ns = new Namespae("http://webservices.amazon.com/AWSECommerceService/2005-10-05")

var isValid = xml.ns::Items.ns::Request.ns::IsValid

という風に、どうやらE4Xでエレメント毎に「ネームスペースの参照 ::」をつけてやらないといけないらしい。

どういうことかっていうと、AS3でXMLノードを他の関数とかに渡す場合には、一緒にネームスペースも渡してやらんと、関数で値が取得できないんじゃないか、ということ。最悪、XMLの種類毎にパーサ用意して随時オブジェクト化するように心がけないといけないかもしれない。

っていうか、パース前にストリング弄くってネームスペース削るほうが絶対楽だなぁ・・・・
こういう場合、removeNamespaceとか使って、ネームスペース殺せばいいんでしょうかね。

教えてエロイ人。

AS3 XMLにネームスペースがあると普通には値が取得できない

今まで、どうして誰もAS3でアマゾンのサンプルを作らないのか、ずっと疑問だった・・・
というかFlex2ベーダで3回ぐらい挑戦して、全部挫折していたのだけどようやっと原因が判明。

新しいXMLクラスのE4Xで、amazon apiのエレメント取得できねぇでやんの。

xml.Items.Item とかやっても常に空っぽ。

で、仕方なくxmlをローカル保存して、1行づつ削って検証した結果、どうやらItemResponseにあるネームスペース、xmlnsを削除すればxmlの値が取れるようになった。

純正Flash使いにとって未知の概念なので、多分99.9%の人はつっかえるよココ。
上条先生のブログでは多少説明されてるけど、既存のFlashユーザーが概念を理解するには、ちょっと前提知識が省略されてる感じ。

名前空間( dc: みたいなの)がXMLにある場合には、 NamespaceオブジェクトやらQNameオブジェクトやらが必要みたい。しかし、AmazonのItemResponseにはxmlns以下にアドレスはあれど、空間の名前が書いてない。こういう場合はどうやって取得するんでしょう。

現状、戻り値からリプレイスで、名前空間を無理矢理に削除してしてから、XMLパースしてるけど、明らかに誤った解決方法だからなぁ。正しい方法見つけなくちゃ。
上条先生、是非是非トラックバック有効にしてください(涙)

AS3メモ 無名オブジェクトの構造体って使えるん?

AS2では、オブジェクトに名前と値のペアをつっこんだ構造体を、すんごい多様してたけど、これってAS3でありなん?

var obj:Object = {hoge:1, hoge:2, hoge:3}
for(var i in obj){
trace( “name:” + i)
trace( “value:” + obj[i])
}

一応、動くみたいだけど。厳格じゃないっていうかAS3のコンセプトからは逸脱しているような・・・
AS3で、これに対応するデータ管理方法ってなんなんだろう。 Dictionaryなんすかね?

無名オブジェクトでの連想配列使っていいのかどうかよくわからんち。

なんかAS3勉強会してぇ

したくね?
1日ガッツリやった感想としては、言語は独学で理解できても、ノウハウ1人で作るの無理だこりゃ。
オーサリング時のMCの構造とかのノウハウが、大幅に変わりそうなんだもん。

OOP勉強会みたいなタイプじゃなくて、5~6人の少数精鋭で喫茶店とか誰かの家とか集まって、実際にコードかきながらペアプログラミングみたいのするだけの奴。自分の作りたいもの作って、途中でつっかえたらコード見せ合って情報交換する感じ。 Noテキスト、Noティーチャー、Noプレゼンテーションの奴。
メッセ+FCSのお絵かき掲示板でもいいや。

誰かやりません?

AS3メモ AS3用コンポーネントのアイデア

AS3で、Flash上でオーサリングしたMCをUIコンポーネントとしてどうすればいいのかな?
っと昨日のよるずっとvoidさんとチャットしてた。

ライブラリのアイテムとClassが一対一の関係なので、UIの外見の数だけサブクラス作るような事態は避けたい感じ。

んだけど、そんで考えた自分なりのアイデア。

AS3メモ MouseEventについて

どうもAS2とAS3のマウスイベントのキャプチャー方法に、癖の違いがあって混乱するのでメモ。

AS3メモ ライブラリへのクラス結びつけについて

ようやっとFlash9に触り始めて、気になったことのメモ。

Flash9からは、ライブラリのアイテムからリンケージIDがなくなって、そのままクラスを割り当てるようになりました。

で、問題。
ライブラリのアイテムとクラスはどうやら一対一の関係なんですよね。

かりに、MyButtonクラスをMCに結びつけるとする場合、
その場合、異なる外見でボタンとして使いたいアイテムが5種類あった場合どうすればいいんだろうか?

わざわざ extends MyButton みたいに書いただけのサブクラスをアイテム毎に用意しなけらばならないの???? それはちょっとメンドイ。 多分、AS3での製作上でAS2ともっとも勝手が違う部分ってのはこの辺なんじゃないかな。

今までのノウハウが役に立たない感じなので、打開案をいくつか考えた。

・覚悟を決めて、アイテム毎にMyButtonのサブクラスを作る。
この場合、ボタンの増減にあわせてファイルが超変動しそう。

・MyButtonクラスと結びつける1つのMCに全ての外見を格納し、スキンとして実行時に外見を割り当てる。
オーサリング状態では、まったくデザインができなくなりそう。
っていうか、重そう。

・ボタンにMCやdisplay系を継承させないようにする。んで、実行時に画面上のMCをボタンに引数で渡すと、そのMCがボタンとして機能するようにする。
これが一番現実的かなぁ、ただボタンのコンテナっぽい階層でMyButtonを初期化するコードを書く必要がある。

うーん、どうすればいいんだろう。
妙案ある人おしえてください。