Skip to content

IdevKangTe/FreezeMaze

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

73 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Freeze Maze

리얼한 공포 테마의 1인칭 시점 3D 탈출 게임




목차

  1. 개발 환경
  2. 주요 기능 소개
  3. 팀원 소개
  4. 외부 리소스

개발 환경

운영체제

개발 도구

Language

디자인 툴




주요 기능 소개

3D 맵

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
전선 게임
파이프 게임



외부 리소스

3D Textures

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors