Skip to content

Commit 8768121

Browse files
authored
更新 index.html
1 parent 657314d commit 8768121

File tree

1 file changed

+45
-5
lines changed

1 file changed

+45
-5
lines changed

31-Air-Hockey-Game/index.html

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,36 @@ <h5 id="message"></h5>
220220
}
221221
}
222222

223+
function calculateCollision(sx, sy, px, py, qx, qy, r, R) {
224+
// 计算小球到大球的单位法向量
225+
const dx = px - qx;
226+
const dy = py - qy;
227+
const distance = Math.sqrt(dx * dx + dy * dy);
228+
229+
// 单位法向量
230+
const nx = dx / distance;
231+
const ny = dy / distance;
232+
233+
// 计算小球在法向量方向的速度分量(投影)
234+
const vDotN = sx * nx + sy * ny;
235+
236+
// 计算法向量方向的反射速度分量
237+
const reflectedVx = sx - 2 * vDotN * nx;
238+
const reflectedVy = sy - 2 * vDotN * ny;
239+
240+
return { reflectedVx, reflectedVy };
241+
}
242+
243+
function hasCollided(px, py, qx, qy, r, R) {
244+
// 计算两个球中心的距离
245+
const dx = px - qx;
246+
const dy = py - qy;
247+
const distance = Math.sqrt(dx * dx + dy * dy);
248+
249+
// 检查是否碰撞
250+
return distance <= r + R;
251+
}
252+
223253
// Update game state
224254
function update() {
225255
// Move paddles
@@ -260,23 +290,33 @@ <h5 id="message"></h5>
260290
}
261291

262292
// Check if ball collides with left paddle
263-
if (
293+
/*if (
264294
ballX - ballRadius < paddleWidth &&
265295
ballY > leftPaddleY &&
266296
ballY < leftPaddleY + paddleHeight
267297
) {
268298
ballSpeedX = -ballSpeedX;
269-
}
299+
}*/
300+
301+
if(hasCollided(ballX, ballY, leftPaddleX, leftPaddleY, ballRadius, paddleHeight/2)){
302+
var ballMove = calculateCollision(ballSpeedX,ballSpeedY, ballX, ballY, leftPaddleX, leftPaddleY, ballRadius, paddleHeight/2);
303+
ballSpeedX = ballMove.reflectedVx;
304+
ballSpeedY = ballMove.reflectedVy;
305+
}
270306

271307
// Check if ball collides with right paddle
272-
if (
308+
/*if (
273309
ballX + ballRadius > canvas.width - paddleWidth &&
274310
ballY > rightPaddleY &&
275311
ballY < rightPaddleY + paddleHeight
276312
) {
277313
ballSpeedX = -ballSpeedX;
278-
}
279-
314+
}*/
315+
if(hasCollided(ballX, ballY, rightPaddleX, rightPaddleY, ballRadius, paddleHeight/2)){
316+
var ballMove = calculateCollision(ballSpeedX,ballSpeedY, ballX, ballY, rightPaddleX,rightPaddleY, ballRadius, paddleHeight/2);
317+
ballSpeedX = ballMove.reflectedVx;
318+
ballSpeedY = ballMove.reflectedVy;
319+
}
280320
// Check if ball goes out of bounds on left or right side of canvas
281321
if (ballY > canvas.height / 2 - paddleHeight && ballY < canvas.height / 2 + paddleHeight) {
282322
if (ballX < effectiveBounds) {

0 commit comments

Comments
 (0)