【问题标题】:make an object move directly towards a point and stop when it reaches it使物体直接向一个点移动并在到达该点时停止
【发布时间】:2012-03-21 23:37:50
【问题描述】:

我怎样才能让我的对象在我点击鼠标到达目的地时停止?该代码使对象移向鼠标单击点,但我似乎无法找到如何使其停止,因为它几乎永远不会通过特定的目标点。 :/ 谁知道如何做到这一点?

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;

        }
    }

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

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

    一旦发生这种情况,只需将您的对象移回它应该停止的位置,然后再重新渲染它。


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

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

    【讨论】:

      【解决方案2】:

      试试这个

      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;
                  }
      
              }
          }
      }
      

      【讨论】:

      • 为什么要从弧度到度数再转换回来?
      【解决方案3】:

      类似的问题已经被问过很多次了。

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

      Movement of Objects in a simulation

      【讨论】:

        猜你喜欢
        • 2022-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多