使一个物体直接朝向一个点移动并在它到达时停止

时间:2012-03-03 23:16:38

标签: actionscript-3

当我的物体到达目的地时,如何让我的物体停止点击鼠标?代码使对象移动到鼠标单击点,但我似乎无法找到如何使其停止,因为它几乎不会通过特定的目标点。 :/有谁知道如何实现这个目标?

public function onMouseDown(evt:MouseEvent)
    {
        if (this._character != null)
        {
            _character.isMoving = false;
            _character.dx = 0;
            _character.dy = 0;
            targetX = mouseX - _character.x;
            targetY = mouseY - _character.y;
            var angle:Number = Math.atan2(targetY,targetX);
            var dx:Number = Math.cos(angle) * _character.speed;
            var dy:Number = Math.sin(angle) * _character.speed;
            _character.dx = dx;
            _character.dy = dy;
            _character.isMoving = true;
        }

    }
    public function updateCharacter(e:Event):void
    {
        if (this._character.isMoving)
        {
            this._character.x +=  this._character.dx;
            this._character.y +=  this._character.dy;

        }
    }

3 个答案:

答案 0 :(得分:2)

最简单的方法是计算每次移动时想要停止的点的角度。如果您沿着直线移动直到您通过您想要停止的点,此值将保持不变,此时该值将保持不变。此时它将发生巨大变化。

一旦发生这种情况,只需将对象移回到应该再次渲染之前应停止的位置。


我已经为您创建了一个包含源代码的演示。有相当数量的代码,所以不是在这里发布所有内容,而是可以下载源代码:

http://martywallace.com/testing/gotoPoint.zip

答案 1 :(得分:1)

有很多次问过类似的问题。

但是,请参阅我的答案中的代码,该代码应解释如何移动和停止。

Movement of Objects in a simulation

答案 2 :(得分:1)

试试这个

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

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

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

        function walk(event:MouseEvent):void
        {
            oldPosX = parent.mouseX;
            oldPosY = parent.mouseY;
            rotation = Math.atan2(oldPosY - y,oldPosX - x) / Math.PI * 180;
            addEventListener(Event.ENTER_FRAME, loop);
        }

        function loop(event:Event):void
        {
            // see if you're near the target
            var dx:Number = oldPosX - x;
            var dy:Number = oldPosY - y;
            var distance:Number = Math.sqrt((dx*dx)+(dy*dy));
            if (distance<walkSpeed)
            {
                // if you are near the target, snap to it
                x = oldPosX;
                y = oldPosY;
                removeEventListener(Event.ENTER_FRAME, loop);
            }
            else
            {
                x = x+Math.cos(rotation/180*Math.PI)*walkSpeed;
                y = y+Math.sin(rotation/180*Math.PI)*walkSpeed;
            }

        }
    }
}