7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FLASHerAdvent Calendar 2016

Day 3

AS1最高!

Posted at

さて、 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でした。


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

7
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?