创建向量和冲突

我有一个球和一根棍子(用于台球比赛)。

首先将球放在桌子的位置。 点击球时,棒子会出现,这样我们就可以通过点击球来确定棒的放置角度(点击时我们确定鼠标相对于球心的角度,并将棒放在那个角度接触球)。

所以现在棍子也在桌子上。 现在我只是沿着那个角度拖动棍子,如果拖动的角度不是初始角度,则返回false。

在拖动结束时,我正在计算由杆移动的距离,并且杆返回到接触球的初始位置。 然后我试图相对于棍子的角度和棍子移动的距离移动球。

球在这里移动但不是关于这些中的任何一个。 这已成为我的问题,我在这里更新了小提琴:

strikerGroup.on('dragend', function () { var strikerLastPos = strikerGroup.getAbsolutePosition(); strikerGroup.setPosition(initStrikerGrpX, initStrikerGrpY); striker.speedX = striker.speedY = 2; var strikerGrpDistMoved = Math.sqrt(((strikerLastPos.x - strikerGroup.getAbsolutePosition().x) * (strikerLastPos.x - strikerGroup.getAbsolutePosition().x)) + ((strikerLastPos.y - strikerGroup.getAbsolutePosition().y) * (strikerLastPos.y - strikerGroup.getAbsolutePosition().y))); var newX = striker.getX() + (Math.cos(theta) * strikerGrpDistMoved); var newY = striker.getY() - (Math.sin(theta) * strikerGrpDistMoved); var strikerMove = new Kinetic.Tween({ node: striker, duration: 5, x: newX, y: newY, easing: Kinetic.Easings.EaseInOut }); console.log(striker.getX()); strikerMove.play(); layer.batchDraw(); // strikerGroup striked the striker!!!! }); 

你可以像这样计算台球杆对球的角度:

 var dx = ballX - stickX; var dy = ballY - stickY; var angle = Math.atan2(dy,dx); 

然后你可以像这样沿着这个角度移动球:

 var newBallX = ballX + desiredRollDistance * Math.cos(angle); var newBallY = ballY + desiredRollDistance * Math.sin(angle); 

您所需的滚动距离将取决于杆从球中拉回的距离。

棒被拉得越远==球越往前走。

你可以像这样计算从棍子到球的距离:

 var dx = ballX - stickX; var dy = ballY - stickY; var lengthFromStickToBall = Math.sqrt(dx*dx+dy*dy); 

这是一个演示: http : //jsfiddle.net/m1erickson/B6K9z/