サイトトップ

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

モーショングラフィックスで学ぶActionScript − Flash MX −

5.5 スクロールスピードを中央からの距離に比例させる

ID: FB0303003 Page: 144/Line: 2


[p.144「完成したMovieClipの第1フレームアクション」]

// 初期値の設定
nSpeed = 50;
nSencitivity = 0.3;   // スピードの変化を調整する係数(1より小さい値)
nStageLeft = 0;
nStageRight = 320;
nStageCenter = (nStageLeft+nStageRight)/2;
this.onEnterFrame = function() {
  // ステージ中央からの距離に係数を掛け合わせて調整(変化を緩やかに)
  var nNewSpeed = (_root._xmouse-nStageCenter)*nSencitivity;
  if (nNewSpeed<-nSpeed) {
    nNewSpeed = -nSpeed;
  } else if (nNewSpeed>nSpeed) {
    nNewSpeed = nSpeed;
  }
  _x += nNewSpeed;
  if (_x>nStageRight) {
    _x -= (nStageRight-nStageLeft);
  } else if (_x<nStageLeft) {
    _x += (nStageRight-nStageLeft);
  }
};


補足

上記のスクリプトには、理論上問題はありません。しかし、スクロールするメニューなど複数のMovieClipに適用した場合、相互の間隔にわずかに誤差を生じることがあります。MovieClip同士をぴったりと並べて配置したとき、ある程度長い時間操作を行っていると、MovieClipの端が重なったり逆に隙間が空いたりすることがあります。

これは、'_x'プロパティに小数値を設定すると、第3位以下の端数が切捨てられることが原因です。'_x'プロパティに小数値を加算し続けると、その切捨てられた端数の累計に差が生じてきます。処理が長く続き累計値が増えるとと、目に見える誤差にまで拡大するのです。

この誤差の発生を避けるためには、座標値を計算するための変数を別途設ける必要があります(詳しくは、「同じスクリプトで動かしているMovieClipの間隔がばらつく」をご参照ください)。この修正を加えたスクリプトが、以下です。

nSpeed = 50;
nSencitivity = 0.3;
nStageLeft = 0;
nStageRight = 320;
nStageCenter = (nStageLeft+nStageRight)/2;
n_x = this._x;   // x座標を浮動小数値で格納するための変数
this.onEnterFrame = function() {
  var nNewSpeed = (_root._xmouse-nStageCenter)*nSencitivity;
  if (nNewSpeed<-nSpeed) {
    nNewSpeed = -nSpeed;
  } else if (nNewSpeed>nSpeed) {
    nNewSpeed = nSpeed;
  }
  n_x += nNewSpeed;
  if (n_x>nStageRight) {
    n_x -= (nStageRight-nStageLeft);
  } else if (n_x<nStageLeft) {
    n_x += (nStageRight-nStageLeft);
  }
  _x = n_x;   // 処理後の変数値を'_x'プロパティに設定
};

_____

作成者: 野中文雄
作成日: 2003年3月10日


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