posted by REDFORCE 2017. 4. 7. 14:59

#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


-----------------------------------------------------------------------


이번 글 부터는 #2 FrameWork에 대해서 설명하도록 하겠습니다.


실질적으로 FrameWork를 통해 게임을 만들 때 어떤식으로 만들지


그리고 어떤식으로 Framework를 활용할지에 대해서 주로 거론하며

각 클래스들의 역할과 개념을 설명드릴 예정입니다.



Graphics Class 는 DirectX Device를 생성하고

Game 에서 이용하기 위해 어떤 정보들을 담고있는지 보도록 하겠습니다.


1. struct VertexC


첫 번째로 볼 사항은 Vertex 구조체 입니다.


모든 이미지의 텍스쳐는 vertex 좌표가 필요합니다.

따라서 그 좌표에서 사용 될 vertex 구조체가 다음과 같이 정의되어있습니다.



2. struct SpriteData


두 번째로 볼 사항은 앞으로 사용할

모든 2D 이미지(스프라이트 이미지)를 담고있을 구조체 입니다.


스프라이트 구조체 안에는

 + width / height (이미지 크기)

 + x ,y (스크린 좌표)

 + scale (이미지 스케일)

 + angle (이미지 회전 각도)

 + rect (스프라이트 출력할 이미지 RECT)

 + texture (이미지 텍스쳐)

 + flipHorizontal / flipVertical (이미지 상하좌우 반전 여부)


값들이 있습니다. 각각 int / float / rect / LP_Texture / bool 값들로 이루어져있습니다.


3. Graphics Class Member


세 번째로 Graphics 클래스의 private: 접근한정자 안에 선언 된 변수들입니다.



위부터 차례대로 Graphics에서 사용하는 내용들을 위한 변수들이 있습니다.


 + LPDIRECT3D9            (directX)

 + LPDIRECT3DDEVICE9   (directX device)

 + LPD3DXSPRITE           (directX Sprite)

 + LPD3DXLINE              (dxLine)


d3dpp / pMode (DirectX를 설정하기 위한 변수)

pOcclusionQuery / numberOfPixel(pixel collision에서 사용하는 변수)


그 외에 hwnd / 전체화면 여부 / directX에서 설정할 해상도 width / height 값 / 배경 값


등등..설정할 변수들이 있습니다.



그 아래로 수 많은 함수들이 선언되어있습니다만

현재 헤더에서 일일히 설명하기엔 분량이 많아지므로 


cpp 파일에서 함께 다루면서 설명하도록 하겠습니다.



아래에는 헤더 파일의 코드 전체가 담겨져 있습니다.


'MyProject > SephyEngine' 카테고리의 다른 글

June_Engine #2_Graphics.cpp (2)  (0) 2017.04.17
June_Engine #2_Graphics.cpp (1)  (0) 2017.04.15
June_Engine #1_MainNode  (0) 2017.04.07
June_Engine #1_EngineError.h  (0) 2017.04.07
June_Engine #1_EngineCore.cpp (2)  (0) 2017.04.07
posted by REDFORCE 2017. 4. 7. 13:27

#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


-----------------------------------------------------------------------


이번 글에서는 각 매니저나 게임 구동에 필요한 것들이 동작 될, 루트라 볼 수 있는

MainNode에 대해서 설명하겠습니다.


MainNode Class는 EngineSystem Class와 Game Class 에서의 중간다리 역할이라 할 수 있습니다.


헤더를 먼저 살펴보겠습니다.



헤더에서는 주요하게 볼 부분은 MainNode의 함수 구성이


initialize()

release()

update()

render()


로 나뉘어져 있다는 사실 입니다.


그리고 Engine의 프로시져로 받아오는 내용을 처리할 핸들러가 있습니다.



이어서 .cpp 를 보겠습니다.


cpp 는 헤더에 선언해두었던 각각의 함수 수행부가 구현되어 있습니다.



