ProPerNounpYK commited on
Commit
da81366
·
verified ·
1 Parent(s): bc0bfd1

Update index.html

Browse files
Files changed (1) hide show
  1. index.html +226 -328
index.html CHANGED
@@ -1,354 +1,252 @@
1
  <!DOCTYPE html>
2
  <html>
3
  <head>
4
- <style>
5
- body {
6
- margin: 0;
7
- overflow: hidden;
8
- background: black;
9
- }
10
- #gameCanvas {
11
- background-image: url('stage 1.jpg');
12
- background-size: cover;
13
- }
14
- #message {
15
- position: fixed;
16
- bottom: 550px;
17
- left: 0;
18
- width: 100%;
19
- color: white;
20
- text-align: center;
21
- font-size: 30px;
22
- font-family: Arial;
23
- }
24
- #stats {
25
- position: fixed;
26
- top: 20px;
27
- left: 20px;
28
- color: white;
29
- font-family: Arial;
30
- font-size: 28px;
31
- }
32
- #villainCount {
33
- position: fixed;
34
- top: 20px;
35
- right: 20px;
36
- color: white;
37
- font-family: Arial;
38
- font-size: 28px;
39
- }
40
- #healthBar {
41
- width: 300px;
42
- height: 30px;
43
- background: #333;
44
- margin-top: 5px;
45
- }
46
- #healthFill {
47
- width: 100%;
48
- height: 100%;
49
- background: red;
50
- transition: width 0.3s;
51
- }
52
- #bulletCount, #enemyCount {
53
- font-size: 28px;
54
- }
55
- #replayButton {
56
- position: fixed;
57
- top: 50%;
58
- left: 50%;
59
- transform: translate(-50%, -50%);
60
- padding: 15px 30px;
61
- font-size: 20px;
62
- font-family: Arial;
63
- background-color: white;
64
- color: black;
65
- border: none;
66
- border-radius: 5px;
67
- display: none;
68
- cursor: pointer;
69
- }
70
- #replayButton:hover {
71
- background-color: lightgray;
72
- }
73
- </style>
 
 
 
 
 
 
 
74
  </head>
75
  <body>
76
- <canvas id="gameCanvas"></canvas>
77
- <div id="message"></div>
78
- <div id="stats">
79
- Health:<div id="healthBar"><div id="healthFill"></div></div>
80
- Bullets: <span id="bulletCount">35</span>
81
- </div>
82
- <div id="villainCount">Villains: <span id="enemyCount">30</span></div>
83
- <button id="replayButton">Replay</button>
84
- <audio id="bgMusic" src="cinematic-time-lapse-115672.mp3" loop></audio>
85
- <audio id="playerShootSound" src="Maincharactergunsound.mp3"></audio>
86
- <audio id="enemyShootSound" src="Renovatorsgunshot.mp3"></audio>
87
- <audio id="playerHitSound" src="Maincharactershot.mp3"></audio>
88
- <audio id="enemyHitSound" src="Renovatorsgetshot.mp3"></audio>
89
-
90
- <script>
91
- const canvas = document.getElementById('gameCanvas');
92
- const ctx = canvas.getContext('2d');
93
- const message = document.getElementById('message');
94
- const healthFill = document.getElementById('healthFill');
95
- const bulletCount = document.getElementById('bulletCount');
96
- const enemyCount = document.getElementById('enemyCount');
97
- const bgMusic = document.getElementById('bgMusic');
98
- const replayButton = document.getElementById('replayButton');
99
- const playerShootSound = document.getElementById('playerShootSound');
100
- const enemyShootSound = document.getElementById('enemyShootSound');
101
- const playerHitSound = document.getElementById('playerHitSound');
102
- const enemyHitSound = document.getElementById('enemyHitSound');
103
-
104
- canvas.width = window.innerWidth;
105
- canvas.height = window.innerHeight;
106
-
107
- const player = {
108
- x: canvas.width / 2.3,
109
- y: canvas.height - 260,
110
- width: 250,
111
- height: 250,
112
- speed: 10,
113
- health: 10,
114
- bullets: 35,
115
- direction: 1,
116
- image: new Image(),
117
- imageLeft: 'Maincharacterdefaultleft.png',
118
- imageRight: 'Maincharacterdefaultright.png',
119
- imageShootLeft: 'gunshotleft.png',
120
- imageShootRight: 'gunshotright.png',
121
- imageHitLeft: 'ExplosionLeft.png',
122
- imageHitRight: 'ExplosionRight.png'
123
- };
124
- player.image.src = player.imageRight;
125
-
126
- let enemies = [];
127
- let bullets = [];
128
- let enemyBullets = [];
129
- let enemiesRemaining = 30;
130
- let mouseX = 0;
131
- let gameStarted = false;
132
- let gameOver = false;
133
-
134
- function spawnEnemy() {
135
- if (!gameStarted || gameOver) {
136
- return;
 
 
 
 
 
 
137
  }
138
-
139
- if (enemies.length >= 10) { // 동시에 존재할 수 있는 적의 수 제한
140
- return;
141
- }
142
-
143
- const side = Math.random() < 0.5 ? 0 : canvas.width;
144
- const enemy = {
145
- x: side,
146
- y: Math.random() * (canvas.height - 150),
147
- width: 250,
148
- height: 250,
149
- speed: side === 0 ? 1 : -1,
150
- image: new Image(),
151
- imageLeft: 'Renovators Default Right.png',
152
- imageRight: 'RenovatorsDefaultLeft.png',
153
- imageShootLeft: 'RenovatorsgunLeft.png',
154
- imageShootRight: 'RenovatorsGunRight.png',
155
- imageHitLeft: 'RenovatorsExplodeLeft.png',
156
- imageHitRight: 'RenovatorsExplodeRight.png',
157
- lastShootTime: Date.now()
158
- };
159
- enemy.image.src = side === 0 ? enemy.imageLeft : enemy.imageRight;
160
- enemies.push(enemy);
161
  }
