さて、 FLASHer Advent Calendar 2016の3日目、現役Flasherのノデラユウジです。
本題に入る前に余談ですが、1日目feb19さんのイージングの話
http://feb19.jp/blog/archives/000286.php
ここに出てくる「イン」「アウト」は、奥行きがあると仮定すると、
・等速で奥に移動していく物体 →遠くに行くほど変化が少なくなる →OUT
・等速で手前に移動してくる物体 →近くに来るほど急激に変化する →IN
と覚えておくといいといいと思います。
余談おわり。
AS1とAS2、AS3の違い
ぼくを知ってる人は、AS3で書いた、と言うと「書けるの?」とびっくりする人が多いくらい、普段AS1で書きます。
(AS3で書くときは、毎回思い出すためにググります)
今時のFlaserはAS1を知らない人の方が多いかもしれません。
注意)AS1で書くには、Flash CS6以前のバージョンが必要です。
Action Scriptには、AS1、AS2、AS3とありますが、
かなりざっくり違いを書きます。
AS | 型指定 | FlashPlayer |
---|---|---|
AS1 | なし | AVM1 |
AS2 | あり(なしでも可) | AVM1 |
AS3 | あり | AVM2 |
はい、ざっくりですね。自分でもびっくりです。
クラスを作ったりしないので、ぼくには十分です。
型指定しようがしまいが、AS1とAS2は同じエンジン(AVM1)で動きます。
AS2で、なんの為に型指定するかというと、コンパイル(パブリッシュ)の時にチェックさせる為だけです。
なので、指定しようがしまいが、swfになってしまえば同じだと思っていいと思います。
AS1
x = 1; //ok x = "hello"; //ok
AS2
var x:int = 1; //ok var x:int = "hello"; //コンパイルエラー:
このとき、AS1では、1が代入されれば、数字だろうなとか、"hello"って来たら文字列だろうとか、
勝手に判断します。
1+1は2になるし、1+"個"は"1個"になります。
はい、便利です。
この便利な勝手に判断してくれる機能をやめて、厳密に型指定するようになったのがAS3です。
これはコンパイルエラーにもなりますが、実行時に1+"個"みたいな、数値と文字列を+してもエラーになります。
AS1とAS3のちがいは、スクリプトの書き方だけではありません。
AS1はMovieClipというオブジェクトを中心とした階層構造でできているので、
たとえば、サウンドオブジェクトもMovieClipにぶら下がっていますし、イベントもしかりです。
AS1では、ステージ(タイムライン)から消えたオブジェクトは、メモリ上から消えます。
親が消えれば子も消えます。
AS3がめんどくさいのは(言っちゃった)、
- AというオブジェクトにBというイベントリスナーを設定
- オブジェクトAを削除
このとき、Aがなくなったのに、Bは残ったまま幽霊になります。
AS1の好きなところベスト3
AS3ではできない、大好きなところベスト3です。
第3位「タイムラインのサウンドの音量のコントロール」
a_mcの中にb_mcがあるとします。
b_mcにサウンドオブジェクトを作って音量50で再生するとします。
a_mcにもサウンドオブジェクトをつくって、音量を50にすると、b_mcの最終的な出力音量はさらに半分になります。
※AS3は0~1ですが、AS1では0~100です。
これは、MCの_alphaで考えるとわかりやすいです。
b_mc._alpha = 50;
a_mc._alpha = 50;
とすると、b_mcのみた目は_alphaが25なるのと同じです。
親を変えると子に影響するのが、音でもできるということです。
本当に便利なのは、そこではありません。
Flashはタイムラインで音を再生できます。
というか、タイムライン上のアニメーションと完全に同期させるには、
タイムラインに「ストリーミング」で音を配置せざるを得ないのです。
これはスクリプトではできません(できないはず)。
そして、その音量は固定されているので、動的にコントロールしたいときに上記の仕組みがいかされます。
mc_bのタイムラインにストリーミングで音声を配置した場合、
サウンドオブジェクトを作ったわけではないのに、
上位の音量などのパラメータを引き継いでくれるわけです。
以上、第3位でした。
第2位「無茶なファンクションの呼び出し」
btn1というMC、もしくはボタンオブジェクトがあったとして、リリースイベントで何か実行したいとき、
下記のように書けます。
btn1.onRelease = function(){ trace("ボタン押したよ"); }
まあ、ここまでは普通です。
btn2からもbtn1と同じことをしたくなったとき、このような書き方ができてしまいます。
btn2.onRelease = function(){ btn1.onRelease(); }
はい、気持ち悪いですね。
onReleaseがイベントなのかファンクション名なのか、もはや不明です。
コードも汚くなるでしょう。
できるよ、っていいたかっただけです。
時間に追われると役に立つときもあるんです。
また、
btn1.onRelease = btn1.onReleaseOutside = function(){ hoge(); }
とかもできます。
以上、第2位でした。
第1位「_global変数に参照を代入」
もう大好きすぎて死にます。
グローバル変数は、パスを気にせずどこからでも参照できる変数です。
超深い階層のMC、_root.a.b.c.d.e.f.gに
txt = "そばにいるよ";
って書いて参照するには、
trace(_root.a.b.c.d.e.f.g.txt);
ですよね。
遠いですよね。
これをどこからでもtxtで参照するには、
超深い階層のMC、_root.a.b.c.d.e.f.gに
_global.txt = "そばにいるよ";
とするだけ。どこからでも、
trace(txt);
と書くだけです。
そんな_global変数に参照を入れると、そばにいる感がハンパないです。
_root.a.b.c.d.e.f.gにはいろいろ入ってていつでもアクセスしたいんだ!というときは、
超深い階層のMC、_root.a.b.c.d.e.f.gに
_global.G_mc = this;
と書くだけで、どこからでもG_mcが参照できてしまいます。
G_mc.play();
するもよし。
G_mc.txt = "ここにいるよ";
するもよし。
以上、トップ3でした。
みなさん、よいお年をお迎えください。