먼저 intiailize()에서는 게임에서 사용 하는 각각의 Manager들을 초기화 합니다.


코드상에 TIMEMANAGER와 FILEMANAGER가 주석처리 된 이유는


현재 사용하지 않기 때문이고, FILEMANAGER의 경우 EngineStart( ) 구역으로 빠져있습니다.



release() 는 매니저들에 대한 내용을 해지하는 것을 수행합니다. 



두 번째로 update() 에서 SceneManager를 업데이트하여 현재 게임의 내용을 업데이트합니다.


이것이 수행되고 나면 SceneManager -> render()를 수행하여

그리기 작업을 수행하게 됩니다.



마지막에 있는 MessageHandler는 EngineRun()에서 전달되는 프로시져에서의 메세지 처리 핸들러 입니다.


키 입력에 대한 처리를 여기서 위와 같이 하게 됩니다.




'MyProject > SephyEngine' 카테고리의 다른 글

June_Engine #2_Graphics.cpp (1)  (0) 2017.04.15
June_Engine #2_Graphics.h  (0) 2017.04.07
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
posted by REDFORCE 2017. 4. 7. 10:13

#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


-----------------------------------------------------------------------


이번 글에서는 EngineError.h 에 대해서 설명하도록 하겠습니다.


흔히 어떤 에러에 대한 처리를 위해서 try - catch 문을 이용하여


exception 처리를 하는데요.



저는 그 처리 중에 내가 알수 있을 법한 처리로 에러를 보고자


EngineError.h 를 만들어두었습니다.


먼저 코드를 보는게 이해가 빠른 분들이 계실 수도 있으니 전체 코드부터 올려드리겠습니다.



위와 같이 먼저 


1. #include <exception>을 이용합니다.

2. 그리고 간단히 내가 정의할 에러 코드를 namespace로 묶어두었습니다.

3. EngineError Class는 std::exception을 부모로 받습니다.

4. 생성자에 throw( ) 를 이용하여 에러 코드와 메세지를 던지도록 하게합니다.

5. 간단히 operator= 에도 메세지를 받을 수 있도록 재정의 해줍니다.



이게 다 입니다.


사용 법은??


이미 우리는 engineSystem.cpp 에서 EngineError를 사용하는 것을 보셨을 겁니다.


그곳(engineError.cpp)을 참조하시는게 빠르니 


직접 해보시거나 이런식으로 만들어보면서 쓰시면 좋을 것 같습니다.

'MyProject > SephyEngine' 카테고리의 다른 글

June_Engine #2_Graphics.h  (0) 2017.04.07
June_Engine #1_MainNode  (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_EngineSystem  (0) 2017.04.06
posted by REDFORCE 2017. 4. 7. 09:34

#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


-----------------------------------------------------------------------


이어서 EngineCore의 cpp 입니다.


.h 에서 선언해두었던 std::thread를 이용하는 내용만 있습니다만.


실질적으로 어떤 것을 수행하게끔 구현은 시켜두지 않았습니다.



본래 계획은 Component Based 형식의 엔진 구조를 만들어서 


이 코어쓰레드들을 여러개 만들어서 일을 시킬려고 했습니다만


아직 개발중인지라 틀만 잡아두고 냅둔 상태입니다.

그래도 아무 설명도 안하고 넘어가면 찝찝하니 initialize( )에 적어둔 내용을 보겠습니다.


SYSTEM_INFO systemInfo;

GetSystemInfo(&systemInfo); //Get SystemInfo

DWORD cpu_count = systemInfo.dwNumberOfProcessors;    //CPU CORE COUNT


는 윈도우 함수를 이용해서 cpu 코어 갯수를 알아내는 방법입니다.


DWORD 형태로 값이 반환되어 지기 때문에 (int)로 형변환하여 

받아온 코어 갯수 만큼 쓰레드를 생성하여 컨테이너에 담아둡니다.


