• 7
    いいね
  • 1
    コメント

さて、 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がめんどくさいのは(言っちゃった)、
1. AというオブジェクトにBというイベントリスナーを設定
2. オブジェクト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でした。


みなさん、よいお年をお迎えください。