162
- function updateGame() {
163
- ctx.clearRect(0, 0, canvas.width, canvas.height);
164
 
165
- player.direction = mouseX > player.x ? 1 : -1;
166
- player.image.src = player.direction === 1 ? player.imageRight : player.imageLeft;
167
- ctx.drawImage(player.image, player.x, player.y, player.width, player.height);
168
 
169
- // 플레이어가 발사한 총알 처리
170
- bullets.forEach((bullet, index) => {
171
- bullet.x += bullet.speed;
172
- ctx.fillStyle = 'yellow';
173
- ctx.fillRect(bullet.x, bullet.y, 10, 5);
174
- });
175
 
176
- // 적 처리
177
- enemies.forEach((enemy, enemyIndex) => {
178
- enemy.x += enemy.speed;
179
- ctx.drawImage(enemy.image, enemy.x, enemy.y, enemy.width, enemy.height);
 
 
180
 
181
- // 플레이어와 적이 충돌했을 경우 처리
182
- if (checkCollision(player, enemy)) {
183
- player.health--;
184
- healthFill.style.width = (player.health / 5 * 100) + '%';
185
- player.image.src = player.direction === 1 ? player.imageHitRight : player.imageHitLeft;
186
- enemies.splice(enemyIndex, 1); // 적 제거
187
- playerHitSound.play();
188
 
189
- if (player.health <= 0) {
190
- endGame("Game Over! Go back to the past and change the current result!");
191
- }
192
- }
193
 
194
- // 플레이어의 총알이 적을 맞췄을 경우 처리
195
- bullets.forEach((bullet, bulletIndex) => {
196
- if (checkCollision(bullet, enemy)) {
197
- // 총알이 적을 맞췄을 때 처리
198
- enemy.image.src = enemy.speed > 0 ? enemy.imageHitRight : enemy.imageHitLeft;
199
- setTimeout(() => {
200
- enemies.splice(enemyIndex, 1); // 적 제거
201
- bullets.splice(bulletIndex, 1); // 총알 제거
202
- enemiesRemaining--;
203
- enemyCount.textContent = enemiesRemaining;
204
- }, 100);
205
- enemyHitSound.play();
206
 
207
- if (enemiesRemaining <= 0) {
208
- endGame("You have successfully protected New York. Return to the time machine.");
209
- }
210
- }
211
- });
212
 
213
- // 적의 총알 발사
214
- enemyShoot(enemy);
215
- });
216
- if (enemiesRemaining <= 0 && enemies.length === 0) {
217
- endGame("You have successfully protected New York. Return to the time machine.");
218
- return; // 게임 종료 후 더 이상 업데이트하지 않음
219
  }
220
- // 적의 총알 처리
221
- enemyBullets.forEach((bullet, index) => {
222
- bullet.x += bullet.speed;
223
- ctx.fillStyle = 'orange';
224
- ctx.fillRect(bullet.x, bullet.y, bullet.width, bullet.height);
225
 
226
- // 총알이 플레이어와 충돌했을 경우 처리
227
- if (
228
- bullet.x < player.x + player.width - 30 &&
229
- bullet.x + bullet.width > player.x + 30 &&
230
- bullet.y < player.y + player.height - 30 &&
231
- bullet.y + bullet.height > player.y + 30
232
- ) {
233
- player.health--;
234
- healthFill.style.width = (player.health / 5 * 100) + '%';
235
- player.image.src = player.direction === 1 ? player.imageHitRight : player.imageHitLeft;
236
- enemyBullets.splice(index, 1); // 총알 제거
237
- playerHitSound.play();
238
-
239
- if (player.health <= 0) {
240
- endGame("Game Over! Go back to the past and change the current result!");
241
- }
242
- }
243
  });
244
 
245
- // 화면 밖으로 나간 총알 제거
246
- bullets = bullets.filter(bullet =>
247
- bullet.x >= 0 && bullet.x <= canvas.width
248
- );
249
- enemyBullets = enemyBullets.filter(bullet =>
250
- bullet.x >= 0 && bullet.x <= canvas.width
251
- );
252
-
253
- // 게임이 종료되지 않으면 계속 업데이트
254
- if (!gameOver) {
255
- requestAnimationFrame(updateGame);
 
 
256
  }
 
 
 
 
 
 
257
  }
