0

マウスクリックで追従停止するオブジェクトを作りたいです。私は回転でそれを実現することができましたが、問題は、空のステージをクリックするたびに、オブジェクトがそのステージに向かって移動し、移動し続けることです。マウスの位置で停止しません。誰でも私がそれを行う方法を知っています。以下は私のコードです:

package 
{
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.MouseEvent;

    public class Guest extends MovieClip
    {
        var walkSpeed:Number = 5;

        public function Guest()
        {
            stage.addEventListener(MouseEvent.CLICK, walk);
        }

        function walk(event:MouseEvent):void
        {
            var dx = parent.mouseX - x;
            var dy = parent.mouseY - y;
            var angle = Math.atan2(dy,dx) / Math.PI * 180;
            rotation = angle;

            stage.addEventListener(Event.ENTER_FRAME, loop);
        }

        function loop(event:Event):void
        {
            x = x+Math.cos(rotation/180*Math.PI)*walkSpeed;
            y = y+Math.sin(rotation/180*Math.PI)*walkSpeed;
            stage.removeEventListener(Event.ENTER_FRAME, loop);

        }
    }
}
4

1 に答える 1

0

あなたのコードは少し奇妙です。ここでは、ループが完了するとすぐにイベントリスナーを削除するため、複数のフレームの位置に向かって移動することはありません.

移動してから停止する問題を修正するコードを次に示します。ただし、ある種の「トゥイーン ライブラリ」を使用してこれを行うことを強くお勧めします。この後、Caurina Transitionsを使用してそれを行う例を示します。

function walk(e:MouseEvent):void {
    targetX = parent.mouseX; //targetX created as a member variable
    targetY = parent.mouseY; //targetY created as a member variable
    var dx = parent.mouseX - x;
    var dy = parent.mouseY - y;
    var angle = Math.atan2(dy,dx) / Math.PI * 180;
    rotation = angle;

    stage.addEventListener(Event.ENTER_FRAME, loop);
}

function loop(e:Event):void {
    var newX:Number = x + Math.cos(rotation / 180 * Math.PI) * walkSpeed;
    var newY:Number = y + Math.sin(rotation / 180 * Math.PI) * walkSpeed;

    var atTarget:Boolean = true;
    if (Math.abs(targetX - newX) > walkSpeed) {
        x = newX;
        atTarget = false;
    }
    if(Math.abs(targetY - y) > walkSpeed) {
        y = newY;
        atTarget = false;
    }

    if (atTarget) {
        stage.removeEventListener(Event.ENTER_FRAME, loop);
    }
}

これは caurina と同じ動作です。

package
{
    import caurina.transitions.Tweener;
    import flash.display.MovieClip;
    import flash.events.MouseEvent;

    public class TransitionExample extends MovieClip
    {
        private var targetX:Number;
        private var targetY:Number;
        var walkSpeed:Number = 5;

        public function TransitionExample()
        {
            trace("ctor()");
            stage.addEventListener(MouseEvent.CLICK, walk);
        }

        private function walk(e:MouseEvent):void {
            targetX = parent.mouseX;
            targetY = parent.mouseY;

            var dx = targetX - x;
            var dy = targetY - y;
            var angle = Math.atan2(dy,dx) / Math.PI * 180;
            rotation = angle;

            var tweenDone:Function = function():void {
                trace("tween is finished");
            }
            //modify time to be dependant on the "walkspeed" and the distance travelled etc...
            Tweener.addTween(this, { x:targetX, y:targetY, time:0.458, transition:"linear", onComplete:tweenDone});
        }
    }
}
于 2012-12-17T13:02:00.410 に答える