2011-02-28 3 views
0

클릭하고 누르고있을 때 움직이기를 원하는 Sprite가 있습니다.스프라이트가 MOUSE_UP에서 끌기를 멈추지 않습니다.

public function mouseDownHandler(me:MouseEvent):void 
    { 
     trace(me.target.toString()); 
     trace(me.currentTarget.toString()); 

     this.drawSprite(me.target); 
     this.growByTwo(me.target); 
     me.stopImmediatePropagation(); 

     me.currentTarget.startDrag(me); 
    } 

    public function mouseUpHandler(me:MouseEvent):void 
    { 
     trace(me.target.toString()); 
     trace(me.currentTarget.toString()); 

     me.stopImmediatePropagation(); 
     this.originalSize(me.target); 
     me.currentTarget.stopDrag(); 
    }` 

내 문제는 다음과 같습니다 : 나는 커서를 이동 나는 즉시, 스프라이트를 클릭하면 이벤트를 처리 할 수 ​​

public function layOutEventListeners():void 
    { 

     var addSpriteEventListener:Function = 
     function(spr:Dictionary, index:int, vector:Vector.<Dictionary>) 
     { 
      spr["sprite"].addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
      spr["sprite"].addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
     } 

     gridVec.forEach(addSpriteEventListener); 
    }` 

및 방법 : 나는 스프 라이트에 이벤트 리스너를 추가 할 방법이 , Sprite의 등록 포인트가 커서에 스냅되고 마우스를 놓으면 Sprite가 커서를 따라 멈추지 않습니다. 처음에는 그것이 픽셀 충돌과 관련된 문제라고 생각했습니다. 커서가 MOUSE_UP에 아무 것도 건드리지 않았다고 생각했지만, 실험을 한 후에 커서가 틀린 것으로 판명되었습니다. 나는 또 다른 프로젝트를 시작함으로써 정확히 동일한 이벤트 추가 및 처리 방법을 복제했으며이 문제가 발생하지 않았 음을 알았습니다. 테스트 Sprite는 평소와 같이 끌어서 놓기 만하고 등록 포인트에 스냅하지 않고 클릭 한 포인트만큼 드래그합니다.

필자가 볼 수있는 유일한 차이점은 내 원래 코드의 스프라이트가 스프라이트에 추가되어 그 스프라이트가 스테이지에 추가되는 반면 테스트 프로젝트의 스프 라이트는 루트 DisplayObject에 추가되었습니다. 어떻게 든 이벤트가 컨테이너 Sprite로 전파되고 드래그 앤 드롭하여 다른 Sprite를 삭제하지 않는다고 생각합니다. 이상한 스냅은 커서가 다른 스프라이트 뒤에있는 객체에 스냅 할 수 있습니다. 또 다른 중요한 점은 Sprite를 다른 Sprite 위에 떨어 뜨리면 Sprite가 원하는대로 움직이지 않고 등록 포인트를 따라갑니다.

에 관계없이, 나는 정말 어려움을 겪고 있고, 나는 정말로 끝났어. 어떤 아이디어? MOUSE_UP가 발생했을 때 가끔 마우스가 클립 위에 있지 않기 때문에

답변

1

I ... 하나 때문에 다른 클립 등의 방법으로 점점 아니면 플레이어가 충분히 빨리 무대를 새로 고침하지 않습니다에, 보통 이것이 귀하의 경우인지는 모르겠지만 MOUSE_UP 이벤트를 스테이지에 할당하는 것이 좋습니다. 항상 트리거되므로 항상 안전합니다.

spr["sprite"].addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 
public function mouseDownHandler(me:MouseEvent):void { 
    stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 
public function mouseUpHandler(me:MouseEvent):void { 
    stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 

아래쪽 측면이와 mouseUp에 클립 참조를 잃을 것입니다),하지만 당신은 mouseDown에 손으로 참조를 만들거나 내부적으로 모든 일을 할 수 있지만 모르기 때문에 mouseUp 핸들러에서 리스너를 제거해야합니다 (스프라이트의 코드 내에서).