ボールが壁に当たるたびに跳ねる角度を変えたいです。
どれだけ壁の真ん中あたりに当たるかで変わる…
現在、サーフェスに当たったときの 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;
}