我有一个球和一根棍子(用于台球比赛)。
首先将球放在桌子的位置。在点击球时,棒会出现,这样我们就可以通过点击球来确定棒的放置角度(点击时我们确定鼠标相对于球心的角度,并将棒放在那个角度接触球)。
所以现在棍子也在桌子上。现在我只是沿着那个角度拖动棍子,如果拖动的角度不是初始角度,则返回false。
在拖动结束时,我正在计算由杆移动的距离,并且杆返回到接触球的初始位置。然后我试图相对于棍子的角度和棍子移动的距离移动球。
球在这里移动,但不是相对于其中任何一个。这已经成为我的问题,我已经更新了小提琴here:
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!!!!
});
答案 0 :(得分:3)
你可以像这样计算台球杆与球的角度:
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);