てっく煮ブログ

2007年05月08日

AS3 は FLASHer には使いにくい?

FLASH ばりばり使ってる人たちのブログを読んでいると、AS3 が使いにくい、という文句が出てきてるようです。

例えば

特に一番不便なのが宣言なしに気軽にSpriteとかにプロパティつけれないとこ。

も〜いちいちなにがpublic privateだgetだsetだ!w

Muraken.biz

とか

AS3って、2時間ぐらいでインタラクティブスケッチ作るとか、超不向きじゃね?

fladdict » processingライクにくめるAS3が欲しい

といった感じで。

プログラマ的な感覚からいくと、AS1、AS2 の createEmptyMovieClip で new + addChild するところとか、_x のアンダースコアなところのほうが許せず、私は AS3 になってやっと触れるようになりました。

でも、確かに気軽にごにょごにょっとアニメーション作るには AS3 はめんどくさいところが多そうです。

それを解決するために fladdict さんが 構想中のフレームワーク と、それに触発された void element blog さんの AS1MovieClipクラス がおもしろいので、ちょっと見てみました。

fladdict さん製を見てみた

http://twitter.com/fladdict/statuses/43108192 から開発中のコードがのぞけます。

DynamicSprite クラス

package sketchbook.display
{
	import flash.display.Sprite;
	
	dynamic public class DynamicSprite extends Sprite
	{
	}
}

という実装が素敵。前出の「Sprite にプロパティつけれない」という問題は解決しますね。

他にも、_global を実現するためのクラスがあったり、描画が簡単になりそうだったり、色を扱うためのクラスライブラリがあったりします。

SpriteHelper はブログの記事にもあるとおり、Sprite を継承するのではなく、クラス内部に変数として保持しています。オブジェクト指向用語でいう委譲になります。

AS1MovieClip (void element さん製)を見てみた

AS1 や AS2 と同じように使える、という点に主眼をおいて作成されています。

深度管理も今まで通り。

createEmptyMovieClip や attachMovie、swapDepths のメソッドはもちろん、_x などのアンダースコアつきのプロパティも使えます。

AS3 ではα値は 0〜1 ですが、_alpha では AS1・AS2 時代と同様 1〜100 で指定できるようになってます。

バリバリの FLASHer さんは嬉しいんじゃないでしょうか。


AS1MovieClip は MovieClip クラスを継承して実装されています。委譲として実装している fladdict さんと対照的でおもしろい。

delete mc.onEnterFrame できない という話ですが、記事にもある通り Proxy クラスを継承するしかないでしょうが、その場合、継承ではなく委譲で実装する必要が出てきますね。

継承と委譲

それぞれの利点など。

Sprite や MovieClip のことをあえて MC と略します。

  • 継承(void element さん)
    • new で作成したインスタンスを CS3 や AS3 の MC に addChild できる
    • でも、CS3 や AS3 が生成した MC に適用することはできない
    • MovieClip の派生クラスを機能拡張することもできない
  • 委譲(fladdict さん)
    • MC (とその派生クラス)に一皮かぶせることができる
    • でも、mc is Sprite や mc is MovieClip が false になる。
    • かぶせた中身を取り出すためには、mc.target と書かなきゃならない。

継承や委譲の使い分けについては、オブジェクト指向を語る上では議論が尽きないところで、それぞれにメリットデメリットがあって難しいところです。

(追記)2007/5/9 0:25

secondlife さんが subtech - Pink Blossom Diary StrikerS - SpriteHelper にて補足してもらってます。stash 案もおもしろいですね。この辺は本当に好みの世界になってきそう。

Progression 開発者の nium さんが、で、結局 FLASHer 的に AS3.0 って・・・ (blog.nium.jp) にて、AS3 の本当にめんどくさいところを書いてくれています。こちらも、かなり同意。特に、イベント登録と、navigateToURL が煩雑になる、あたりは今後も、ライブラリが色々でてきそうな予感。

むらけんむらけん 2007/05/08 14:48 >>も〜いちいちなにがpublic privateだgetだsetだ!w
きゃ〜!!お恥ずかしい!w

fladdictfladdict 2007/05/09 00:08 >かぶせた中身を取り出すためには、mc.target と書かなきゃならない
あぁ、なるほど。
こういう使い方もあるっすね。

ボク的には、DynamicSpriteインスタンスに直接、dynamicSprite.h = new SpriteHelper(dynamicSprite)
みたいに、自身のヘルパーを定義するような使い方を考えてました。
扱うのはあくまでスプライトで、そのスプライトになにか実行する場合に、mySprite.h でヘルパーにあくせすするみたいな感じがいいんじゃないかと。

nitoyonnitoyon 2007/05/09 00:32 > むらけんさん
どうもです。素直な感想が素敵だったので、思わずのせてしまいました!

> fladdict さん
Sprite と SpriteHelper の両方を引数に渡すようなケースができてしまうぐらいなら、SpriteHelper だけを渡して、.target でアクセスしたほうがきれいだと思います。
もしくは、Sprite を渡された側でも、SpriteHelper を作成するのも悪くないですかね。

fladdictfladdict 2007/05/09 01:30 僕自身色々と使い方を模索中なんですが、あとよくやるのは
・Spriteサブクラスのコンストラクタでhelperを作成。
・nitoyonさんの言うとおり外部からSpriteを弄りたいときに、ローカル変数で使い捨てでHelperを作る。
の2つでしょうか。特に1番は、AS1MovieClipサブクラスのコンストラクタで作成とかして、他のフレームワークと組み合わせる場合を意図してます。
targetは指摘されるとおり冗長なんですが、実感としてはHelperだけを受け渡す場合以外には特に使わなくてすむんじゃないかと。

munegonmunegon 2007/05/09 02:39 記事にあるようにAS1やAS2とほぼ同じ書き方でMCを扱えるようにしたかったので、委譲ではなく継承にしました。
スケッチ的な使い方が前提のクラスです。

実際AS3の記述に慣れていかないとこの先しんどいしw

taka:niumtaka:nium 2007/05/09 15:01 単に記述がめんどくさいだけであればいいんですが、イベントリスナーなんかの管理がめんどくさい系はやっかいですね。

> munegonさん
AS1的に記述したいユーザーの場合、クラスを作るのもめんどくさい、フレームアクションに記述したいという人が多そうなので、そうなると継承だと外部クラス必須になる点が悩みどころですね。

taka:niumtaka:nium 2007/05/09 20:35 ↑訂正です。
CS3だとシンボルに対してベースクラスを設定できるようになってるんですね。
それだと普通に継承で問題ないですね。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証