2016-11-07 27 views
1

基本功能我要为是...EaselJS:添加子与鼠标按下舞台上的触发

点击(mousedown)创建,并在该位置添加一个孩子。

*编辑:我也试图解决多点触控,所以可以在同一时间创建多个球。

当您按住时,您可以拖动(移动)该孩子并使其增长(使用regX/regY/scaleX/scaleY),直到您释放(pressup),此时它会下降(使用打勾周期)。

我有一切工作,但我碰到了一个障碍,其中我不能添加一个孩子,并立即注册mousedown没有释放,并再次按下。

添加后有没有办法手动触发mousedown,或者更有意义的其他解决方法? dispatchEvent似乎没有工作。

这里是我的舞台事件侦听器和触摸位:

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

这里是我的功能。在spawnsnowball包括displayObject事件监听器在急切的接近,但唯一的办法,我已经能够得到pressmove和新闻的工作是再次点击相同的雪球。 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事件,自己处理:

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

真棒谢谢你!它似乎适用于单独一个,但我试图解决多点触摸(我有一个类似的解决方案,只是去找到所有“balltype”的孩子,并在'stagemouseup'上发布它们)。 这就是说,一些真正伟大的见解,我在什么车轮上。再次感谢你! – Shoany