(TIL) 2025-02-13
(TIL) 2025-02-13
몬스터 스폰 구역 설정
몬스터를 생성 시킬 때 중앙의 캠프에서 멀어질수록 더 강력한 몬스터가 생성되게 하기위한 테스트 로직을 만들어 보았다.
실제 맵 크기의 좌표 값
실제 맵의 최소,최대의 X,Y값을 설정하고 거기에 맞는 중앙 X,Y(캠프 위치)를 설정해준다.
1
2
3
4
5
6
7
8
9
// 맵 크기
const MAX_VALUE_X = 25.595006942749023;
const MIN_VALUE_X = -25.595003128051758;
const MAX_VALUE_Y = 12.595040321350098;
const MIN_VALUE_Y = -12.595829963684082;
// 중앙
const centerX = (MAX_VALUE_X + MIN_VALUE_X) / 2;
const centerY = (MAX_VALUE_Y + MIN_VALUE_Y) / 2;
Zone에 해당되는 크기와 몬스터 정보를 설정한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
// 구역 크기 설정 (점차 커짐)
const zoneSizes = [
{ distance: 10.0, area: 1 }, // 중앙 구역 (1.0 x 1.0)
{ distance: 20.0, area: 2 }, // 두 번째 구역 (2.0 x 2.0)
{ distance: 30.0, area: 3 }, // 세 번째 구역 (3.0 x 3.0)
];
// 몬스터 데이터
const monsters = {
1: 'Slime', // 1 구역
2: 'Goblin', // 2 구역
3: 'Orc', // 3 구역
};
생성 로직
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 구역을 나누는 함수
function getAreaForMonster(x, y) {
const distanceX = Math.abs(centerX - x);
const distanceY = Math.abs(centerY - y);
for (const zone of zoneSizes) {
if (distanceX <= zone.distance && distanceY <= zone.distance) {
return zone.area;
}
}
return 4; // 가장 넓은 구역 (4사분면)
}
// 몬스터 생성 함수
function generateMonsters(numMonsters) {
let monstersInMap = [];
for (let i = 0; i < numMonsters; i++) {
// 랜덤 좌표 생성 (맵 내에서)
const x = Math.random() * (MAX_VALUE_X - MIN_VALUE_X) + MIN_VALUE_X;
const y = Math.random() * (MAX_VALUE_Y - MIN_VALUE_Y) + MIN_VALUE_Y;
// 해당 좌표가 어느 구역에 속하는지 확인
const area = getAreaForMonster(x, y);
// 해당 구역에 맞는 몬스터 생성
const monsterType = monsters[area];
monstersInMap.push({ x, y, type: monsterType });
}
return monstersInMap;
}
테스트
1
2
3
// 몬스터 10개 생성
const generatedMonsters = generateMonsters(10);
console.log(generatedMonsters);
생성 메소드를 호출해서 로그를 찍어보면
구역에 맞게 해당된 몬스터가 생성되는걸 알 수 있다. 이제 구역별 몬스터의 값을 Assets의 몬스터 코드를 넣어 뽑아내면 마무리가 될 것 같다.
This post is licensed under CC BY 4.0 by the author.

