2012-12-17 9 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

관련 문제