258
- setTimeout(() => {
259
- message.textContent = "Click on the character";
260
- setTimeout(() => {
261
- message.textContent = "You can move your character using the arrow keys.";
262
- setTimeout(() => {
263
- message.textContent = "The character's direction follows the mouse cursor.";
264
- setTimeout(() => {
265
- message.textContent = "Press the space bar to shoot a bullet.";
266
- setTimeout(() => {
267
- message.textContent = "Your mission is to defeat the Renovators who have attacked New York. Defeat them all and save New York in 2030!";
268
- setTimeout(() => {
269
- message.textContent = "";
270
- gameStarted = true;
271
- }, 5000);
272
- }, 3000);
273
- }, 4000);
274
- }, 4000);
275
- }, 4000);
276
- }, 0);
277
 
278
- function endGame(messageText) {
279
- gameOver = true;
280
- message.textContent = messageText;
281
- replayButton.style.display = 'block';
282
- }
283
- function checkCollision(rect1, rect2) {
284
- return (
285
- rect1.x + rect1.width * 0.2 < rect2.x + rect2.width * 0.8 &&
286
- rect1.x + rect1.width * 0.8 > rect2.x + rect2.width * 0.2 &&
287
- rect1.y + rect1.height * 0.2 < rect2.y + rect2.height * 0.8 &&
288
- rect1.y + rect1.height * 0.8 > rect2.y + rect2.height * 0.2
289
- );
290
  }
291
- function enemyShoot(enemy) {
292
- const now = Date.now();
293
- if (now - enemy.lastShootTime >= 3000 && !gameOver) {
294
- enemy.image.src = enemy.speed > 0 ? enemy.imageShootRight : enemy.imageShootLeft;
295
- enemyBullets.push({
296
- x: enemy.x + enemy.width / 2,
297
- y: enemy.y + enemy.height / 2.5,
298
- width: 10,
299
- height: 5,
300
- speed: enemy.speed > 0 ? 5 : -5
301
- });
302
- enemy.lastShootTime = now; // Update the last shoot time
303
- enemyShootSound.play();
304
- }
305
- }
306
 
307
- window.addEventListener('keydown', (e) => {
308
- if (!gameOver) {
309
- switch (e.key) {
310
- case 'ArrowUp':
311
- if (player.y > 0) player.y -= player.speed;
312
- break;
313
- case 'ArrowDown':
314
- if (player.y < canvas.height - player.height) player.y += player.speed;
315
- break;
316
- case 'ArrowLeft':
317
- if (player.x > 0) player.x -= player.speed;
318
- break;
319
- case 'ArrowRight':
320
- if (player.x < canvas.width - player.width) player.x += player.speed;
321
- break;
322
- case ' ':
323
- if (player.bullets > 0) {
324
- player.image.src = player.direction === 1 ? player.imageShootRight : player.imageShootLeft;
325
- bullets.push({
326
- x: player.x + player.width / 2,
327
- y: player.y + player.height / 2.5,
328
- width: 10,
329
- height: 5,
330
- speed: player.direction * 10
331
- });
332
- player.bullets--;
333
- bulletCount.textContent = player.bullets;
334
- playerShootSound.play();
335
- }
336
- break;
337
- }
338
- }
339
- });
340
-
341
- window.addEventListener('mousemove', (e) => {
342
- mouseX = e.clientX;
343
- });
344
-
345
- replayButton.addEventListener('click', () => {
346
- location.reload();
347
- });
348
-
349
- setInterval(spawnEnemy, 2000);
350
- bgMusic.play();
351
- updateGame();
352
- </script>
353
  </body>
354
  </html>
 