그리고 그 쓰레드가 일할 내용은 선언해두었던 가상 함수 CoreSupport( ) 를 넣어주었습니다.


만약 어떤 쓰레드를 이용하여 일을 시킬 내용이 생긴다면



EngineCore를 부모로 상속받아서 어떤 작업 내용을 CoreSupport에 담아두면 될 것 같습니다.


그러나 아직은 확실히 동작시켜본 적이 없기 때문에 확신은 없습니다.



그냥 이렇게 한번 돌려보자 라는 생각으로 만들어두었을 뿐..


아무튼 현재 사용하지 않는 코어 부분들입니다!

'MyProject > SephyEngine' 카테고리의 다른 글

June_Engine #1_MainNode  (0) 2017.04.07
June_Engine #1_EngineError.h  (0) 2017.04.07
June_Engine #1_EngineCore.h (1)  (0) 2017.04.06
June_Engine #1_EngineSystem  (0) 2017.04.06
June_Engine #1_WinMain  (0) 2017.04.06
posted by REDFORCE 2017. 4. 6. 19:18

#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


-----------------------------------------------------------------------


이번 글에서는 이전에 적어둔 EngineSystem Class에서 불렀던 EngineCore Class가 어떻게 돌아가는지 살펴보도록 하겠습니다.


먼저 헤더부터 살펴보도록 하겠습니다.


헤더에는 단순히 아래와 같이 std::vector 로 std::Thread 컨테이너만 있습니다.


보시는 것과 같이 engineCore Class 에서는 std::Thread 를 이용하여 


멀티쓰레드를 사용하기 위해 준비하고 있습니다.



그리고 멀티쓰레드에서 일할 내용이 들어갈 가상함수 CoreSupport ( ) 함수가 있습니다.

'MyProject > SephyEngine' 카테고리의 다른 글

June_Engine #1_EngineError.h  (0) 2017.04.07
June_Engine #1_EngineCore.cpp (2)  (0) 2017.04.07
June_Engine #1_EngineSystem  (0) 2017.04.06
June_Engine #1_WinMain  (0) 2017.04.06
June_Engine #1_메뉴얼(Manual)  (0) 2017.04.05
posted by REDFORCE 2017. 4. 6. 17:18

#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
posted by REDFORCE 2017. 4. 6. 16:50

#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


-----------------------------------------------------------------------


이번 글에서는 엔진이 시작하기 까지의 Main 함수의 구성과 Engine System Class에 대해서 살펴보도록 하겠습니다.



아래의 winMain을 살펴보시면 간단하게 다음과 같습니다.


메인의 구성은 간단하게 EngineSystem Class 하나를 갖고 있고


WINAPI WinMain( ) 함수가 실행되면서 프로그램의 진입점이 정의되어 있습니다.



그리고 그 외 갖가지 글로벌 변수들에 대한 초기화가 이루어져 있습니다.


글로벌 변수들에 대한 설명은 추후 stdafx.h (미리 컴파일 된 헤더) 를 설명 할때 같이 설명하도록 하겠습니다.



    // Check for memory leak if debug build

    #if defined(DEBUG) | defined(_DEBUG)

        _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    #endif


는 메무리 누수가 발생했을 시 디버그 모드 환경에서 결과를 출력하기 위해 사용하는 함수 입니다.


프로그램이 종료 시 프로젝트에서 누수 된 메모리 주소영역들이 우르르 나오게 됩니다.


해당 누수 된 메모리를 체이스 하는 방법에 대해서는 별도의 글로 적어놓도록 하겠습니다.


if (!engine.engineStart(hInstance, nCmdShow))

return 1;

위와 같이 EngineStart 함수를 호출하고 return 받은 값이 true 이면


아래의 return engine.run();


함수를 호출하여 엔진을 Run 시킵니다.


이번 글에서는 간단히 메인만 남겨두고 계속해서 다음 글로 적어나가도록 하겠습니다.

