ActionScript 3.0で始めるオブジェクト指向スクリプティング

第24回 インスタンスの管理と配列の並べ替え

この記事を読むのに必要な時間:およそ 7 分

この変更にともなって,EllipticMotionクラスにも大きくふたつ修正を加える必要がある。

まずは,すでに触れたとおり,EllipticMotionクラスのコンストラクタメソッドにおけるDisplayObject.enterFrameイベント(定数Event.ENTER_FRAME)へのリスナー登録を削除することだ。

public class EllipticMotion extends MovieClip {
  // ...[中略]...
  public function EllipticMotion(nDegree:Number, myCenter:Point, myRadius:Point) {
    degree = nDegree;
    center = myCenter;
    radius = myRadius;
    // addEventListener(Event.ENTER_FRAME, rotate);   // 削除
    setRotation();
  }

続いて,EllipticMotionクラスのrotate() メソッドが,引数として回転するスピードを受取るようにしなければならない。メソッドはもはやリスナー関数ではなくなるので,引数にイベントオブジェクトは受取らない。替わりに,フレームアクションから渡される回転角の数値を引数とするのである。そして,受取った数値はクラスのインスタンスプロパティ degreeに設定する。さらに,タイムラインから呼出すには,rotate()メソッドのアクセス制御の属性はpublicで指定する必要がある。

// private function rotate(eventObject:Event):void {
  public function rotate(nSpeed:Number):void {
    // degree += speed;   // プロパティspeedは不要に
    degree += nSpeed;
    setRotation();
  }

以上のふたつの修正を加えたのが,次のスクリプト2である。これでメソッドrotate()はリスナー関数ではなくなり,メインタイムラインから呼出せるようになった。なお,インスタンスプロパティとして宣言されていたフレーム当たりの回転角speedは,もはや不要なので削除した。

スクリプト2 メソッドをタイムラインから呼出すように修正

// ActionScript 3.0クラス定義ファイル: EllipticMotion.as
// 回転するMovieClipシンボルの[クラス]に設定
package {
  import flash.display.MovieClip;
  import flash.events.Event;
  import flash.filters.BlurFilter;
  import flash.geom.Point;
  public class EllipticMotion extends MovieClip {
    private var _degree:Number = 0;
    private const DEGREE_TO_RADIAN:Number = Math.PI / 180;
    private var center:Point;
    private var radius:Point;
    private var cos:Number = Math.cos(degree * DEGREE_TO_RADIAN);
    private var sin:Number = Math.sin(degree * DEGREE_TO_RADIAN);
    public function EllipticMotion(nDegree:Number, myCenter:Point, myRadius:Point) {
      degree = nDegree;
      center = myCenter;
      radius = myRadius;
      setRotation();
    }
    private function get degree():Number {
      return _degree;
    }
    private function set degree(nDegree:Number):void {
      _degree = (nDegree % 360 + 360) % 360;
      var radian:Number = _degree * DEGREE_TO_RADIAN;
      cos = Math.cos(radian);
      sin = Math.sin(radian);
    }
    public function rotate(nSpeed:Number):void {
      degree += nSpeed;
      setRotation();
    }
    function setRotation():void {
      moveX();
      moveY();
      scale();
      blur();
    }
    private function moveX():void {
      x = center.x + cos * radius.x;
    }
    private function moveY():void {
      y = center.y + sin * radius.y;
    }
    private function scale():void {
      scaleX = scaleY = getIndexZ(0.8, 1);
      scaleX *= getIndexZ();
    }
    private function blur():void {
      var nBlur:Number = getIndexZ(4, 0);
      var myBlur:BlurFilter = new BlurFilter(nBlur, nBlur/2);
      filters = [myBlur];
    }
    private function getIndexZ(nMin:Number=-1, nMax:Number=1):Number {
      var nIndexZ:Number = (nMax - nMin) * (sin + 1) / 2 + nMin;
      return nIndexZ;
    }
  }
}

[ムービープレビュー]を試すと,マウスポインタのステージ中央からの水平位置によって,インスタンスの回転する方向と速さが変わる図3⁠。

図3 マウスポインタのステージ中央からの水平位置により回転の方向とスピードが変わる

図32 マウスポインタのステージ中央からの水平位置により回転の方向とスピードが変わる

著者プロフィール

野中文雄(のなかふみお)

ソフトウェアトレーナー,テクニカルライター,オーサリングエンジニア。上智大学法学部卒,慶応義塾大学大学院経営管理研究科修士課程修了(MBA)。独立系パソコン販売会社で,総務・人事,企画,外資系企業担当営業などに携わる。その後,マルチメディアコンテンツ制作会社に転職。ソフトウェアトレーニング,コンテンツ制作などの業務を担当する。2001年11月に独立。Web制作者に向けた情報発信プロジェクトF-siteにも参加する。株式会社ロクナナ取締役(非常勤)。

URLhttp://www.FumioNonaka.com/

著書