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

かえる君が数珠繋ぎのように動くもの。 :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 parentWidth:Number = 52;
var childWidth:Number = 38;
var limitLeft:Number = 10;
var limitRight:Number = 590;
var typeArray:Array = new Array();
typeArray = ["parent", "child", "parent", "parent", "child"];
var totalWidth:Array= new Array();
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;

  var type:String = typeArray[n-1];
  var frogWidth:Number = (type == "parent") ? parentWidth : childWidth;
  _cs.frogWidth = frogWidth;
  totalWidth.push(frogWidth);
}
for (var n:Number = 1; n <= frogMax; n++) {
  var _cs:ChainSlide = this["frog"+n];
  var leftWidth:Number = _cs.leftNeighbor.frogWidth;
  var rightWidth:Number = _cs.rightNeighbor.frogWidth;
  _cs.leftHand = (leftWidth) ? _cs.frogWidth*0.5 + leftWidth*0.5 : 0;
  _cs.rightHand = (rightWidth) ? _cs.frogWidth*0.5 + rightWidth*0.5 : 0;

  var leftSide:Number = 0;
  var rightSide:Number = 0;
  for (var t:Number = 1; t <= n; t++) {
    leftSide += totalWidth[t-1];
  }
  for (var t:Number = n; t <= frogMax; t++) {
    rightSide += totalWidth[t-1];
  }
  _cs.rangeLeft = limitLeft - _cs.frogWidth*0.5 + leftSide;
  _cs.rangeRight = limitRight + _cs.frogWidth*0.5 - rightSide;

}
と記述。

ChainSlide.as
import mx.utils.Delegate;

class ChainSlide extends MovieClip {
  // プロパティ
  private var base:MovieClip;
  public var frogWidth:Number;
  private var clickPos:Number;
  public var leftNeighbor:ChainSlide;
  public var rightNeighbor:ChainSlide;
  public var rangeLeft:Number;
  public var rangeRight:Number;
  public var leftHand:Number;
  public var rightHand: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 < rightHand) {
      _x = rightTarget._x - rightHand;
    }
    if (leftNeighbor) {
      leftNeighbor.chainRight(this);
    }

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

  }
}

ChainSlide.as は、leftHand, rightHand の部分を追加しただけ。 :doki:

フレームアクションのスクリプトが、ごちゃごちゃしてる。 😥 もっとスッキリできないのかぁああ。 :bouzu: