From deb4ddeaab3dd1ad582354296035cbcb926b6c1b Mon Sep 17 00:00:00 2001 From: verboomp Date: Tue, 21 Apr 2026 14:29:19 +0200 Subject: [PATCH] pong --- Archive.zip | Bin 108774 -> 136200 bytes thiola-pong/constants.js | 5 ++++- thiola-pong/game.js | 15 ++++++++++----- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/Archive.zip b/Archive.zip index 4f9ca4f9600e72d04dbc84a3423b075efa16cbae..10119ea67c56f1aa97e0eb80a6dc4ff4cfa4b895 100644 GIT binary patch delta 31199 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 delta 3963 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 OIzq%C$om|OqW=TAny(=M diff --git a/thiola-pong/constants.js b/thiola-pong/constants.js index 84564d5..6826d1a 100644 --- a/thiola-pong/constants.js +++ b/thiola-pong/constants.js @@ -2,11 +2,14 @@ const PADDLE_W = 12; const PADDLE_H = 90; const PADDLE_MARGIN = 42; const BALL_R = 7; -const BASE_SPEED = 5; +const BASE_SPEED = 3.5; const WIN_SCORE = 5; const MAX_LEVEL = 3; const WALL_WIDTH = 32; +const PADDLE_SPIN_FACTOR = 0.5; +const BALL_RESUME_DELAY = 800; // ms pause after dismissing a goal message + const LEVEL_COVERAGE = [0, 0, 40, 70]; const LEVEL_CPU_SPEED = [0, 1.6, 3.0, 3.8]; diff --git a/thiola-pong/game.js b/thiola-pong/game.js index 03eb558..cddb6ac 100644 --- a/thiola-pong/game.js +++ b/thiola-pong/game.js @@ -116,7 +116,7 @@ goalFlash.removeEventListener('click', cont); if (playerScore >= WIN_SCORE) { advanceLevel(); } else if (cpuScore >= WIN_SCORE) { showGameOver(); } - else { paused = false; resetBall(isPlayerGoal ? -1 : 1); } + else { resetBall(isPlayerGoal ? -1 : 1); setTimeout(() => { paused = false; }, BALL_RESUME_DELAY); } } setTimeout(() => { @@ -247,17 +247,19 @@ if (e.key === 'w' || e.key === 'W') keyW = false; if (e.key === 's' || e.key === 'S') keyS = false; }); - canvas.addEventListener('mousemove', e => { + document.addEventListener('mousemove', e => { const rect = canvas.getBoundingClientRect(); mouseY = (e.clientY - rect.top) * (H / rect.height); }); - canvas.addEventListener('mouseleave', () => { mouseY = null; }); // ─── Update ─── function update() { if (!running || paused) return; glowPhase += 0.03; + const prevPlayerY = playerY; + const prevCpuY = cpuY; + // Player 1 (left) — PvP: W/S only; CPU mode: mouse OR W/S if (gameMode === 'pvp') { if (keyW) playerY -= 6; @@ -282,6 +284,9 @@ } cpuY = Math.max(0, Math.min(H - PADDLE_H, cpuY)); + const playerVY = playerY - prevPlayerY; + const cpuVY = cpuY - prevCpuY; + // Ball movement ballX += ballVX; ballY += ballVY; if (ballY - BALL_R <= 0) { ballY = BALL_R; ballVY = Math.abs(ballVY); } @@ -292,7 +297,7 @@ if (ballX + BALL_R >= W - PADDLE_MARGIN - PADDLE_W) { if (ballX + BALL_R <= W - PADDLE_MARGIN + PADDLE_W && ballY >= cpuY && ballY <= cpuY + PADDLE_H) { ballVX = -Math.abs(ballVX) * 1.03; - ballVY += ((ballY - cpuY)/PADDLE_H - 0.5) * 3; + ballVY += ((ballY - cpuY)/PADDLE_H - 0.5) * 3 + cpuVY * PADDLE_SPIN_FACTOR; ballX = W - PADDLE_MARGIN - PADDLE_W - BALL_R; spawnParticles(ballX, ballY, '#ff6b35', 8); } else if (ballX > W + BALL_R) { @@ -305,7 +310,7 @@ if (ballX - BALL_R <= PADDLE_MARGIN + PADDLE_W) { if (ballX - BALL_R >= PADDLE_MARGIN - PADDLE_W && ballY >= playerY && ballY <= playerY + PADDLE_H) { ballVX = Math.abs(ballVX) * 1.03; - ballVY += ((ballY - playerY)/PADDLE_H - 0.5) * 3; + ballVY += ((ballY - playerY)/PADDLE_H - 0.5) * 3 + playerVY * PADDLE_SPIN_FACTOR; ballX = PADDLE_MARGIN + PADDLE_W + BALL_R; spawnParticles(ballX, ballY, '#4ecdc4', 8); } else if (ballX - BALL_R <= WALL_WIDTH && coveragePercent > 0) {