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

第23回 クラスのデザインとループ処理

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

get/setアクセサメソッドで関連する値も更新する

ところで,メソッドupdate()はsetRotation()の中から呼出してもよくはないだろうか。それでも,特に不都合は起こらない。しかし,理屈としてupdate()メソッドの処理は,いつ行うのがよいか考えてみよう。

メソッドが具体的にやっているのは,角度の値にともなう計算だ。そうだとすれば,角度を変えたときに行うのが一番よい。そこで, EllipticMotionクラスの第3の修正として,角度の取得・設定をget/setアクセサメソッドとし,update()はsetアクセサメソッドに書替えてしまうことにする。

public class EllipticMotion extends MovieClip {
  // private var degree:Number = 0;
  private var _degree:Number = 0;   // プロパティ名変更
  // ...[中略]...
  private function get degree():Number {   // 追加定義
    return _degree;
  }
  // private function update():void {   // setアクセサメソッドに変更
  private function set degree(nDegree:Number):void {
    // degree = (degree%360+360)%360;
    _degree = (nDegree%360+360)%360;
    // var radian:Number=degree*DEGREE_TO_RADIAN;
    var radian:Number = _degree * DEGREE_TO_RADIAN;
    cos = Math.cos(radian);
    sin = Math.sin(radian);
  }

get/setアクセサメソッドを定義したので,メソッドupdate()の呼出しはコンストラクタおよびrotate()メソッドから削除する。

public function EllipticMotion(nDegree:Number, myCenter:Point, myRadius:Point) {
  degree = nDegree;
  center = myCenter;
  radius = myRadius;
  addEventListener(Event.ENTER_FRAME, rotate);
  // update();
  setRotation();
}
private function rotate(eventObject:Event):void {
  degree += speed;
  // update();
  setRotation();
}

これで,角度が変更されると同時に,角度に関わる演算が必ず処理されるようになった。今回のEllipticMotionクラスの修正はここまでだスクリプト2⁠。インスタンスのアニメーションについては,とくに変わりはない。インスタンスの重ね順が気になるのは,次回に対処する図5⁠。

スクリプト2 角度をget/setアクセサメソッドで定義

// 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 var speed:Number = 5;
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;
  addEventListener(Event.ENTER_FRAME, rotate);
  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);
}
private function rotate(eventObject:Event):void {
  degree += speed;
  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;
}
  }
}

図5 インスタンスの重ね順が管理されていない

図5 インスタンスの重ね順が管理されていない

著者プロフィール

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

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

URLhttp://www.FumioNonaka.com/

著書