cutechicken commited on
Commit
d3db2f9
·
verified ·
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();