今回は、FlashでいうEnterFrameのような仕組みを実装し、三角関数を使った円運動に挑戦します。
EnterFrameの実装
Flashでは、EnterFrameイベントというイベントを使って、あらかじめ設定したフレームレートに合わせてアニメーションさせることが出来ました。 それによって、リアルタイムに画面が動くゲームなどを作ることが出来ました。
しかしJavaScriptには、そういった仕組みがありません。 クイズゲーム辺りであれば問題は無いのですが、仮にちょっとしたシューティングゲームを作ったり、アクションゲームなどを作るとなると、フレームを実装できないと難しいです。
そこで、今回は、簡単なアニメーションを実装して、フレームレートでリアルタイムに処理するプログラムを作ってみます。
まずはフレーム処理ですが、下記のソースをご覧ください。
//フレームレートを設定
var FPS = 30;
var EnterFrameID;
$(function()
{
EnterFrameID = setInterval(enterFrameTicker , 1000 / FPS);
});
function enterFrameTicker()
{
//処理を記述。
}
JavaScriptでは、連続して処理する方法は「setInterval」しか存在しません。 そして、「setInterval」は「設定されたミリ秒毎に処理を繰り返す」関数です。
さらに、フレームレートとは、即ち「1秒間に何回描画を書き換えるか」の設定なので、たとえば「setInterval」に100ミリ秒を設定すると、1秒間に10回処理をするということになるので、10FPSとなります。
そうすると、たとえば30FPSにフレームレートを設定する場合、「setInterval」のミリ秒を「1000÷30」ミリ秒に設定すればいいのです。
後は三角関数の実装についてですが、三角関数の解説については数学の先生にお任せするとして、プログラムで三角関数を使う場合、 特にコンテンツ系で使う場合は、円・カーブ・緩急・バウンドなど、物理的な動きを実装するときに使います。
簡単な使い方としては、下記のような記述になります。
//フレームレートを設定
var FPS = 30;
var EnterFrameID;
var rot = 0; //角度
$(function()
{
EnterFrameID = setInterval(enterFrameTicker , 1000 / FPS);
});
function enterFrameTicker()
{
rot += 5;
//ラジアン角
var rad = rot * Math.PI / 180;
var COS = Math.cos(rad);
var SIN = Math.sin(rad);
}
サンプルの上の方で、二つの四角形が左右に動いていますが、上記コードのようにサイン関数・コサイン関数を使うことで、「-1~1」の間でそれっぽい値を取得することが出来ます。
その際に「ラジアン」というものを使うのですが、これも解説してたらきりがないので、そこから先は数学の先生にお任せして、ここでは、ラジアンは「角度×Math.PI÷180」と覚えましょう。
ラジアンを計算するときに使う角度の値を、処理するたびに加算することで、サイン関数・コサイン関数を実行したときの値が変動するのです。
さらに、三角関数のいいところは、1と-1、つまり値の終点に近づくにつれて、値の変更に緩急が付きます。円運動をベースにしてるので当然といえば当然ですが。 これによって、自然界の物理法則に近いようなアニメーションを得られるのです。
また、サンプルを見ても分かるように、サインとコサインは、それぞれで逆の値を得られます。 これで、うまいこと円運動になってくれます。
ちなみにサンプルのアニメーションでは、三角関数の計算で「-1~1」の値に100をかけて、「-100~100」の値にします。 次に、その値を円の中心に加算して、半径100pxの円運動を実現させています。
河野 義貴
インハウスのFlashクリエイターとして勤務後、2010年独立。一年間のフリーランス期間を経て、2011年9月にスウィーツアンドストリーム株式会社を設立。主にFlash・HTML5を駆使した、PC・スマートフォン向けインタラクティブコンテンツを中心に活動中。マイナビクリエイターセミナーの講師としてもおなじみ。