サイトトップ

Director Flash 書籍 業務内容 プロフィール

Flash ActionScript 3.0 Reference

◎01 Mathクラス

☆03 ★バネや波の動きをシミュレートしたい

解説
三角関数のsinやcosの値は、角度の変化に対してバネや波動のような周期的な変動をします(図01-03-001)。したがって、その値に比例した動きによって、バネや波のアニメーションをシミュレートすることができます。ActionScript 3.0におけるメソッドは、それぞれMath.sin()およびMath.cos()です。ともに、±1の範囲で値が増減します。引数の角度はラジアン値で指定します。度数を使う場合には、値をラジアンに変換しなければなりません。

→関連項目
ラジアンと度数を変換したい」「円・楕円軌道をシミュレートしたい」

図01-03-001■sinとcosの値の角度に対する変化【Fig07-001.png】

Mathクラス
パッケージ トップレベル
継承 Math→Object
sin()メソッド ASタイプ M
ランタイムバージョン AIR 1.0/Flash Player 9
文法 Math.sin(angleRadians:Number):Number
意味 指定されたラジアン値の角度からsin(正弦)値を計算して返します。
引数 angleRadians:Number ― sin(正弦)を求める角度のラジアン値。
戻り値 引数に指定された角度のsin(正弦)値を、±1.0の範囲の値で返します。
cos()メソッド ASタイプ M
ランタイムバージョン AIR 1.0/Flash Player 9
文法 Math.cos(angleRadians:Number):Number
意味 指定されたラジアン値の角度からcos(余弦)値を計算して返します。
引数 angleRadians:Number ― cos(余弦)を求める角度のラジアン値。
戻り値 引数に指定された角度のcos(余弦)値を、±1.0の範囲の値で返します。

記述例
角度を一定の割合で変化させ、角度に対するsinまたはcos値に比例して水平あるいは垂直座標を移動させれば、バネ運動のようなアニメーションになります。

以下のスクリプト01-03-001をMovieClipシンボルのフレームアクションに設定すると、インスタンスがバネのように上下します(図01-03-002)。DisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)のリスナー関数xMove()では、一定に増加する角度に対するMath.sin()メソッドの戻り値に比例係数を乗じて、インスタンスのDisplayObject.yプロパティに設定しています。

スクリプト01-03-001■インスタンスをバネのように上下振動させる

// フレームアクション
// MovieClip: 上下にバネ運動するインスタンス
var nRadian:Number = 0;
var nIncrement:Number = 0.1;
var nRadiusY:Number = 50;
var nY:Number = stage.stageHeight / 2;
addEventListener(Event.ENTER_FRAME, xMove);
function xMove(eventObject:Event):void {
  y = nY + nRadiusY * Math.sin(nRadian);
  nRadian += nIncrement;
  nRadian %= 2 * Math.PI;   // 2πの剰余を取ることにより値の範囲を制限
}


※周期的な演算で変数値の範囲を限定する
三角関数の値は、角度が2π(= 360度)の周期で同じように変化します。つまり、角度が0と2πで三角関数の値は同じになります。そこで、上記スクリプト01-03-001では、角度の変数(nRadian)値が際限なく大きくなってしまうことを避けるため、剰余後代入演算子%=により2π(2 * Math.PI)で割った余りを変数に代入し直して、変数値の範囲を0以上2π未満に限定しています。

水平あるいは垂直方向にsinまたはcos値に比例した振動を与え、もうひとつの方向に等速で移動させれば、波の動きになります。いわゆるsinカーブまたはcosカーブのアニメーションです。

以下のスクリプト01-03-002では、前記スクリプト01-03-001に水平方向の等速運動を与えて、インスタンスを波の動きのようにアニメーションさせています。ステージ右端を超えた場合には、条件判定により左端に移動して、アニメーションがスクロールし続ける処理も加えました。

スクリプト01-03-002■インスタンスを波動のようにアニメーションさせる

// フレームアクション
// MovieClip: 波動を描いてアニメーションさせるインスタンス
var nRadian:Number = 0;
var nIncrement:Number = 0.1;
var nRadiusY:Number = 50;
var nY:Number = stage.stageHeight / 2;
var nStageRight:Number = stage.stageWidth;
addEventListener(Event.ENTER_FRAME, xMove);
function xMove(eventObject:Event):void {
  x = nRadian * nRadiusY;
  y = nY + nRadiusY * Math.sin(nRadian);
  if (x > nStageRight) {
    x -= nStageRight;
  }
  nRadian += nIncrement;
  nRadian %= 2 * Math.PI;
}


※sinおよびcosカーブと位相
cosとsinのカーブの形状はまったく同じです。ただ、波の山と谷の位置がずれています(前掲図01-03-001参照)。cosとsinの値が変わるタイミング、グラフでいえば山と谷の位置の違いは「位相」といいます。よって、cosとsinは位相が異なると表現されます。具体的には、角度が0のときsinは0、cosは1から波が始まります。


作成者: 野中文雄
ドラフト作成: 2009年5月12日


Copyright © 2001-2009 Fumio Nonaka.  All rights reserved.