Spaces:
Running
Running
Update game.js
Browse files
game.js
CHANGED
|
@@ -735,12 +735,17 @@ class Particle {
|
|
| 735 |
// Game ํด๋์ค
|
| 736 |
class Game {
|
| 737 |
constructor() {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 738 |
this.scene = new THREE.Scene();
|
| 739 |
this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
|
| 740 |
this.renderer = new THREE.WebGLRenderer({ antialias: true });
|
| 741 |
this.renderer.setSize(window.innerWidth, window.innerHeight);
|
| 742 |
this.renderer.shadowMap.enabled = true;
|
| 743 |
document.getElementById('gameContainer').appendChild(this.renderer.domElement);
|
|
|
|
| 744 |
|
| 745 |
// ๋ ์ด๋ ๊ด๋ จ ์์ฑ ์ถ๊ฐ
|
| 746 |
this.radarUpdateInterval = 100; // 100ms๋ง๋ค ๋ ์ด๋ ์
๋ฐ์ดํธ
|
|
@@ -777,6 +782,12 @@ class Game {
|
|
| 777 |
|
| 778 |
async initialize() {
|
| 779 |
try {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 780 |
// ์๊ฐ ํจ๊ณผ ์ ๊ฑฐ
|
| 781 |
this.scene.fog = null;
|
| 782 |
this.scene.background = new THREE.Color(0x87CEEB);
|
|
@@ -1186,6 +1197,45 @@ class Game {
|
|
| 1186 |
if (!this.tank.isLoaded || this.isGameOver) return;
|
| 1187 |
|
| 1188 |
const direction = new THREE.Vector3();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1189 |
|
| 1190 |
// ์ฐจ์ฒด ์ด๋๊ณผ ํ์ ์ ์ ์ง
|
| 1191 |
if (this.keys.forward) direction.z += 1;
|
|
@@ -1414,6 +1464,17 @@ class Game {
|
|
| 1414 |
checkCollisions() {
|
| 1415 |
if (this.isLoading || !this.tank.isLoaded) return;
|
| 1416 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1417 |
const tankPosition = this.tank.getPosition();
|
| 1418 |
// ์ ์ด์๊ณผ ํ๋ ์ด์ด ํฑํฌ ์ถฉ๋ ์ฒดํฌ
|
| 1419 |
this.enemies.forEach(enemy => {
|
|
@@ -1422,6 +1483,11 @@ class Game {
|
|
| 1422 |
enemy.bullets.forEach(bullet => {
|
| 1423 |
const distance = bullet.position.distanceTo(tankPosition);
|
| 1424 |
if (distance < 1) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1425 |
if (this.tank.takeDamage(250)) { // ๋ฐ๋ฏธ์ง๋ฅผ 250์ผ๋ก ์์
|
| 1426 |
this.endGame();
|
| 1427 |
}
|
|
@@ -1442,6 +1508,11 @@ class Game {
|
|
| 1442 |
|
| 1443 |
const distance = bullet.position.distanceTo(enemy.mesh.position);
|
| 1444 |
if (distance < 2) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1445 |
if (enemy.takeDamage(50)) {
|
| 1446 |
enemy.destroy();
|
| 1447 |
this.enemies.splice(enemyIndex, 1);
|
|
|
|
| 735 |
// Game ํด๋์ค
|
| 736 |
class Game {
|
| 737 |
constructor() {
|
| 738 |
+
// ์ค๋์ค ๊ด๋ จ ์์ฑ ์ถ๊ฐ
|
| 739 |
+
this.engineSound = null;
|
| 740 |
+
this.engineStopSound = null;
|
| 741 |
+
this.isEngineRunning = false;
|
| 742 |
this.scene = new THREE.Scene();
|
| 743 |
this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
|
| 744 |
this.renderer = new THREE.WebGLRenderer({ antialias: true });
|
| 745 |
this.renderer.setSize(window.innerWidth, window.innerHeight);
|
| 746 |
this.renderer.shadowMap.enabled = true;
|
| 747 |
document.getElementById('gameContainer').appendChild(this.renderer.domElement);
|
| 748 |
+
|
| 749 |
|
| 750 |
// ๋ ์ด๋ ๊ด๋ จ ์์ฑ ์ถ๊ฐ
|
| 751 |
this.radarUpdateInterval = 100; // 100ms๋ง๋ค ๋ ์ด๋ ์
๋ฐ์ดํธ
|
|
|
|
| 782 |
|
| 783 |
async initialize() {
|
| 784 |
try {
|
| 785 |
+
// ์์ ์ฌ์ด๋ ์ฌ์
|
| 786 |
+
const startSounds = ['sounds/start1.ogg', 'sounds/start2.ogg', 'sounds/start3.ogg'];
|
| 787 |
+
const randomStartSound = startSounds[Math.floor(Math.random() * startSounds.length)];
|
| 788 |
+
const startAudio = new Audio(randomStartSound);
|
| 789 |
+
startAudio.volume = 0.5;
|
| 790 |
+
startAudio.play();
|
| 791 |
// ์๊ฐ ํจ๊ณผ ์ ๊ฑฐ
|
| 792 |
this.scene.fog = null;
|
| 793 |
this.scene.background = new THREE.Color(0x87CEEB);
|
|
|
|
| 1197 |
if (!this.tank.isLoaded || this.isGameOver) return;
|
| 1198 |
|
| 1199 |
const direction = new THREE.Vector3();
|
| 1200 |
+
const isMoving = this.keys.forward || this.keys.backward;
|
| 1201 |
+
// ์ด๋ ์์ํ ๋ ์ฌ์ด๋ ์ฒ๋ฆฌ
|
| 1202 |
+
if (isMoving && !this.isEngineRunning) {
|
| 1203 |
+
this.isEngineRunning = true;
|
| 1204 |
+
|
| 1205 |
+
// ์ด์ ์ฌ์ด๋ ์ ์ง
|
| 1206 |
+
if (this.engineStopSound) {
|
| 1207 |
+
this.engineStopSound.pause();
|
| 1208 |
+
}
|
| 1209 |
+
if (this.engineSound) {
|
| 1210 |
+
this.engineSound.pause();
|
| 1211 |
+
}
|
| 1212 |
+
|
| 1213 |
+
// ์์ง ์ ์ง ์ฌ์ด๋ ์ฌ์
|
| 1214 |
+
this.engineStopSound = new Audio('sounds/enginestop.ogg');
|
| 1215 |
+
this.engineStopSound.play();
|
| 1216 |
+
|
| 1217 |
+
// ์์ง ์ ์ง ์ฌ์ด๋ ์ข
๋ฃ ํ ์์ง ์ฌ์ด๋ ์์
|
| 1218 |
+
this.engineStopSound.onended = () => {
|
| 1219 |
+
this.engineSound = new Audio('sounds/engine.ogg');
|
| 1220 |
+
this.engineSound.loop = true;
|
| 1221 |
+
this.engineSound.play();
|
| 1222 |
+
};
|
| 1223 |
+
}
|
| 1224 |
+
// ์ด๋ ๋ฉ์ถ ๋ ์ฌ์ด๋ ์ฒ๋ฆฌ
|
| 1225 |
+
else if (!isMoving && this.isEngineRunning) {
|
| 1226 |
+
this.isEngineRunning = false;
|
| 1227 |
+
if (this.engineSound) {
|
| 1228 |
+
this.engineSound.pause();
|
| 1229 |
+
this.engineSound = null;
|
| 1230 |
+
}
|
| 1231 |
+
if (this.engineStopSound) {
|
| 1232 |
+
this.engineStopSound.pause();
|
| 1233 |
+
this.engineStopSound = null;
|
| 1234 |
+
}
|
| 1235 |
+
const stopSound = new Audio('sounds/enginestop.ogg');
|
| 1236 |
+
stopSound.play();
|
| 1237 |
+
}
|
| 1238 |
+
|
| 1239 |
|
| 1240 |
// ์ฐจ์ฒด ์ด๋๊ณผ ํ์ ์ ์ ์ง
|
| 1241 |
if (this.keys.forward) direction.z += 1;
|
|
|
|
| 1464 |
checkCollisions() {
|
| 1465 |
if (this.isLoading || !this.tank.isLoaded) return;
|
| 1466 |
|
| 1467 |
+
// ๋ช
์ค ์ฌ์ด๋ ๋ฐฐ์ด ์ ์
|
| 1468 |
+
const hitSounds = [
|
| 1469 |
+
'sounds/hit1.ogg',
|
| 1470 |
+
'sounds/hit2.ogg',
|
| 1471 |
+
'sounds/hit3.ogg',
|
| 1472 |
+
'sounds/hit4.ogg',
|
| 1473 |
+
'sounds/hit5.ogg',
|
| 1474 |
+
'sounds/hit6.ogg',
|
| 1475 |
+
'sounds/hit7.ogg'
|
| 1476 |
+
];
|
| 1477 |
+
|
| 1478 |
const tankPosition = this.tank.getPosition();
|
| 1479 |
// ์ ์ด์๊ณผ ํ๋ ์ด์ด ํฑํฌ ์ถฉ๋ ์ฒดํฌ
|
| 1480 |
this.enemies.forEach(enemy => {
|
|
|
|
| 1483 |
enemy.bullets.forEach(bullet => {
|
| 1484 |
const distance = bullet.position.distanceTo(tankPosition);
|
| 1485 |
if (distance < 1) {
|
| 1486 |
+
// ๋ช
์ค ์ฌ์ด๋ ์ฌ์
|
| 1487 |
+
const randomHitSound = hitSounds[Math.floor(Math.random() * hitSounds.length)];
|
| 1488 |
+
const hitAudio = new Audio(randomHitSound);
|
| 1489 |
+
hitAudio.play();
|
| 1490 |
+
|
| 1491 |
if (this.tank.takeDamage(250)) { // ๋ฐ๋ฏธ์ง๋ฅผ 250์ผ๋ก ์์
|
| 1492 |
this.endGame();
|
| 1493 |
}
|
|
|
|
| 1508 |
|
| 1509 |
const distance = bullet.position.distanceTo(enemy.mesh.position);
|
| 1510 |
if (distance < 2) {
|
| 1511 |
+
// ๋ช
์ค ์ฌ์ด๋ ์ฌ์
|
| 1512 |
+
const randomHitSound = hitSounds[Math.floor(Math.random() * hitSounds.length)];
|
| 1513 |
+
const hitAudio = new Audio(randomHitSound);
|
| 1514 |
+
hitAudio.play();
|
| 1515 |
+
|
| 1516 |
if (enemy.takeDamage(50)) {
|
| 1517 |
enemy.destroy();
|
| 1518 |
this.enemies.splice(enemyIndex, 1);
|