Spaces:
Running
Running
cutechicken
commited on
Update game.js
Browse files
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 =
|
565 |
-
directionalLight.shadow.mapSize.height =
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
589 |
-
|
590 |
-
|
591 |
-
|
592 |
-
|
593 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
594 |
|
595 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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();
|