#1. Engine System
+ WinMain - EngineSystem (현재 글)
+ EngineCore
+ EngineError
+ MainNode
#2. FrameWork
+ Grahpics
+ Image - SpriteData
+ Layer
+ Input
+ Game
+ Manager
+ Game Interface
+ Utility
#3. Testing Module
+ 2D Image Test
+ 2D Animation Test
+ Game UI Test
-----------------------------------------------------------------------
이어서 WinMain - EngineSystem 두번째 글 입니다.
EngineSystem.h 부터 살펴보도록 하겠습니다.
헤더 구성은 주요 함수 내용은
+ 생성자 / 소멸자
+ bool engineStart ( ) // 엔진 시작 전 초기화 지점
+ int Run ( ) // 엔진 런
+ bool CreateWindowMain // 메인 Window 화면 생성 함수
+ LRESULT EngineProc( ) // 메인 프로시져
이 있습니다.
(위의 내용에는 파라미터가 생략되어있습니다. 정확한건 Gist로 올려둔 코드를 보시기 바랍니다)
생성자와 소멸자에선 딱히 하는 일이 없기 때문에 생략합니다.
첫 번째 함수인 bool engineStart( ) 함수부터 살펴보겠습니다.
engineStart 함수에서는 먼저 FILEMANAGER->initialize( ) 가 수행됩니다.
FILEMANAGER는 본 편에서 다룰 내용은 아니지만 간단히 설명하자면
프로젝트가 구동 될 때 읽어 들일 Resource 폴더내의 내용을 긁어오는 녀석이라 보시면 됩니다.
Singleton 패턴으로 선언되어있으며 추후 엔진에서 어떤 리소스에 대한 내용을 다시 불러올 때 사용 됩니다.
그리고 ::pEngine = this; 는 앞으로 사용 될 엔진의 static 함수인 메인 프로시져를 수행하기 위한 용도 입니다.
그리고 핵심 부분인
EngineCore engineCore;
if (engineCore.initialize()) //This is Not Meaning Anything Until Develop Component Based System
{
try
{
// Create Engine-Main Window
if (CreateMainWindow(g_hWndEngine, hInstance, nCmdShow) == false)
throw(EngineError(engineErrorNS::ENGINE_CORE_ERROR, "Engine Main Window Create Failed"));
success = true;
}
catch (const EngineError &err)
{
MessageBox(g_hWndEngine, err.getMessage(), "Error", MB_OK);
}
}
에서 EngineCore를 선언 및 수행하게 되며 engineCore.initializer() 에서 return 받은 값이 true 면
엔진 루프를 실행 할 준비가 되었다는 뜻 입니다.
따라서 Main Window를 이때 생성하게 되는데요.
CreateMainWindow 함수를 통해 메인 HWND를 통해 WinMain에서 받아온 hInstance값을 통해 화면을 만들게 됩니다.
여기까지 작업이 잘 끝났다면 return success를 돌려주게 되겠지요.
아래는 위에 engineStart 과정에서 사용 한 CreateMainWindow 함수와 EngineProc ( 프로시져 ) 입니다.
그리고 두 번째 핵심 부분인 engineRun ( )을 살펴보겠습니다.
engineRun( ) 에서는 게임의
Game의 DirectX 를 얹기 위해 Graphics 클래스와
Scene의 루트 노드라 부를 수 있는 MainNode를 생성합니다.
각각 initialize( ) 함수를 통해 초기화를 진행하고 메인 노드의 초기화가 끝나면
이제 메세지 루프를 돌게 됩니다.
메세지 루프는 window가 생성되면서 연결시켜주었던 프로시져를 통해
메세지 루프를 돌게 되며 PeekMessage가 없으면
메인노드의 Update 함수를 수행합니다.
try - Catch 구문으로 감싸져 있는 스코프 부분이 루프 영역입니다.
그리고 혹여나 어떤 에러가 발생하면 Catch 구문으로 가서 에러를 띄워주고 메인 Window를 다시 파괴하고 모든 것들을 릴리즈 시킵니다.
아마 여기까지는 일반적인 WinAPI 게임 구조의 형태와 비슷하기 때문에
Initialize -> Update -> Render 로직을 따라 가시면 쉽게 이해하실 수 있을거라 생각드네요.
여기까지가 EngineSystem Class에 대한 내용이었습니다.
혹여나 잘 이해가 안가시는 부분이 있다면 질문주시면 성의껏 답변해드리겠습니다.
전체 cpp 코드는 아래에 적어두었습니다.
'MyProject > SephyEngine' 카테고리의 다른 글
June_Engine #1_EngineError.h (0) | 2017.04.07 |
---|---|
June_Engine #1_EngineCore.cpp (2) (0) | 2017.04.07 |
June_Engine #1_EngineCore.h (1) (0) | 2017.04.06 |
June_Engine #1_WinMain (0) | 2017.04.06 |
June_Engine #1_메뉴얼(Manual) (0) | 2017.04.05 |