Flash AS3 減速運動の不具合の回避方法を教えて下さい
大重美幸様のAS3.0入門ノートを使って勉強しているものです。
今回その中の「EaseingSimpleクラス」を拡張して、
任意のボタンを押すと、予めそのボタンに引数として登録しておいたステージ上のX座標、Y座標にインスタンスが減速しながら移動するクラスを作ってみました。
そこで問題発生なのですが、
ステージにボタンを二つ以上設置(仮にAとBとします)して、
「Aのボタン」をマウスダウンしてインスタンス(IdoObjとします)の移動開始して、それが指定の座標に到達する前(移動中)に「Bのボタン」を押すと意図しない座標にインスタンスが止まってしまいます。
確実に、インスタンスが静止して、次のボタンを押せば問題は起きないのですが、移動先をすぐに変更させる動きを付けるにどうしたらよいのでしょうか?
よろしくお願いいたします。
タイムラインのフレームアクション
idoObj→移動するインスタンス
btA→ボタンA
100,100→btAが渡すX座標,btAが渡すY座標
btB→ボタンB
200,200→btBが渡すX座標,btBが渡すY座標
**********************************************************
var btObj:idoStage=new idoStage(idoObj,btA,100,100);
var btObj2:idoStage=new idoStage(idoObj,btB,200,200);
**********************************************************
今回作製したidoStageクラス(下記のEaseingSimpleクラスを拡張)
**********************************************************
package{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import EaseingSimple;
public class idoStage extends EaseingSimple{
var my_mc2:MovieClip;//任意のボタン
var zahyoX:Number;//x座標
var zahyoY:Number;//y座標
//コンストラクタ
function idoStage(mc:MovieClip,mc2:MovieClip,stgX:Number,stgY:Number){
super(mc);
my_mc2=mc2;
zahyoX=stgX;
zahyoY=stgY;
my_mc2.addEventListener(MouseEvent.MOUSE_OUT,onOUT);
my_mc2.addEventListener(MouseEvent.MOUSE_OVER,onOVER); my_mc2.addEventListener(MouseEvent.CLICK,onCLICK);
}
public function onOUT(event:MouseEvent):void{
my_mc.stop();
my_mc2.buttonMode=false;
my_mc2.alpha=1;
}
public function onOVER(event:MouseEvent):void{
my_mc2.buttonMode=true;
my_mc2.alpha=0.5;
}
//引数で受け取った座標を「EaseingSimpleクラスのeaseTo」に渡してイーズする
public function onCLICK(event:MouseEvent):void{
easeTo(zahyoX,zahyoY);
my_mc2.buttonMode=true;
my_mc2.alpha=0.3;
}
}
}
**********************************************************
EaseingSimpleクラス
(ステージをクリックするとその位置にインスタンスが減速しながら移動します。)
**********************************************************
package {
import flash.display.MovieClip;
import flash.geom.Point;
import flash.events.Event;
public class EaseingSimple {
var my_mc:MovieClip;
var endPoint:Point;
//コンストラクタ
function EaseingSimple(mc:MovieClip) {
my_mc = mc;
}
//イーズ開始
public function easeTo(end_x:Number, end_y:Number):void {
endPoint = new Point(end_x, end_y);
my_mc.addEventListener(Event.ENTER_FRAME, easeStep);
}
//繰り返しステップ
private function easeStep(event:Event):void {
var mcPoint:Point = new Point(my_mc.x, my_mc.y);
//2点間の距離
var distance:Number = Point.distance(mcPoint, endPoint);
if (distance>1) {
var tmpPoint:Point = getTmpPoint();
my_mc.x = tmpPoint.x;
my_mc.y = tmpPoint.y;
} else {
my_mc.x = endPoint.x;
my_mc.y = endPoint.y;
my_mc.removeEventListener(Event.ENTER_FRAME, easeStep);
}
}
//座標計算
private function getTmpPoint():Point {
var tmpX:Number = my_mc.x + (endPoint.x - my_mc.x) * 0.3;
var tmpY:Number = my_mc.y + (endPoint.y - my_mc.y) * 0.3;
var tmpPoint:Point = new Point(tmpX,tmpY);
return tmpPoint;
}
//イーズ中断
public function stop():void {
my_mc.removeEventListener(Event.ENTER_FRAME, easeStep);
}
}
}
**********************************************************
製作環境 FlashCS3
お礼
お礼を書いたつもりでいました。送れてしまいスミマセン。 教えて頂いた通り、イベント内に格納する事でうまくいきました! ありがとうございます! 他の質問もしてますので、お時間があれば見てやってください。