1
  <!DOCTYPE html>
2
  <html>
3
  <head>
4
+ <style>
5
+ body {
6
+ margin: 0;
7
+ overflow: hidden;
8
+ background: #1a1a1a;
9
+ display: flex;
10
+ justify-content: center;
11
+ align-items: center;
12
+ min-height: 100vh;
13
+ }
14
+ canvas {
15
+ cursor: pointer;
16
+ }
17
+ #gameCanvas {
18
+ background-image: url('stage 1.jpg');
19
+ background-size: cover;
20
+ }
21
+ #message {
22
+ position: fixed;
23
+ bottom: 550px;
24
+ left: 0;
25
+ width: 100%;
26
+ color: white;
27
+ text-align: center;
28
+ font-size: 30px;
29
+ font-family: Arial;
30
+ }
31
+ #stats {
32
+ position: fixed;
33
+ top: 20px;
34
+ left: 20px;
35
+ color: white;
36
+ font-family: Arial;
37
+ font-size: 28px;
38
+ }
39
+ #villainCount {
40
+ position: fixed;
41
+ top: 20px;
42
+ right: 20px;
43
+ color: white;
44
+ font-family: Arial;
45
+ font-size: 28px;
46
+ }
47
+ #healthBar {
48
+ width: 300px;
49
+ height: 30px;
50
+ background: #333;
51
+ margin-top: 5px;
52
+ }
53
+ #healthFill {
54
+ width: 100%;
55
+ height: 100%;
56
+ background: red;
57
+ transition: width 0.3s;
58
+ }
59
+ #bulletCount, #enemyCount {
60
+ font-size: 28px;
61
+ }
62
+ #replayButton {
63
+ position: fixed;
64
+ top: 50%;
65
+ left: 50%;
66
+ transform: translate(-50%, -50%);
67
+ padding: 15px 30px;
68
+ font-size: 20px;
69
+ font-family: Arial;
70
+ background-color: white;
71
+ color: black;
72
+ border: none;
73
+ border-radius: 5px;
74
+ display: none;
75
+ cursor: pointer;
76
+ }
77
+ #replayButton:hover {
78
+ background-color: lightgray;
79
+ }
80
+ </style>
81
  </head>
82
  <body>
83
+ <canvas id="canvas"></canvas>
84
+ <canvas id="gameCanvas"></canvas>
85
+ <div id="message"></div>
86
+ <div id="stats">
87
+ Health:<div id="healthBar"><div id="healthFill"></div></div>
88
+ Bullets: <span id="bulletCount">35</span>
89
+ </div>
90
+ <div id="villainCount">Villains: <span id="enemyCount">30</span></div>
91
+ <button id="replayButton">Replay</button>
92
+ <audio id="bgMusic" src="cinematic-time-lapse-115672.mp3" loop></audio>
93
+ <audio id="playerShootSound" src="Maincharactergunsound.mp3"></audio>
94
+ <audio id="enemyShootSound" src="Renovatorsgunshot.mp3"></audio>
95
+ <audio id="playerHitSound" src="Maincharactershot.mp3"></audio>
96
+ <audio id="enemyHitSound" src="Renovatorsgetshot.mp3"></audio>
97
+
98
+ <script>
99
+ const canvas = document.getElementById('canvas');
100
+ const ctx = canvas.getContext('2d');
101
+
102
+ let particles = [];
103
+ const phrases = [
104
+ { text: 'Hello everyone.', size: 65, duration: 5000 },
105
+ { text: 'You have been selected as the next\nTimewalker for our team of Space Guardians.', size: 50, duration: 7000 },
106
+ { text: 'Repair the collapsing timelines\nand return safely.', size: 55, duration: 6000 },
107
+ { text: 'Good luck.\n- From the Space Guardians Leader', sizes: [65, 45], spacing: 45, duration: 6000 },
108
+ { text: 'TimeWalker', size: 65, duration: 3000 },
109
+ { text: 'Chapter 1', size: 65, duration: null }
110
+ ];
111
+
112
+ let currentPhraseIndex = 0;
113
+ let animationFrame;
114
+ let mouseX = 0;
115
+ let mouseY = 0;
116
+
117
+ canvas.width = window.innerWidth;
118
+ canvas.height = window.innerHeight;
119
+
120
+ class Particle {
121
+ constructor(x, y, targetX, targetY) {
122
+ this.x = Math.random() * canvas.width;
123
+ this.y = Math.random() * canvas.height;
124
+ this.targetX = targetX;
125
+ this.targetY = targetY;
126
+ this.dx = (Math.random() - 0.5) * 8;
127
+ this.dy = (Math.random() - 0.5) * 8;
128
+ this.radius = 2;
129
+ this.alpha = 1;
130
+ this.fadeSpeed = 0.02;
131
+ }
132
+
133
+ draw() {
134
+ ctx.beginPath();
135
+ ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2);
136
+ ctx.fillStyle = `rgba(255, 255, 255, ${this.alpha})`;
137
+ ctx.fill();
138
+ ctx.closePath();
139
+ }
140
+
141
+ update() {
142
+ const distance = Math.hypot(mouseX - this.x, mouseY - this.y);
143
+
144
+ if (distance < 100) {
145
+ this.x += this.dx;
146
+ this.y += this.dy;
147
+ } else {
148
+ this.x += (this.targetX - this.x) * 0.1;
149
+ this.y += (this.targetY - this.y) * 0.1;
150
  }
151
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
  }
 
 
