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;
		}