cutechicken commited on
Commit
d3db2f9
โ€ข
1 Parent(s): 27f0f2f

Update game.js

Browse files
Files changed (1) hide show
  1. game.js +62 -34
game.js CHANGED
@@ -549,69 +549,97 @@ class Game {
549
 
550
  async initialize() {
551
  try {
552
- // ๋ฐฐ๊ฒฝ ๋ฐ ์•ˆ๊ฐœ ์„ค์ •
553
  this.scene.fog = null;
554
  this.scene.background = new THREE.Color(0x87CEEB);
555
 
556
- // ์ฃผ๋ณ€๊ด‘ ์ถ”๊ฐ€
557
  const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
558
  this.scene.add(ambientLight);
559
 
560
- // ํƒœ์–‘๊ด‘(์ง์‚ฌ๊ด‘) ์ถ”๊ฐ€ ๋ฐ ๊ทธ๋ฆผ์ž ์„ค์ •
561
  const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
562
  directionalLight.position.set(100, 100, 50);
563
- directionalLight.castShadow = true; // ๊ทธ๋ฆผ์ž ํ™œ์„ฑํ™”
564
- directionalLight.shadow.mapSize.width = 2048; // ๊ทธ๋ฆผ์ž ํ•ด์ƒ๋„ ์ฆ๊ฐ€
565
- directionalLight.shadow.mapSize.height = 2048;
566
- directionalLight.shadow.camera.near = 0.5;
567
- directionalLight.shadow.camera.far = 500;
568
  this.scene.add(directionalLight);
569
 
570
- // ์ง€ํ˜• ์ƒ์„ฑ
571
  const groundGeometry = new THREE.PlaneGeometry(MAP_SIZE, MAP_SIZE, 100, 100);
572
  const groundMaterial = new THREE.MeshStandardMaterial({
573
  color: 0xD2B48C,
574
  roughness: 0.8,
575
  metalness: 0.2,
 
576
  });
 
577
  const ground = new THREE.Mesh(groundGeometry, groundMaterial);
578
  ground.rotation.x = -Math.PI / 2;
579
- ground.receiveShadow = true; // ์ง€ํ˜•์ด ๊ทธ๋ฆผ์ž๋ฅผ ๋ฐ›๋„๋ก ์„ค์ •
580
- this.scene.add(ground);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
581
 
582
- // ์ง€ํ˜•์˜ ๋†’์ด ์ˆ˜์ • (๋…ธ์ด์ฆˆ ์ถ”๊ฐ€)
583
  const vertices = ground.geometry.attributes.position.array;
584
  const heightScale = 15; // ๋†’์ด ์Šค์ผ€์ผ
585
  const baseFrequency = 0.008; // ๊ธฐ๋ณธ ์ฃผํŒŒ์ˆ˜
 
586
  for (let i = 0; i < vertices.length; i += 3) {
587
  const x = vertices[i];
588
- const z = vertices[i + 1];
589
- let height = Math.sin(x * baseFrequency) * Math.cos(z * baseFrequency) * heightScale;
590
-
591
- // ์ถ”๊ฐ€์ ์ธ ๊ตด๊ณก ๋ฐ ๋…ธ์ด์ฆˆ
592
- height += Math.sin(x * baseFrequency * 2) * Math.cos(z * baseFrequency * 2) * (heightScale * 0.5);
593
- height += Math.random() * heightScale * 0.1;
 
 
 
 
 
 
 
594
 
595
- vertices[i + 2] = height;
 
 
 
 
 
 
 
 
 
596
  }
 
597
  ground.geometry.attributes.position.needsUpdate = true;
598
  ground.geometry.computeVertexNormals();
599
-
600
- // ์ง€ํ˜• ์ปจํˆฌ์–ด ๋ผ์ธ ์ƒ์„ฑ
601
- const edgesGeometry = new THREE.EdgesGeometry(ground.geometry);
602
- const lineMaterial = new THREE.LineBasicMaterial({
603
- color: 0x000000,
604
- linewidth: 1,
605
- transparent: true,
606
- opacity: 0.5,
607
- });
608
- const contourLines = new THREE.LineSegments(edgesGeometry, lineMaterial);
609
- contourLines.rotation.x = -Math.PI / 2;
610
- this.scene.add(contourLines);
611
 
612
  // ์‚ฌ๋ง‰ ์žฅ์‹ ์ถ”๊ฐ€
613
  await this.addDesertDecorations();
614
-
615
  // ํƒฑํฌ ์ดˆ๊ธฐํ™”
616
  await this.tank.initialize(this.scene, this.loader);
617
  if (!this.tank.isLoaded) {
@@ -626,11 +654,11 @@ class Game {
626
  tankPosition.z - 30
627
  );
628
  this.camera.lookAt(tankPosition);
629
-
630
  // ๋กœ๋”ฉ ์™„๋ฃŒ
631
  this.isLoading = false;
632
  document.getElementById('loading').style.display = 'none';
633
-
634
  // ๊ฒŒ์ž„ ์‹œ์ž‘
635
  this.animate();
636
  this.spawnEnemies();
 
549
 
550
  async initialize() {
551
  try {
552
+ // ์•ˆ๊ฐœ ํšจ๊ณผ ์ œ๊ฑฐ
553
  this.scene.fog = null;
554
  this.scene.background = new THREE.Color(0x87CEEB);
555
 
556
+ // ์ฃผ๋ณ€๊ด‘ ์„ค์ • - ๋” ๋ฐ๊ฒŒ
557
  const ambientLight = new THREE.AmbientLight(0xffffff, 0.6);
558
  this.scene.add(ambientLight);
559
 
560
+ // ํƒœ์–‘๊ด‘ ์„ค์ •
561
  const directionalLight = new THREE.DirectionalLight(0xffffff, 0.8);
562
  directionalLight.position.set(100, 100, 50);
563
+ directionalLight.castShadow = true;
564
+ directionalLight.shadow.mapSize.width = 1024;
565
+ directionalLight.shadow.mapSize.height = 1024;
 
 
566
  this.scene.add(directionalLight);
567
 
568
+ // ์ง€ํ˜• ์ƒ์„ฑ ์ˆ˜์ •
569
  const groundGeometry = new THREE.PlaneGeometry(MAP_SIZE, MAP_SIZE, 100, 100);
570
  const groundMaterial = new THREE.MeshStandardMaterial({
571
  color: 0xD2B48C,
572
  roughness: 0.8,
573
  metalness: 0.2,
574
+ wireframe: false
575
  });
576
+
577
  const ground = new THREE.Mesh(groundGeometry, groundMaterial);
578
  ground.rotation.x = -Math.PI / 2;
579
+ ground.receiveShadow = true;
580
+
581
+ // ๊ฒฉ์ž ํšจ๊ณผ๋ฅผ ์œ„ํ•œ ๋ผ์ธ ์ถ”๊ฐ€
582
+ const gridSize = 50; // ๊ฒฉ์ž ํฌ๊ธฐ
583
+ const gridHelper = new THREE.GridHelper(MAP_SIZE, gridSize, 0x000000, 0x000000);
584
+ gridHelper.material.opacity = 0.1;
585
+ gridHelper.material.transparent = true;
586
+ gridHelper.position.y = 0.1; // ์ง€๋ฉด๋ณด๋‹ค ์•ฝ๊ฐ„ ์œ„์— ๋ฐฐ์น˜
587
+ this.scene.add(gridHelper);
588
+
589
+ // ๋“ฑ๊ณ ์„  ํšจ๊ณผ๋ฅผ ์œ„ํ•œ ์ง€ํ˜• ์ปจํˆฌ์–ด
590
+ const contourLines = new THREE.LineSegments(
591
+ new THREE.EdgesGeometry(groundGeometry),
592
+ new THREE.LineBasicMaterial({
593
+ color: 0x000000,
594
+ opacity: 0.15,
595
+ transparent: true
596
+ })
597
+ );
598
+ contourLines.rotation.x = -Math.PI / 2;
599
+ contourLines.position.y = 0.1;
600
+ this.scene.add(contourLines);
601
 
602
+ // ๋” ๋‹ค์–‘ํ•œ ์ง€ํ˜• ์ƒ์„ฑ
603
  const vertices = ground.geometry.attributes.position.array;
604
  const heightScale = 15; // ๋†’์ด ์Šค์ผ€์ผ
605
  const baseFrequency = 0.008; // ๊ธฐ๋ณธ ์ฃผํŒŒ์ˆ˜
606
+
607
  for (let i = 0; i < vertices.length; i += 3) {
608
  const x = vertices[i];
609
+ const y = vertices[i + 1];
610
+
611
+ // ์—ฌ๋Ÿฌ ์ฃผํŒŒ์ˆ˜๋ฅผ ์กฐํ•ฉํ•œ ์ง€ํ˜• ์ƒ์„ฑ
612
+ let height = 0;
613
+
614
+ // ํฐ ์–ธ๋• (๊ธฐ๋ณธ ์ง€ํ˜•)
615
+ height += Math.sin(x * baseFrequency) * Math.cos(y * baseFrequency) * heightScale;
616
+
617
+ // ์ค‘๊ฐ„ ํฌ๊ธฐ ์ง€ํ˜•
618
+ height += Math.sin(x * baseFrequency * 2) * Math.cos(y * baseFrequency * 2) * (heightScale * 0.5);
619
+
620
+ // ์ž‘์€ ๊ตด๊ณก
621
+ height += Math.sin(x * baseFrequency * 4) * Math.cos(y * baseFrequency * 4) * (heightScale * 0.25);
622
 
623
+ // ๋žœ๋ค ๋…ธ์ด์ฆˆ ์ถ”๊ฐ€ (์•„์ฃผ ์ž‘์€ ๊ตด๊ณก)
624
+ const noise = (Math.random() - 0.5) * heightScale * 0.1;
625
+ height += noise;
626
+
627
+ // ๋งต ๊ฐ€์žฅ์ž๋ฆฌ๋กœ ๊ฐˆ์ˆ˜๋ก ๋†’์ด๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ๊ฐ์†Œ
628
+ const distanceFromCenter = Math.sqrt(x * x + y * y) / (MAP_SIZE * 0.5);
629
+ const edgeFactor = Math.pow(Math.max(0, 1 - distanceFromCenter), 2); // ๋ถ€๋“œ๋Ÿฌ์šด ๊ฐ์‡ 
630
+
631
+ // ์ตœ์ข… ๋†’์ด ์„ค์ •
632
+ vertices[i + 2] = height * edgeFactor;
633
  }
634
+
635
  ground.geometry.attributes.position.needsUpdate = true;
636
  ground.geometry.computeVertexNormals();
637
+ this.ground = ground;
638
+ this.scene.add(ground);
 
 
 
 
 
 
 
 
 
 
639
 
640
  // ์‚ฌ๋ง‰ ์žฅ์‹ ์ถ”๊ฐ€
641
  await this.addDesertDecorations();
642
+
643
  // ํƒฑํฌ ์ดˆ๊ธฐํ™”
644
  await this.tank.initialize(this.scene, this.loader);
645
  if (!this.tank.isLoaded) {
 
654
  tankPosition.z - 30
655
  );
656
  this.camera.lookAt(tankPosition);
657
+
658
  // ๋กœ๋”ฉ ์™„๋ฃŒ
659
  this.isLoading = false;
660
  document.getElementById('loading').style.display = 'none';
661
+
662
  // ๊ฒŒ์ž„ ์‹œ์ž‘
663
  this.animate();
664
  this.spawnEnemies();