B. 플레이어 이동하기
1. 플레이어 나타내기
a. 맵에 플레이어 인식시키기
📁 Board > 📄 Board.h
맵을 만들어줄 때 플레이어를 동시에 초기화
📁 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
📁 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도 회전
}
}
}
코드가 완성되지 않은 채 끝나버림... (다음 강좌에 이어서 진행됨)
'자료구조와 알고리즘 > Data Structure' 카테고리의 다른 글
[게임 프로그래머 입문 올인원] 비선형 자료구조 1 : 재귀함수와 트리 기초(54, 55강) (0) | 2024.02.15 |
---|---|
[게임 프로그래머 입문 올인원] 선형 자료구조 3 : 스택 & 큐 (53강) (1) | 2024.02.15 |
[게임 프로그래머 입문 올인원] 선형 자료구조 실습 1 : 미로 맵 만들기(50강) (0) | 2024.02.14 |
[게임 프로그래머 입문 올인원] 선형 자료구조 2 : 동적배열 (48강) (0) | 2024.01.23 |
[게임 프로그래머 입문 올인원] 선형 자료구조 1 : 연결 리스트 (47강) (2) | 2024.01.23 |