2012-12-17 97 views
0

我想要创建一个对象,并在鼠标单击时停止。我设法让它在旋转的情况下发生,但问题是,每当我点击空的舞台时,对象就会朝它移动,并继续移动。它不停在鼠标位置。任何人都知道我该怎么做。下面是我的代码:AS3:单击并停止点击鼠标

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

     } 
    } 
} 

回答

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}); 
     } 
    } 
} 
+0

感谢Daniel Messer,但我找到了另一种方式 – Saf