2016-11-07 2 views
1

내가 갈거야 기본 기능은 ...EaselJS : mousedown과 아이를 추가 생성하고 해당 위치에 아이를 추가하기 위해 무대에

탭 (mousedown)을 트리거.

* 편집 : 나는 또한 멀티 터치를 위해 노력하고 있으므로 여러 개의 볼을 동시에 만들 수 있습니다.

계속 누르고 있으면 그 어린이를 끌어서 이동할 수 있고 (pressup) 해제 할 때까지 (regx/regY/scaleX/scaleY를 사용하여) 성장합니다 (눈금주기를 ​​사용하여).

나는 모든 종류의 작업을하고 있지만, 나는 아이를 추가 할 수 없어 즉시 해제하고 다시 누르지 않고 mousedown을 등록해야합니다.

추가 후 mousedown을 수동으로 트리거하는 방법이 있습니까? 아니면 다른 해결 방법이 더 적합합니까? dispatchEvent이 작동하지 않는 것 같습니다.

여기 내 무대 이벤트 리스너 터치 비트입니다 :

  stage.enableMouseOver(10); 
      createjs.Touch.enable(stage, false, false); 
      stage.preventSelection = false; 
      stage.addEventListener("stagemousedown", spawnsnowball); 

그리고 여기 내 기능입니다. spawnsnowball에는 절망적 인 이벤트 청취자 인 displayObject이 포함되어 있지만 pressmove 및 pressup 작업을 수행 할 수있는 유일한 방법은 동일한 스노볼을 다시 클릭하는 것입니다. releasesnowball 지금은 방금 'stagemouseup' 청취자를 사용하여 모든 인스턴스를 해제하지만, pressup의 방아쇠를 당길 수 있다면 이벤트 목표를 대상으로하도록 다시 작성하겠습니다.

 function spawnsnowball(evt){ 
      var ball = new createjs.Bitmap(loader.getResult("snowball")); 
      ball.crossOrigin="Anonymous"; 
      ball.name="ball"; 
      ball.scaleX = 0.5; 
      ball.scaleY = ball.scaleX; 
      ball.regX = ball.image.width/2; 
      ball.regY = ball.image.height/2; 
      ball.x = evt.stageX; 
      ball.y = evt.stageY; 

      ball.type = balltype; 

      ball.holding = 1; 
      ball.velX = 0; 
      ball.velY = 0; 
      ball.addEventListener("pressup",releasesnowball); 
      ball.addEventListener("pressmove",dragsnowball); 
      ball.onPress = function(mouseEvent) {}; 
      stage.addChild(ball); 
      ball.dispatchEvent("mousedown"); 
      ball.dispatchEvent("pressdown"); 

     } 

     function dragsnowball(evt){ 
      evt.target.x = evt.stageX; 
      evt.target.y = evt.stageY; 
     } 

     function releasesnowball(evt){ 
      for(var i=0;i<stage.getNumChildren();i++){ 
       var shape = stage.getChildAt(i); 
       if(shape.type == balltype){ 
        if(shape.holding){ 
         shape.holding = 0; 
         var dX = shape.x - shape.oldX; 
         var dY = shape.y - shape.oldY; 
         if(Math.abs(dY)>8) 
          dY = 8*dY/Math.abs(dY); 
         if(Math.abs(dX)>3) 
          dX = 3*dX/Math.abs(dX); 

        } 
       } 
      } 
     } 

답변

0

pressmove 이벤트는 기본적으로 마지막 mousedown 이벤트의 대상을 저장하기 때문에 특별하고 pressmovepressup 이벤트를 기억합니다.

이것은 마우스 이벤트를 강요하여 실제로 위장 할 수 없음을 의미합니다. 대상에서 마우스 이벤트를 보내면 트릭을 수행 할 수 없습니다.

대신 초기 드래그를 수동으로 처리하는 것을 고려하십시오. 당신은 이미 당신이 pressmove의 대상이 원하는 것을 알고, 그래서 당신은 stagemousemove 이벤트를 수신 할 수 있으며 직접 처리 : http://jsfiddle.net/3qhmur82/

: 여기
// Listen to the stagemousemove and manually call the event. 
    var initialDrag = stage.on("stagemousemove", function(event) { 
    event.target = ball; // Re-target the event so your other method works fine. 
    dragsnowball(event); 
    }); 

// When done, remove the move listener. 
// The off() method supports a "once" parameter so you don't have to unsubscribe that listener. 
    stage.on("stagemouseup", function(event) { 
    stage.off("stagemousemove", initialDrag); 
    }, null, true); // Fires one time 

베이스로 코드를 사용하여 빠른 샘플입니다

데모에 유용한 몇 가지 의견도 추가되었습니다.

희망 하시겠습니까?

+0

감사합니다. 하나의 시스템에서 잘 작동하는 것처럼 보이지만 멀티 터치 (multi-touch)를 해결하기 위해 노력하고 있습니다 (유사한 솔루션을 사용하여 모든 "balltype"어린이를 찾아서 'stagemouseup'에 모두 발표했습니다). 그건, 내가 바퀴를 돌리고있는 것에 대한 정말 멋진 통찰력이다. 다시 감사합니다! – Shoany