153
 
154
+ function createParticles(phrase) {
155
+ let newParticles = [];
156
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
157
 
158
+ const lines = phrase.text.split('\n');
 
 
 
 
 
159
 
160
+ lines.forEach((line, index) => {
161
+ const size = phrase.sizes ? phrase.sizes[index] : phrase.size;
162
+ ctx.font = `${size}px Arial`;
163
+ ctx.fillStyle = 'white';
164
+ ctx.textAlign = 'center';
165
+ ctx.textBaseline = 'middle';
166
 
167
+ const spacing = phrase.spacing || size * 1.2;
168
+ const y = (canvas.height / 2 - 20) + (index - (lines.length - 1) / 2) * spacing;
169
+ ctx.fillText(line, canvas.width / 2, y);
170
+ });
 
 
 
171
 
172
+ const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height).data;
 
 
 
173
 
174
+ for (let y = 0; y < canvas.height; y += 4) {
175
+ for (let x = 0; x < canvas.width; x += 4) {
176
+ const index = (y * canvas.width + x) * 4;
177
+ const alpha = imageData[index + 3];
 
 
 
 
 
 
 
 
178
 
179
+ if (alpha > 128) {
180
+ newParticles.push(new Particle(x, y, x, y));
181
+ }
182
+ }
183
+ }
184
 
185
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
186
+ return newParticles;
 
 
 
 
187
  }
 
 
 
 
 
188
 
189
+ function transition() {
190
+ if (currentPhraseIndex < phrases.length - 1) {
191
+ currentPhraseIndex++;
192
+ const currentPhrase = phrases[currentPhraseIndex];
193
+
194
+ particles.forEach(particle => {
195
+ particle.dx = (Math.random() - 0.5) * 20;
196
+ particle.dy = (Math.random() - 0.5) * 20;
197
+ const fadeOut = setInterval(() => {
198
+ particle.alpha -= particle.fadeSpeed;
199
+ if (particle.alpha <= 0) clearInterval(fadeOut);
200
+ }, 50);
 
 
 
 
 
201
  });
202
 
203
+ setTimeout(() => {
204
+ particles = createParticles(currentPhrase);
205
+ particles.forEach(particle => {
206
+ particle.alpha = 0;
207
+ const fadeIn = setInterval(() => {
208
+ particle.alpha += particle.fadeSpeed;
209
+ if (particle.alpha >= 1) clearInterval(fadeIn);
210
+ }, 50);
211
+ });
212
+ }, 800);
213
+
214
+ if (currentPhrase.duration) {
215
+ setTimeout(transition, currentPhrase.duration);
216
  }
217
+ } else {
218
+ // Transition to the game part here
219
+ const gameScript = document.createElement('script');
220
+ gameScript.src = 'game.js';
221
+ document.body.appendChild(gameScript);
222
+ }
223
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
224
 
225
+ function animate() {
226
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
227
+ particles.forEach(particle => {
228
+ particle.update();
229
+ particle.draw();
230
+ });
231
+ animationFrame = requestAnimationFrame(animate);
 
 
 
 
 
232
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
 
234
+ canvas.addEventListener('mousemove', (e) => {
235
+ mouseX = e.clientX;
236
+ mouseY = e.clientY;
237
+ });
238
+
239
+ window.addEventListener('resize', () => {
240
+ canvas.width = window.innerWidth;
241
+ canvas.height = window.innerHeight;
242
+ particles = createParticles(phrases[currentPhraseIndex]);
243
+ });
244
+
245
+ particles = createParticles(phrases[currentPhraseIndex]);
246
+ animate();
247
+ if (phrases[currentPhraseIndex].duration) {
248
+ setTimeout(transition, phrases[currentPhraseIndex].duration);
249
+ }
250
+ </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  </body>
252
  </html>