2016-11-07 1 views
1

Основные функциональные возможности я буду за это ...EaselJS: добавить ребенка с MouseDown вызвало

Tap (mousedown) на сцене, чтобы создать и добавить ребенка в этом месте.

* EDIT: Я также пытаюсь решить проблему мультитач, поэтому одновременно можно создавать несколько шаров.

Когда вы удерживаете нажатой клавишу, вы можете перетаскивать (перемещать) этого ребенка вокруг и расти (используя regX/regY/scaleX/scaleY) до тех пор, пока вы не отпустите (pressup), и в этот момент он падает (используя цикл тикания).

У меня все работает, но я попал в зацепку, в которой я не могу добавить ребенка и немедленно зарегистрировать mousedown, не отпуская и не нажимая снова.

Есть ли способ ручного запуска mousedown после добавления или какого-либо другого обхода, который имеет больше смысла? dispatchEvent, похоже, не работает.

Вот мои события этапа слушатель и сенсорные биты:

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

А вот мои функции. В игровой зал входит displayObject прослушивателей событий, граничащих с отчаянием, но единственный способ, которым я смог заставить пресс-мастерскую и нажатие работать, - это снова нажать на тот же снежок. 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 события, а затем запоминает его pressmove и pressup событий.

Это означает, что вы не можете действительно подделывать событие, заставляя события мыши. Отправка события мыши от цели не приведет к трюку.

Вместо этого рассмотрите только то, как вручную обрабатывать начальное перетаскивание. Вы уже знаете, что вы хотите, чтобы быть мишенью pressmove, так что вы можете слушать для stagemousemove события, и справиться с ней самостоятельно:

// 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 

Вот краткий пример использования кода в базе: http://jsfiddle.net/3qhmur82/

Я также добавил некоторые комментарии в демо, которые могут быть полезны.

Надеюсь, что это поможет!

+0

Удивительное спасибо! Кажется, что это хорошо работает для одного, но я пытаюсь решить проблему multi-touch (у меня было похожее решение, которое просто пошло и нашло всех «шариковых» детей и выпустило их на «stagemouseup»). Тем не менее, некоторые действительно отличные сведения о том, на чем я вращаю колеса. Еще раз спасибо! – Shoany

Смежные вопросы