第16回 三角関数を使った楕円軌道のアニメーション

第16回←教材はこれ!

  • やったー三角関数だ−。
  • アニメーションを水平に振動させるのにcos関数をつかう。*1
  • 振動させるインスタンスに記述するのは以下。

// MovieClip: 振動させるインスタンス
var nRadian:Number = 0;
var nCenterX:Number = stage.stageWidth/2;
var nRadiusX:Number = 100;
addEventListener(Event.ENTER_FRAME, xMoveX);

function xMoveX(eventObject:Event):void {
  x = nCenterX+Math.cos(nRadian)*nRadiusX;
  nRadian += 0.1;
}

  • nRadianが0からスタートして実行される度に0.1ずつ増えていくと。*2
  • 一往復31.4フレームつーことですね。
  • sinを使って垂直に振動させる記述もあった。つーことはもしや!!!

// MovieClip: 振動させるインスタンス
var nRadian:Number = 0;

var nCenterY:Number = stage.stageHeight/2;
var nRadiusY:Number = 100;
addEventListener(Event.ENTER_FRAME, xMoveY);
function xMoveY(eventObject:Event):void {
  y = nCenterY+Math.sin(nRadian)*nRadiusY;

  nRadian += 0.1;
}

  • そして次のページ、やはり水平・垂直移動の合体で円運動!これやりたくなるのは人の性!!!
  • でもよくみたらタイトルにちゃんと「楕円軌道のアニメーション」ってあるよね。

// MovieClip: 振動させるインスタンス
var nRadian:Number = 0;
var nCenterX:Number = stage.stageWidth/2;
var nCenterY:Number = stage.stageHeight/2;

var nRadiusX:Number = 100;
var nRadiusY:Number = 100;
addEventListener(Event.ENTER_FRAME, xMoveX);
addEventListener(Event.ENTER_FRAME, xMoveY);
addEventListener(Event.ENTER_FRAME, xUpdate);
function xMoveX(eventObject:Event):void {
  x = nCenterX+Math.cos(nRadian)*nRadiusX;
}
function xMoveY(eventObject:Event):void {

  y = nCenterY+Math.sin(nRadian)*nRadiusY;
}
function xUpdate(eventObject:Event):void {
  nRadian += 0.1;
}

  • x、yのプロパティそれぞれ別に呼び出して処理してますね。なるほど。
  • そしてこのページではちゃんとラジアンに関する記述もある。さすが野中先生ぬかりなし!*3
  • んでなんと角度(度数)で記述する方法も伝授!

// MovieClip: 振動させるインスタンス
var nDegree:Number = 0;
var nRadian:Number = 0;
var nSpeed:Number = 5;

var nDegreeToRadian:Number = Math.PI/180;
var nCenterX:Number = stage.stageWidth/2;
var nCenterY:Number = stage.stageHeight/2;
var nRadiusX:Number = 100;
var nRadiusY:Number = 50;←楕円にするためにこっちは50
var nCos:Number = Math.cos(nRadian);

var nSin:Number = Math.sin(nRadian);
addEventListener(Event.ENTER_FRAME, xMoveX);
addEventListener(Event.ENTER_FRAME, xMoveY);
addEventListener(Event.ENTER_FRAME, xUpdate);
function xMoveX(eventObject:Event):void {

  x = nCenterX+nCos*nRadiusX;
}
function xMoveY(eventObject:Event):void {

  y = nCenterY+nSin*nRadiusY;
}
function xUpdate(eventObject:Event):void {
  nDegree += nSpeed;
  nDegree = (nDegree%360+360)%360;←角度が負の値でも大丈夫!
  trace(nDegree); // 確認用

  nRadian = nDegree*nDegreeToRadian;
  nCos = Math.cos(nRadian);
  nSin = Math.sin(nRadian);
}

  • でもこれかなり面倒なことやてる気がする。素直にラジアンで処理した方がいいかも。

*1:ちなみにsinの方が最初が0なのになぜcos使うのかな?あとで分かるのか??

*2:ちなみにラジアンって忘れてたんで調べました。180度=πラジアン

*3:1ページ目の最後には単振動にも触れてたし、先生完全に理系男子ですな☆