GRAFZ.NET
一言:自分はいったい何がしたいんだろう。その謎が解けるまでとりあえずこのサイトの更新は続く・・・
開発ブログ
flash利用で手動の画質最適化
虫の動きをスクリプトで記述する

軽い気持ちで更新されるブログ
CS3へのアップグレード
JWW外変「Kiefer」公開します。

ダウンロード
JW_WIN外部変形Kiefer
JW_WIN外部変形FastMeasure
管理者からのお知らせ
4/30 サーバーダウンについて
4/16 このサイトを開設しました。

管理者プロフィール (-)
suda
26歳男
神奈川県生まれ
最近の趣味:ジョギング
職業:grafz.netという屋号でwebデザイン+プログラム制作してます。
一言:自分はいったい何がしたいんだろう。その謎が解けるまでとりあえずこのサイトの更新は続く・・・。
コンタクトは以下まで
suda@grafz.net
RSS
ブログをRSS配信してます。

© GRAFZ.NET 2008
5月4日
アニメーションの常套手段:減速して吸着


とにかくいろんな場面で使えてしまう、便利な動き。記述も簡単な上に、そこそこ気持ちの良い動きという理由で頻繁に使用する動き。それがこれ↓
flash player required. Get Adobe Flash player
この動きに名前はあるのでしょうか?ここでは便宜的に「減速して吸着」と呼ぶことにします。ではFlashを使って「減速して吸着」を記述してみましょう。

動きの原理は極めて単純で、あるフレームの位置を以下の式で決めます。
あるフレームにおける位置 = (前フレームの位置) + (スピードの係数) × (目的位置 - 現在位置)
この動きの最も単純な例として、このページ上部にあるFlashのコードを紹介します。使用する言語はActionScript2.0です。

ルートに適当なムービークリップを作成し、mcTestという名前を付けます。そして、そのムービークリップの動きを実装するためのクラスを作成してみます。下記のスクリプトを、Flashドキュメントと同じディレクトリに「MyTestObject.as」というファイル名で記述します。
class MyTestObject{
  var mc:MovieClip;
  var nStart,nTarget,nSpeed:Number;
  function MyTestObject(mcIn:MovieClip){
    this.mc = mcIn;
    this.nStart = 25;
    this.nTarget = 475;
    this.nSpeed = 0.2;

    var owner:Object = this;
    this.mc.onEnterFrame = function(){
      this._x += owner.nSpeed * (owner.nTarget - this._x);
      if(Math.abs(owner.nTarget - this._x) < 0.1){
        this._x = owner.nTarget;
        owner.Reset();
      }
    }
  }
  function Reset(){
    this.mc._x = this.nStart;
  }
}
ではコードを行を追って見ていきましょう。
2行目:コンストラクタでルートから受け取るムービークリップ(の参照)を格納するための変数。このムービークリップをアニメーションさせます。
3行目:クラス内で使用する変数で、それぞれ初期位置、目的位置、アニメーションのスピードです。
4行目:このクラスのコンストラクタ。ルートからムービークリップ(の参照)を受け取って、
5行目:クラスのプロパティに代入します。
6-8行目:初期位置、目的位置、スピードをそれぞれ設定します。
10行目:(後述)
11行目:ムービークリップのonEnterFrameハンドラを使用してアニメーションさせます。
12行目:ここで、ページ冒頭のこの式↓
あるフレームにおける位置 = (前フレームの位置) + (スピードの係数) × (目的位置 - 現在位置)
が出てきます。10行目のownerは、ハンドラの内部からクラスのプロパティ・メソッドにアクセスするために用意しました。
13行目:目的位置に到達したかどうかを判断します。このアニメーションの手法だと、アニメーションが進行するにつれムービークリップの位置は限りなく目的位置に近づくものの、いつまでたってもイコールになることはないので、その差(ムービークリップの位置と目的位置の差)の絶対値が0.1以下になったらアニメーションの完了と見なすことにします。アニメーション完了のタイミングで、
14行目:mcを強制的に目的位置にしてやって、
15行目:ここでは19行目に作成したResetメソッドを実行してアニメーションがループするようにしました。

次に、ルートにおける記述です。いま作成したクラスのインスタンスをここで生成してやります。
var oTest:Object = new MyTest(this.mcTest);
ルートでの記述はこれだけです。パブリッシュしてアニメーションを確認してみて下さい。

僕は普段、「スピードの係数」が0.4~0.5で「速め」、0.1~0.2で「遅め」という具合で指定しています。

ご参考になれば嬉しいです。m( __ __ )m