0. 자료 구조
Maze.cpp : 메인, 미로
ConsoleHelper.cpp, ConsoleHelper.h : 커서 위치, 색, 콘솔 커서 활성화
pch.cpp, pch.h :
Types.h : int 타입 캐스팅을 편하게 하기 위함
* 헤더파일을 포함시킬 때 여러 곳에서 포함되는 헤더파일을 최상위에 include 하여야 한다.
1. 헤더파일 구성
(1-1) ConsoleHelper.h
#pragma once
#include <windows.h>
#include "Types.h"
enum class ConsoleColor
{
BLACK = 0,
RED = FOREGROUND_RED,
GREEN = FOREGROUND_GREEN,
BLUE = FOREGROUND_BLUE,
YELLOW = RED | GREEN,
WHITE = RED | GREEN | BLUE,
};
class ConsoleHelper
{
public:
static void SetCursorPosition(int32 x, int32 y);
static void SetCursorColor(ConsoleColor color);
static void ShowConsoleCursor(bool flag);
};
기본적인 색상을 구현하고 커서를 활성화시키기 위한 클래스 작성.
(1-2) ConsoleHelper.cpp
#include "pch.h"
#include "ConsoleHelper.h"
void ConsoleHelper::SetCursorPosition(int32 x, int32 y)
{
HANDLE output = ::GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = { static_cast<SHORT>(x), static_cast<SHORT>(y) };
::SetConsoleCursorPosition(output, pos);
}
void ConsoleHelper::SetCursorColor(ConsoleColor color)
{
HANDLE output = ::GetStdHandle(STD_OUTPUT_HANDLE);
::SetConsoleTextAttribute(output, static_cast<int16>(color));
}
void ConsoleHelper::ShowConsoleCursor(bool flag)
{
HANDLE output = ::GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursorInfo;
::GetConsoleCursorInfo(output, &cursorInfo);
cursorInfo.bVisible = flag;
::SetConsoleCursorInfo(output, &cursorInfo);
}
GetStdHandle을 이용하여 커서 색상과 위치, 표시 구현.
(2) Types.h
#pragma once
using int8 = __int8;
using int16 = __int16;
using int32 = __int32;
using int64 = __int64;
using uint8 = unsigned __int8;
using uint16 = unsigned __int8;
using uint32 = unsigned __int8;
using uint64 = unsigned __int8;
각 int형과 양수 int형을 타이핑이 편하도록 정의.
(3-1) pch.h <- 최상위 include
#pragma once
#include <windows.h>
#include <iostream>
#include <vector>
#include "Types.h"
using namespace std;
class pch
{
};
(3-2) pch.cpp
#include "pch.h"
(4) Maze.cpp
기본적으로 대부분의 게임은 main 함수 내에서 무한 루프(while(true))로 이루어져 있다.
또한 무한 루프 내에서 입력 -> 로직 -> 렌더링의 순서를 따른다.
프레임을 관리하기 위한 코드를 작성한다.
#include <iostream>
#include "pch.h"
int main()
{
uint64 lastTick = 0;
while (true)
{
#pragma region 프레임 관리
const uint64 currentTick = ::GetTickCount64();
const uint64 deltaTic = currentTick - lastTick;
lastTick = currentTick;
#pragma endregion
// 입력
// 로직
// 렌더링
}
}
60프레임은 1초에 while 루프를 몇 번 돌리는지에 따른다.
프레임을 고정하려면 deltaTick을 체크해서 continue를 해주면 된다.
(4-1) 입력
마우스, 키보드 등의 input을 받음.
(4-2) 로직
캐릭터 이동, AI 활성화.
(4-3) 렌더링
화면에 그리기.
// 렌더링
ConsoleHelper::SetCursorPosition(0, 0);
ConsoleHelper::ShowConsoleCursor(false);
ConsoleHelper::SetCursorColor(ConsoleColor::RED);
// 25 * 25 크기의 판
const char* TILE = "■";
for (int32 y = 0; y < 25; y++)
{
for (int32 x = 0; x < 25; x++)
{
cout << TILE;;
}
cout << endl;
}
'자료구조와 알고리즘 > 예제' 카테고리의 다른 글
3-4. A*(A-Star) 알고리즘 (0) | 2023.07.11 |
---|---|
3-3. 우선순위 큐 구현 연습 (0) | 2023.07.10 |
2-4. BFS를 이용한 길 찾기 구현 (0) | 2023.07.07 |
1-2. 미로 만들기(2) - 오른손 법칙(우수법) (0) | 2023.06.27 |
1-2. 미로 만들기(1) - Binary Maze Algorithm (0) | 2023.06.27 |