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);
}
と記述。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);
}
}
}
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);
}
}
}
[修正] (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 に修正。