かえる君の数珠繋ぎ (2)

かえる君が数珠繋ぎのように動くもの。 :boy:

youichさん :hakase: から教えてもらったものに、少し手を加えてみた。
AS2.0クラスを使ってみた。


_root に、ムービークリップ(インスタンス名: frog1~frog5) を配置。
frog には、ムービークリップ(インスタンス名: base, shade) を配置。
ムービークリップ・シンボル frog には、ChainSlideクラスを設定。

This movie requires Flash Player 9.0.0

_root 第1フレームに
var frogMax:Number = 5;
var frogWidth:Number = 52;
var limitLeft:Number = 10;
var limitRight:Number = 590;
for (var n:Number = 1; n <= frogMax; n++) {
  var _cs:ChainSlide = this["frog"+n];
  var left_cs:ChainSlide = this["frog"+(n-1)];
  var right_cs:ChainSlide = this["frog"+(n+1)];
  _cs.leftNeighbor = left_cs;
  _cs.rightNeighbor = right_cs;
  _cs.rangeLeft = limitLeft + frogWidth*(n-0.5);
  _cs.rangeRight = limitRight - frogWidth*(frogMax-n+0.5);

}
と記述。

ChainSlide.as
import mx.utils.Delegate;

class ChainSlide extends MovieClip {
  // プロパティ
  private var base:MovieClip;
  private static var frogWidth:Number = 52;
  private var clickPos:Number;
  public var leftNeighbor:ChainSlide;
  public var rightNeighbor:ChainSlide;
  public var rangeLeft:Number;
  public var rangeRight:Number;

  // メソッド
  public function onLoad():Void {
    base.onPress = Delegate.create(this, doPress);
    base.onRelease = Delegate.create(this, doRelease);
    base.onReleaseOutside = base.onRelease;
  }
  private function doPress():Void {
    clickPos = _xmouse;
    onMouseMove = _chainSlide;
  }
  private function doRelease():Void {
    delete onMouseMove;
  }
  private function _chainSlide():Void {
    _x = _root._xmouse - clickPos;
    // 移動範囲の制限
    if (_x < rangeLeft) {
      _x = rangeLeft;
    }
    if (_x > rangeRight) {
      _x = rangeRight;
    }
    if (leftNeighbor) {
      leftNeighbor.chainRight(this)
    }
    if (rightNeighbor) {
      rightNeighbor.chainLeft(this)
    }

    updateAfterEvent();
  }
  // 右側から押される関数
  private function chainRight(rightTarget:ChainSlide):Void {
    if (rightTarget._x - _x < frogWidth) {
      _x = rightTarget._x - frogWidth;
    }
    if (leftNeighbor) {
      leftNeighbor.chainRight(this);
    }

  }
  // 左側から押される関数
  private function chainLeft(leftTarget:ChainSlide):Void {
    if (_x - leftTarget._x < frogWidth) {
      _x = leftTarget._x + frogWidth;
    }
    if (rightNeighbor) {
      rightNeighbor.chainLeft(this);
    }

  }
}

あれれ?プロパティを private にしているのに、アクセスできてるぞMovieClip の拡張だから? なぜ? 😕


[修正] (07/02/21 Wed 22:30)
var _mc:MovieClip = this["frog"+n];
などとしていたため、private にしていたプロパティにアクセスできてしまっていましたが、
var _cs:ChainSlide = this["frog"+n];
に修正したところ、無事、コンパイルエラーが出ました。 🙂

frog を指しているものの型指定を MovieClip から ChainSlide に修正。そして、プロパティ leftNeighbor, rightNeighbor,rangeLeft,rangeRight を public に修正。