(왠만하면 클래스 별로 글을 나눠서 올릴 예정입니다)

'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_EngineSystem  (0) 2017.04.06
June_Engine #1_메뉴얼(Manual)  (0) 2017.04.05
posted by REDFORCE 2017. 4. 5. 17:13

본 글은 2D Game Engine(이하 June_Engine)에 대한 설명 글 입니다.


June Engine의 메뉴얼은 여러 번의 포스팅으로 나눠서 정리 될 예정이며

소스 코드 재작성 / 자유로운 사용 여부 / 상업적인 목적 등

어떠한 저작권 문제도 삼지 않으니 자유로이 이용하셔도 됩니다.

다만 본 엔진을 사용 또는 참조 시 출처에 대해서 본 블로그에서 참조 하였음을 꼭 기재하여 주셨으면 합니다.


(저자 : 은고 / redforce01@naver.com)



※ 엔진에 대한 각 항목별 설명은 다음 포스트부터 이어집니다.
이하 아래 내용은 June Engine에 대해서 간략히 설명합니다.


1. Introduced

 - 본 엔진은 WinAPI 기반 DirectX를 활용하여 제작한 2D Game Engine 입니다.
교재 2D Game Programming(저자 : 찰스 캘리. 에이콘)을 참고하여 직접 여러 항목들을 개발해가며 제작하였습니다.


 - 프로젝트 코드는 Github에서 다운로드 할 수 있습니다. (링크 : DirectX_Engine)


현재 제공하는 기능에 대한 내용을 간단히 정리하면 다음과 같습니다.


 + Rendering (2D Image / 2D Animation 지원)

 + 자동 리소스 입력(프로젝트 시작 시 Resource 폴더 검사)

 + 2D UI Framework 제공(Button / Tab / ProgressBar / Frame / Text 등)

 + 멀티 쓰레드 환경 제작 지원(Core Thread / Worker Thread 분리)

 + Key 입력 처리

 + Game Scene 관리

 + Graphics Class를 통한 DirectX 생성(설명은 메뉴얼 참조바랍니다)

 


※ 주의 사항들


 + Sound 입출력은 지원하지 않습니다(추후 FMOD를 탑재할 예정)

 + Auto Resource Check 코드는 1단계 폴더까지만 검색합니다(다단계 폴더 지원은 예정 없음)

 + 일부 프레임워크의 코드 또는 엔진이 동작함에 있어 버그가 있을 수 있습니다.
    버그 발견 시 문의 주시면 해당 버그를 개선 및 고치는데 노력하도록 하겠습니다.



2. Content

 - 프로젝트 폴더 별, 주요 항목들은 다음과 같이 분류 됩니다.


 - Framework

  + Console (InGame Console 창)

  + Game (Game Scene)

  + GameInterface (Game User Interface)

  + Grahpics (DirectX Graphics)

  + Image (2D Image)

  + Input (Key Input)

  + Manager (Framework Managers)

  + Text (InGame Text)

  + Util (Framework Utilities)


 - Engine Managers (현재 미 포함)

  + Component Based 방식을 지원할 예정이었으나 아직 개발중..


 - System Code

  + Engine Main

  + Engine Core

  + Engine Worker Thread

  + Engine GameNode


 - Testing Module

  + Scene Test

  + Interface Test

  + Tab Test

  + 2D Image Test

  + 2D Animation Test



3. 추후 업데이트 예정 항목

 - 아래 항목은 시간 나는대로 개발 할 의사가 있는 내용들 입니다.


 - Framework

  + SoundManager(FMOD)

  + Excel File Loader


 - InGame Code

  + Zoom In/Out Control Function

  + Camera Function

  + InGame ScreenShot Function


 - MapTool

  + Isometric / Rectangle Tile 지원

  + Win32 API Interface Framework 지원

'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_EngineSystem  (0) 2017.04.06
June_Engine #1_WinMain  (0) 2017.04.06