-
Notifications
You must be signed in to change notification settings - Fork 0
/
pong.js
154 lines (135 loc) · 3.78 KB
/
pong.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// pong.js
// Game Variables
let canvas = document.getElementById('gameCanvas');
let ctx = canvas.getContext('2d');
let ballX = 50;
let ballSpeedX = 15;
let ballY = 50;
let ballSpeedY = 6;
let paddle1Y = 250;
let paddle2Y = 250;
const PADDLE_HEIGHT = 100;
const PADDLE_THICKNESS = 10;
let playerScore = 0;
let aiScore = 0;
let intervalId;
let gameSpeed = 1; // Game speed variable
// Beep sound
let beepSound = new Audio('beep.mp3');
// Calculate Mouse Position
function calculateMousePos(evt) {
let rect = canvas.getBoundingClientRect();
let root = document.documentElement;
let mouseX = evt.clientX - rect.left - root.scrollLeft;
let mouseY = evt.clientY - rect.top - root.scrollTop;
return {
x: mouseX,
y: mouseY
};
}
// Paddle Movement
canvas.addEventListener('mousemove', function(evt) {
let mousePos = calculateMousePos(evt);
paddle1Y = mousePos.y - (PADDLE_HEIGHT / 2);
});
// Dark Mode Toggle
document.getElementById('darkModeToggle').addEventListener('click', function() {
document.body.classList.toggle('dark-mode');
});
// Speed Changer
document.getElementById('speedChanger').addEventListener('change', function() {
gameSpeed = parseFloat(this.value);
});
// Draw Everything
function drawEverything() {
// Blank Screen
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, canvas.width, canvas.height);
// Left Paddle
ctx.fillStyle = 'white';
ctx.fillRect(0, paddle1Y, PADDLE_THICKNESS, PADDLE_HEIGHT);
// Right Paddle
ctx.fillStyle = 'white';
ctx.fillRect(canvas.width - PADDLE_THICKNESS, paddle2Y, PADDLE_THICKNESS, PADDLE_HEIGHT);
// Ball
ctx.fillStyle = 'white';
ctx.beginPath();
ctx.arc(ballX, ballY, 10, 0, Math.PI * 2, true);
ctx.fill();
// Draw Scores
ctx.font = '30px Arial';
ctx.fillText(playerScore, 100, 50);
ctx.fillText(aiScore, canvas.width - 100, 50);
}
// Move Everything
function moveEverything() {
ballX += ballSpeedX * gameSpeed;
ballY += ballSpeedY * gameSpeed;
// AI Movement
var deltaY = ballY - (paddle2Y + PADDLE_HEIGHT/2);
if (deltaY > 0) {
paddle2Y += Math.min(4, deltaY) * gameSpeed;
} else {
paddle2Y -= Math.min(4, -deltaY) * gameSpeed;
}
if (ballX < 0) {
if (ballY > paddle1Y && ballY < paddle1Y + PADDLE_HEIGHT) {
ballSpeedX = -ballSpeedX;
beepSound.play(); // Play beep sound
} else {
aiScore++; // AI scores a point
ballReset();
}
}
if (ballX > canvas.width) {
if (ballY > paddle2Y && ballY < paddle2Y + PADDLE_HEIGHT) {
ballSpeedX = -ballSpeedX;
beepSound.play(); // Play beep sound
} else {
playerScore++; // Player scores a point
ballReset();
}
}
if (ballY < 0) {
ballSpeedY = -ballSpeedY;
}
if (ballY > canvas.height) {
ballSpeedY = -ballSpeedY;
}
}
// Ball Reset
function ballReset() {
ballSpeedX = -ballSpeedX;
ballX = canvas.width / 2;
ballY = canvas.height / 2;
}
// Game Loop
function gameLoop() {
drawEverything();
moveEverything();
}
// Start Game
function startGame() {
gameSpeed = parseFloat(document.getElementById('speedChanger').value);
canvas.width = 800;
canvas.height = 600;
intervalId = setInterval(gameLoop, 1000 / 60); // Update 60 times per second
}
// Reset Game
function resetGame() {
clearInterval(intervalId);
ballX = 50;
ballY = 50;
paddle1Y = 250;
paddle2Y = 250;
playerScore = 0;
aiScore = 0;
document.getElementById('startMenu').style.display = 'flex';
document.getElementById('gameCanvas').style.display = 'none';
}
// Keydown Event
window.addEventListener('keydown', function(evt) {
if (evt.key === 'Escape') {
resetGame();
}
});