Three.js를 활용한 3D 맵 구현
BPS 알고리즘을 이용한 몬스터의 미로 추적 로직 구현
몬스터 로직 코드
chase(camera) {
let dz = [-1, 1, 0, 0]; // 상하좌우 z축 변화
let dx = [0, 0, -1, 1];
let cameraRound = camera.position.round();
let monsterRound = this.monster.position.round();
let playerZ = cameraRound.z;
let playerX = cameraRound.x;
let monsterZ = monsterRound.z;
let monsterX = monsterRound.x;
if (playerZ >= 49) playerZ = 48;
if (playerX >= 49) playerZ = 48;
if (monsterZ >= 49) monsterZ = 48;
if (monsterX >= 49) monsterX = 48;
let vis = JSON.parse(JSON.stringify(this.map2D));
vis[playerZ][playerX] = 0; // 몬스터 -> 사람 까지의 방문 여부를 표기하기 위해서 사람 좌표 0으로 셋팅
vis[monsterZ][monsterX] = 1;
let queue = [[monsterZ, monsterX]]; // 큐에 몬스터 좌표 넣어줌
let direction = JSON.parse(JSON.stringify(vis));
while (queue.length > 0) {
// 큐가 빌 때까지 while문 돌린다.
let [nowZ, nowX] = queue.shift(); // 큐의 맨 앞에값 꺼냄
if (nowZ == playerZ && nowX == playerX) {
// 탐색하는 좌표가 플레이어의 좌표라면 while문 탈출
break;
}
// 상하좌우
for (let k = 0; k < 4; k++) {
// for문으로 상하좌우 탐색
let d = '';
let nz = nowZ + dz[k]; // 다음으로 이동할 곳의 x좌표
let nx = nowX + dx[k]; // 다음으로 이동할 곳의 y좌표
switch (k) {
case 0:
d = 'U';
break;
case 1:
d = 'D';
break;
case 2:
d = 'L';
break;
case 3:
d = 'R';
break;
}
if (nz < 0 || nz > 49 || nx < 0 || nx > 49) continue; // 범위를 벗어나는 경우
if (vis[nz][nx] === 1) continue; // 벽이면 continue
if (vis[nz][nx] === 0) {
// 아직 방문하지 않은 곳이라면
vis[nz][nx] = vis[nowZ][nowX] + 1; // 이전 방문까지 걸린 거리 +1
direction[nz][nx] = d;
queue.push([nz, nx]); // 다음 탐색을 위해 큐에 push
}
}
}
let chaseD = [[playerZ, playerX, direction[playerZ][playerX]]]; // 역추적
let chaseCount = 0;
while (true) {
let preDirection =
direction[chaseD[chaseCount][0]][chaseD[chaseCount][1]]; // 현재좌표가 상하좌우 중 어디서 왔는지 표기
let preZ = chaseD[chaseCount][0]; // 마지막으로 추적하고 있는 곳의 x좌표
let preX = chaseD[chaseCount][1]; // 마지막으로 추적하고 있는 곳의 x좌표
if (preZ == monsterZ && preX == monsterX) {
// 추적하는 곳이 몬스터 좌표면 while문 탈출
break;
}
// 왼오위아래 상하좌우
let nextDirection;
let monsterDirection = '';
switch (preDirection) {
case 'U':
nextDirection = 1;
monsterDirection = 'D';
break;
case 'D':
nextDirection = 0;
monsterDirection = 'U';
break;
case 'L':
nextDirection = 3;
monsterDirection = 'R';
break;
case 'R':
nextDirection = 2;
monsterDirection = 'L';
break;
}
chaseD.push([
preZ + dz[nextDirection],
preX + dx[nextDirection],
monsterDirection,
]); // 바로이전 칸의 위치좌표 추가
chaseCount += 1;
}
}
파이프 맞추기 타이밍 게임
색깔 전선 연결 그리기 게임
열쇠 모양 맞추기 게임
| 전희재 | 강윤지 | 오미경 | 최혜인 | 김미리 |
| Player 3D 애니메이션 3D 파일 구조화 사운드 디자인 |
Monster 몬스터 랜덤 이동 몬스터 추격 로직 |
Map 전선 게임 2D 파일 구조화 전체 파일 머지 2D 3D 캔버스 전환 |
Effect 열쇠 게임 파이프 게임 인아웃트로 |
Mini Game 전선 게임 파이프 게임 |