A. 프레임워크 제작
1. 프레임 워크 기초 제작
a. 메인 루프 수정
저번 강의에서 설명했듯, GetMessage만으로는 모든 일 처리를 하는데 무리가 있음
따라서 메인 루프를 수정해줘야 함
◽◽◽
MSG msg = {};
// 3) 기본 메시지 루프입니다:
while (msg.message != WM_QUIT) //창을 끄면 바로 프로그램이 꺼지게
{
//윈도우 메시지 큐에서 다음 메시지를 제거하지 않고 해당 메시지를 확인하는 데 사용
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) //메시지가 있을때가 많지 않음
{
::TranslateMessage(&msg); //추가적인 이벤트를 만들어줌
::DispatchMessage(&msg); //메시지를 처리해줌 (둘이 거의 비슷)
}
else
{
//게임 로직
}
}
💙 PeekMessage를 사용하는 이유
👉 즉, 논블로킹 환경에서 메세지를 처리하고자 할 때 사용한다!
b. 폴더 정리하기
중요한건 MainGame
Headers 폴더에 있는건 잡동사니를 넣어두는 개념이고
Default는 내가 만들지 않은 파일들을 또 넣어줌
c. Defines, Enum, Types 헤더 파일 생성하기
- Defines.h : 편하게 사용할 수 있는 메크로
- Enums.h : 중간에 사용되는 Enums
- Types.h : 변수를 편리하게 사용하기 위한 파일
◽◽◽ Types.h
#pragma once
using int8 = __int8;
using int16 = __int16;
using int32 = __int32;
using int64 = __int64;
using uint8 = unsigned __int8;
using uint16 = unsigned __int16;
using uint32 = unsigned __int32;
using uint64 = unsigned __int64;
d. pch, Utils 클래스 생성하기
📁 99.Headers
1) pch 파일 생성하기
◽◽◽
#pragma once
#include "Types.h"
#include "Defines.h"
#include "Enums.h"
#include <Windows.h>
#include <vector>
#include <list>
#include <map>
#include <unordered_map>
#include <string>
#include <algorithm>
using namespace std;
여기까지 하면 오류가 생성되는데
pch.h 창을 만들기 전에 생성했던 Gamecoding.cpp 파일에도 헤더를 추가하면 끝!
꼭 맨 위에다가 작성해야 함!!!!!!
2) Utils : 자주 활용되는 헬퍼함수들을 매핑해서 우리버전으로 사용
📁 99.Headers > 📄 Utils.h
위에서 HDC를 알 수 있도록 #include <windows.h> 작성해주기 (👉 이건 추가 시점에 따라 달라짐)
📁 99.Headers > 📄 Types.h
📁 99.Headers > 📄 Utils.cpp
👉 x,y 좌표는 float로 관리해야지 나중에 0.1픽셀 씩 이동할때에 문제가 생기지 않음!!
e. 주요 파일 Game 만들기
앞으로 GameCoding2가 아닌 Game에서 코드를 침!
f. GameCoding2 수정하기
여기까지 만들었다면 GameCoding2에 Game.h파일 추가해주고
나머지 코드들 정리해주기
2. 게임 틀 구현하기
a. game 코드 작성하기
b. Manager 매크로 생성하기
매니저는 싱글톤 방식으로 제작
1) InputManager : 키보드나 마우스 입력을 처리
2) TimeManager : 프레임과 시간과 관련된 모든걸 관리
이렇게 매니저는 항상 싱글톤으로 작성할 예정이니 매크로를 생성해준다
여기서 오타가 나서 한참 찾았다.. SINGLE로 고쳐주기!!
💥 매크로는 나중에 디버깅 하기 힘들어진다는 단점은 있음 (진짜 필요한 부분에만 사용하기)
c. TimeManager 작성하기
◽◽◽ TimeManager.cpp
#include "pch.h"
#include "TimeManager.h"
void TimeManager::Init()
{
//GetTickCount64 함수와 동일하지만 좀더 정확함
::QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER*>(& _frequency));
::QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&_prevCount)); //cpu 클럭
}
void TimeManager::Update()
{
uint64 currentCount;
::QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(¤tCount));
//경과된 시간(초) = 현재시간 - 그전 시간 / 빈도
_deltaTime = (currentCount - _prevCount) / static_cast<float>(_frequency);
_prevCount = currentCount;
_frameCount++; //몇번 호출이 됐는지 계속 추적
_frameTime += _deltaTime; //경과된 시간 추적
if (_frameTime >= 1.f) {
//1초동안 몇번의 함수가 호출되었는지
_fps = static_cast<uint32>(_frameCount / _frameTime); //fps가 핵심!
_frameTime = 0.f;
_frameCount = 0;
}
}
d. Game.cpp파일 작성하기
1) Manager 적용하기
2) 텍스트 출력하기
wstring은 저번에 사용한 buffer 버전보다 더 현대적임
사용하기 전에 적용해야할 사항이 있음
이건 무한으로 프레임을 높힌 방법이고 프레임을 고정하려면 아래와 같이 하면 됨
e. InputManager 작성하기
f. Game.cpp에서 InputManager 추가하기
3. 메모리 릭 체크하기
메모리 릭 : new 후 delete를 안하는 것
a. pch.h 파일에 추가하기
👉 메모리 누수를 감지하기 위한 CRT 라이브러리의 디버그 기능을 활성화하는 것
🧡 위에서는 주소도 있는데 주소도 없는 아래같은 애들은 어디서메모리 릭이 일어난걸까?
👉 게임이 제거되는 시점보다 소멸이 더 늦어짐!!
'운영체제 > 입출력 시스템 : Windows API' 카테고리의 다른 글
[게임 프로그래머 입문 올인원] Windows API 입문 : 리소스(92강) (0) | 2024.04.08 |
---|---|
[게임 프로그래머 입문 올인원] Windows API 입문 : 오브젝트 설계 #1, #2(90, 91강) (2) | 2024.04.06 |
[게임 프로그래머 입문 올인원] Windows API 입문 : 더블 버퍼링 (89강) (1) | 2024.04.06 |
[게임 프로그래머 입문 올인원] Windows API 입문 : Scene과 SceneManager (88강) (1) | 2024.04.06 |
[게임 프로그래머 입문 올인원] Windows API 입문 : 기본 템플릿 분석 (86강) (0) | 2024.04.01 |