我想让球在每次撞到墙上时改变反弹角度。
它会根据它撞到的墙中间有多近而改变......
现在,我正在硬编码 X 和 Y 撞击表面时的变化......我的目标是从当前 X 和 Y 获取度数,对度数应用更改(现在我正在添加一个随机度数),然后计算 X 和 Y 的新增量值。我知道如何获取 newX 和 newY,但不知道如何获取增量值。
绿色是……的开始……蓝色x
y
是(5,5)
……的下一帧(4,4)
。
- 所以我根据这个计算了度数
45
。 - 然后在度数上添加一个随机数。
- 然后,我想获得新的 x 和 y 坐标。所以我按照这个方法...
currX
(5) - wallX
(0) = distX
(5)
currY
(5) - wallY
(0) = distY
(5)
取我的角度的余弦 + 随机增量,我们会说 55 度,* distX
cos(55 degrees) = .5735
....5735 x distX (5) = 2.86
我的角度的罪孽 * distY
sin(55 degrees) = .8191
....8191 x distY (5) = 4.09
newX = cos result (2.86) + originX (5) = 7.86
newY = sin result (4.09) + originY (5) = 9.09
newX, newY = (7.86, 9.09)
好吧...所以我有我的新坐标...
但这些不等于我的新增量值,x
应该y
基于我的入射角。
代码片段:您可以看到我正在对x,y
增量进行硬编码(dragger.x += 2; )
function tick() {
var rand = Math.floor((Math.random()*10)+1);
console.log("ticking..." + rand);
if (dragger.x >= 400-20) {
dragger.xDir = "right";
}
if (dragger.x < 20) {
dragger.xDir = "left";
}
if (dragger.y >= 150-20) {
dragger.yDir = "up";
}
if (dragger.y < 20) {
dragger.yDir = "down";
}
var oldX = dragger.y;
var oldY = dragger.x;
if (dragger.xDir == "left") {
dragger.x += 2;
}
else {
dragger.x -= 2;
}
if (dragger.yDir == "up") {
dragger.y -= 2;
}
else {
dragger.y += 2;
}
//post update...
var newX = dragger.y;
var newY = dragger.x;
var angle = getAngle(newX, oldX, newY, oldY)
angle+=rand;
$('#getAngle').empty();
$('#getAngle').append("bounce angle (degrees): " + angle);
//console.log(xDir);
// update the stage:
stage.update();
}
function getAngle(x2, x1, y2, y1) {
var deltaX = Math.abs(x2-x1);
var deltaY = Math.abs(y2-y1);
var radians = Math.atan2(deltaX, deltaY);
var degrees = radians * (180/Math.PI);
return degrees;
}