Post

(TIL) 2025-02-13

(TIL) 2025-02-13

몬스터 스폰 구역 설정

AREA

몬스터를 생성 시킬 때 중앙의 캠프에서 멀어질수록 더 강력한 몬스터가 생성되게 하기위한 테스트 로직을 만들어 보았다.

실제 맵 크기의 좌표 값

실제 맵의 최소,최대의 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);

생성 메소드를 호출해서 로그를 찍어보면

AREA

구역에 맞게 해당된 몬스터가 생성되는걸 알 수 있다. 이제 구역별 몬스터의 값을 Assets의 몬스터 코드를 넣어 뽑아내면 마무리가 될 것 같다.

This post is licensed under CC BY 4.0 by the author.