자료구조와 알고리즘/Data Structure

[게임 프로그래머 입문 올인원] 선형 자료구조 실습 2 : 플레이어 이동하기(51강)

순정법사 2024.02.15

B. 플레이어 이동하기

1. 플레이어 나타내기

a. 맵에 플레이어 인식시키기

📁 Board > 📄 Board.h

 

맵을 만들어줄 때 플레이어를 동시에 초기화

 

초기화할 때 플레이어를 변수로 넣어주고

 

Player 전방선언

 

Player 멤버함수 생성

 

📁 Board > 📄 Board.cpp

 

플레이어를 받아주고

 

플레이어를 표시하기 위해 타일 색상을 변경하는 곳에 코드를 추가

 

물론 플레이어 헤더파일 추가해주기

 

📁 Main > 📄 Maze.cpp

 

물론 여기도 플레이어 인자를 넣어줘야 한다

 

b. 플레이어 생성 및 표시하기

위에서 생성한 GetPos() 구현하기 위해 Player 파일로 가기

 

📁 Board > 📄 Player.h

 

Player의 위치, 방향, 가야할 길, 벽 감지 등 구현해줌

 

 

📁 Board > 📄 Player.cpp

 

 

여기까지 하고 Maze.cpp 실행하면

 

이렇게 플레이어 위치가 잘 표시된다

 

 

2. 플레이어 이동하기

a. 프레임 관리하기 위한 코드 생성

📁 Main > 📄 maze.cpp

 

경과시간을 같이 업데이트해주는게 일반적

 

 

위 코드처럼 아래 문법을 사용하면 문법을 문서화 할 수 있음

 

#pragma region (사용할이름)

#pragma endregion

 

b. 플레이어 위치 업데이트 하기

📁 Board > 📄 Player.h

 

  • 가야할 길을 먼저 계산해 둔 후 (CalculatePath())
  • 위치를 업데이트할 함수를 생성하고(Update())
  • 움직임, 이동할 위치(동적배열), 배열 인덱스의 좌표, 시간합산등을 저장

 

 

📁 DataStructure > 📄 Vector.h

 

사용할 Vector를 Pos로 변경

 

📁 Board > 📄 Player.cpp

 

1) CalculatePath() : 가야할 길 계산

 

현재 위치를 가져와서 넣어주고 이동시킨다

먼저 벽 생각 안하고 가는지만 확인하기 위해 for문 생성

 

 

2) Update() :플레이어 위치 업데이트 구현

 

 

📁 Main > 📄 Maze.cpp

 

여기까지 구현하고 실행하면

 

이렇게 아래로 잘 내려간다 ^_^

 

c. 갈수있는지 여부 파악하기

1) 갈 수 있는지 판별하는 CanGo()함수를 생성

 

📁 Board > 📄 Player.h, Player.cpp

 

잠시 이렇게 생성

 

2) CalculatePath() 수정하기

 

테스트용을 지워주고 

진행해야 할 좌표와 방향을 설정해준다

 

(a) 진행해야 할 좌표 설정 (2가지)

 

주석처리한 부분이 다른 방법

 

(b) 방향 설정하기

 

 

👉 일단 여기까지 Player.cpp 코드

 

◽◽◽ Player.cpp

#include "pch.h"
#include "Player.h"
#include "Board.h"

//초기화
void Player::Init(Board* board)
{
	_pos = board->GetEnterPos();	//보드의 시작지점을 포지션으로 잡고
	_board = board;	//맵 정보 저장

	CalculatePath();	//길 계산하기
}

//플레이어 위치 업데이트
void Player::Update(uint64 deltaTick)
{
	//예외처리
	if (_pathIndex >= _path.size()) {
		return;
	}

	_sumTick += deltaTick;	//시간초 더해주고

	//0.1초 지나면 실행되게 하기
	if (_sumTick >= MOVE_TICK) {
		_sumTick = 0;	//초기화

		//이동
		_pos = _path[_pathIndex];
		_pathIndex++;
	}
}

//갈 수 있는지 판별
bool Player::CanGo(Pos pos)
{
	TileType tileType = _board->GetTileType(pos);	//맵의 타일타입을 가져오고
	return tileType == TileType::EMPTY;	
}

//가야할 길 계산
void Player::CalculatePath()
{
	Pos pos = _pos;

	_path.clear();	//초기화
	_path.push_back(pos);	///데이터 저장

	Pos dest = _board->GetExitPos(); //목표지점

	/*
	//테스트용
	for (int i = 0; i < 20; i++) {
		pos += Pos(1, 0);
		_path.push_back(pos);
	}
	*/

	_dir;	//내가 바라보는 방향
	pos;	//현재 좌표

	//방향을 설정하는 배열
	Pos front[4] =
	{
		Pos(-1, 0), // UP
		Pos(0, -1), // LEFT
		Pos(1, 0), // DOWN
		Pos(0, 1), // RIGHT
	};

	//내가 바라보는 방향 기준 앞에 있는 좌표
	Pos next = pos + front[_dir];

	/*
	//방향 설정하기
	switch(_dir){
	case DIR_UP:
		Pos next = pos + Pos(-1, 0);
		break;
	case DIR_LEFT:
		Pos next = pos + Pos(0, -1);
		break;
	case DIR_DOWN:
		Pos next = pos + Pos(1, 0);
		break;
	case DIR_RIGHT:
		Pos next = pos + Pos(0, 1);
		break;
	}*/


	//오른쪽 방향 90도 회전
	_dir = (_dir + 1) % DIR_COUNT;
	//왼쪽 방향 90도 회전
	_dir = (_dir - 1) % DIR_COUNT;

	//목적지를 찾을 때 까지
	while (pos != dest)
	{
		// 1. 현재 바라보는 방향을 기준으로, 오른쪽으로 갈 수 있는지 확인
		int32 newDir;
		if (CanGo(next))
		{
			// 오른쪽 방향으로 90도 회전

			// 앞으로 한 보 전진

			// 기록
			_path.push_back(pos);
		}
		// 2. 현재 바라보는 방향을 기준으로 전진할 수 있는지 확인
		else if (CanGo(next))
		{
			// 앞으로 한 보 전진

			// 기록
			_path.push_back(pos);
		}
		else
		{
			// 3. 왼쪽 방향으로 90도 회전
		}
	}

}

 

코드가 완성되지 않은 채 끝나버림... (다음 강좌에 이어서 진행됨)