posted by REDFORCE 2017. 3. 13. 09:30

[Engine Graphics.h]


본 글에서는 DirectX를 통한 Graphics.header 를 다뤄보겠습니다.

[코드 전체는 최하단에 있습니다]


.cpp에 대한 내용은 다음 글을 참고하세요~


먼저 Header 에서 선언한 내용들을 살펴보도록 하겠습니다.


1. 이름 더럽게 긴것들 #define으로 선언

- 주로 사용하는 변수들의 이름이 너무 길기 때문에 

TEXTURE / DEVICE / VERTEXBUFFER / SPRITE / FONT / LINE


에 해당하는 것들만 #define 으로 편하게 바꿨습니다.


2. 자주 사용하는 컬러 값 묶기

- 자주 사용하는 컬러 값들에 대해 미리 namespace로 묶어서 열거되있습니다.

- 열거형으로 DISPLAY_MODE 가 있습니다(전체화면/창모드 구분 시 사용)



3. VertexC 구조체 선언

 - 앞으로 사용할 Vertex구조체 입니다.

 - x,y,z 좌표 값과 rhw 값(기본 1.0f)

 - color 값이 들어있습니다.



4. SpriteData 구조체

 - 앞으로 꾸준히 미친듯이 사용하는 SpriteData 구조체 입니다.

 - Engine에서 Graphic Device를 통해 그림을 출력 할 때 사용하는 SpriteData 정보.


 - x, y, width, height

 - scale (크기 값)

 - angle (그림 회전 각)

 - rect ( 텍스쳐에서의 출력할 RECT )

 - LP_TEXTURE ( 텍스쳐 파일 )

 - flipHorizontal ( 좌우 반전 여부 )

 - flipVertical (상하 반전 여부 )


에 대한 값들이 들어있습니다.




5. Graphics Class

 - 마지막으로 핵심부분인 Graphics 클래스 입니다.

 - 미리 선언해두었던 device부터 sprite와 texture에 대한 포인터 변수들

 - device 생성시 사용할 각 모드 값들이 들어있습니다.

 - 각 값들이 어떤 것인지까지는 설명하진 않겠습니다( 이거 다 설명하려면 너무 글이 길어져요

   ㅠㅠ DirectX CreateDevice 에 대해서 찾아보세요!)

 - 그 외에 초기화 결과 값을 반환 할 때 사용할 HRESULT 값과 그래픽스가 사용 될 핸들 값(HWND)가 있습니다.

 - 기타 변수들에 대한건 변수명 자체가 직관적이라 생략합니다.



6. 기타

- 그 외 public: 안에 담겨있는 각종 함수들이 엄청 많습니다만 일일이 다 설명하기엔 너무 길어지므로

필요할 때마다 설명을 추가하도록 하겠습니다.



그래서 ?? 결론은??


우리가 여기서 확인할 중요한 요지는 DirectX를 생성하고 초기화 하는데 필요한 얘들을 지금 Graphics 클래스로 따로 빼놓았다는 점입니다.


실제 DirectX에서 device를 생성하고 초기화하는데 코드를 작성해보면 약 100~200 줄 정도의 코드가 나옵니다. 

이거를 메인에서 같이 막 수행했다간....[ O _ o];;;;


따라서 DirectX초기화와 관련 된 얘들을 따로 클래스로 빼서 관리한다는 점이 중요합니다.


너무 내용이 많은지라 이글에서 한번에 모든것을 다루기는 어렵습니다만


간단히 엔진을 제작하기 위해 혹시나 참조하시는 분들 또는 DirectX를 공부하시는 분들께서는

아 Graphics를 따로 빼서 이렇게 만들 수도 있구나 하는 감을 잡는데에 도움이 되지 않을까 생각됩니다.


주 함수들의 내용이나 Graphics가 하는 일에 대해서는 cpp 글에서 다루도록 하겠습니다.



실제 헤더파일에 대한 전체 코드는 아래와 같습니다.


[GitHub - June_Engine Project : Graphics.h]


posted by REDFORCE 2017. 3. 12. 22:22

[Engine WindowSystem]


이 글에서 다룰 문제는


FrameWork에서 만들어 둔 함수 내용들을 GUI 형태로 제어할 수 있도록

EngineGUI를 어떤 구조로 만드냐가 문제입니다.



유니티 3D를 참고로 정리해 본 UI 형태는


1. 메인 HWND (저는 Engine Main-Window 로 부르고 있습니다) 가 최상위로 존재하고

(메인 HWND는 Menubar를 갖고 있음)


2. 첫 번째 자식 윈도우 (First Child-Window 라 부르고 있습니다)

 - 화면(카메라 컨트롤)

 - 선택한 오브젝트 이동/회전/스케일 조정

 - 엔진 재생/일시정지 등 UI Layer 조정


을 할 수 있는 버튼이 있음


3. 각각의 Window( Scene / Game / Project / Hierarchy / Inspector 등 Second Child-Window)

 - 각 Window는 Menubar / Caption / Titlebar 가 없음

 - 기본적으로 하나이상의 TAB ITEM을 갖고 있음

 - 해당 탭에 들어갈 자식 Window가 있음

   ( TAB Item의 Window는 여러 방식이 있음

    예: 게임렌더링 화면 / 폴더 리스트 뷰어 / 어떤 정보항목 등)


가 있는 구조 였습니다.



해서 정리해본 결과...


First Child Window 까지는 직접 EngineSystem에서 구현해도 무난하겠다 싶어서 포함을 시켰습니다.

각각의 Window는 



EngineWindow 라는 클래스를 생성하고 얘를 항상 부모로 담도록 하자.


라고 생각하고 EngineWindow 에서 생성 되면 First Child-Window 를 부모로 하여

Default 위치값을 줘서 Window를 생성하도록하게 했습니다.



대충 틀을 잡아 본 형태가 위 사진과 같군요.

(아직 #01에서 다루는 두 개의 렌더링 화면 출력이 해결 되지 않은 사진 입니다)


이제 문제가...각 윈도우들은 1개이상의 TAB Item을 갖고 있는 TAB 컨트롤러 라는 것인데

해당 Second Child-Window는 TAB Control을 갖고있는 Window이고


해당 TAB 의 Item 항목은 각각의 Window들을 갖는 구조로 넣을 수 있도록 받게 해야합니다.




그러면... TAB에 Item 항목으로 들어갈 내용들 또한 어떤 Window(HWND) 라는 것인데...


이 내용들은 전부다 하나의 Engine-Window Class를 부모로 하는 Tab Item 항목들이라는 게 될 거라보입니다.


따라서 TAB Item 항목으로 들어갈 수 있는 구조로 만들어서 본 글을 업데이트 하도록 하겠습니다.

posted by REDFORCE 2017. 3. 12. 18:01

본 프로젝트의 개발 일지 및 프로젝트 상세 내용을 작성 함에 있어

구어체의 사용이 있음을 미리 알려드립니다.


[System Architecture]


2D Game Engine을 만들기 위해

In Game 용도의 FrameWork 자체는 필요한 부분에 한해서는 다 완성이 되어 있는 상태입니다.


예) Graphics, Game, Entity, Collision, Manager Class 등


그러나 엔진으로써의 구동을 위한 핵심 코어 시스템은 섣불리 만들기가 어려운 상황입니다.

[글쓴이 저자가 너무 됻밥이라...(시무룩)]



현재 구상해본 구조는 핵심부분만 보자면


WinMain -> Engine System Initialize -> Engine Core Start 

-> Engine Window System Initialize -> Engine Graphics -> Run Loop


입니다만


Engine Window System을 설계하는 것과 


목표인 2개의 화면.

Engine Scene / Engine Game


에 Graphics를 올리고 Run을 시키는 구조를 잡는게 너무 어려운 것 같습니다.


Graphics를 2개를 잡아서 올리자니 비효율적인 것 같고


1개의 Graphics만 갖고 2개의 화면에 띄우는 작업을 하려니



Scene에서의 화면은 엔진 사용자가 이리저리 움직이며 다양한 컴포넌트들을 올리면서 에디트가 가능해야하고


Game에서의 화면은 엔진에서 빌드를 수행했을 시 인게임컨트롤을 통한 화면움직임이 이루어질텐데

([예] Unity3D Scene / Game화면)


말이지요.


이게 현재 겪고 있는 첫 번째 난관입니다만



일단 각각의 HWND 화면을 하나의 Graphics에서 정보를 가져와서 렌더링 할 수 있는 구조와 방법을 생각해 봐야겠습니다.



이 문제가 해결 된다면


수정해서 해결한 방안을 적어보도록 하겠습니다.

posted by REDFORCE 2017. 3. 12. 16:06

[June_Engine Project Introduce]



본 프로젝트는 글쓴이 저자 'REDFORCE'의 개인 프로젝트로 


DirectX 기반 2D Game Engine을 개발함으로

다양한 고통(?)과 인내심을 고양(?)시킬 목적으로 진행 중에 있음을 미리 알려드립니다.

[비상업적 용도입니다]


본 프로젝트는 2017년 1월 1일 부터 시작되었습니다.


프로젝트 계획 큰 흐름도는 아래와 같은 순서로 진행하고 있었습니다.


1. DirectX 기반 2D Game FrameWork 개발 (90%완료)

2. June_Engine FileSystem 및 Renderer 개발 (90%완료)

2. WinAPI 기반 DirectX를 활용한 June_Engine GUI 개발 (현재 개발중)


3. June_Engine 멀티쓰레드를 적용한 병렬 처리 기반 시스템 개발 (미구현)

4. C++ Script 제작 지원(미구현)

5. AudioKinetic SDK를 이용한 Sound System 개발(미구현)



[2017년 3월 12일 현재]

3단계(Engine GUI)를 개발중이며 MFC를 이용하지 않는 상황이기 때문에

WinAPI를 이용한 GUI 개발에 있어 상당히 곤혹을 겪고 있습니다. (한강 뛰어내리고 싶을 정도...)



프로젝트 소스 코드 자체는 오픈 소스로 공개되어 있으며


[GitHub] 

https://github.com/redforce01/DirectX_Engine


[주의] 현재 진행 중인 프로젝트 버전은 Branch : Kim-Jaejun 에서 확인 할 수 있습니다.


깃허브 위 링크에서 프로젝트를 받으실 수 있습니다.


모바일 플랫폼 등 멀티 플랫폼에 대한 것은 고려하지 않고 있기 때문에

OpenGL을 사용하지는 않습니다.



본 프로젝트에 참여 하시고 싶으신 분은


본 블로그의 방명록,

이메일( redforce01@naver.com )

카카오 ID : redforce01


로 연락주시면 답변 드리도록 하겠습니다.


엔진에 대한 개발 된 자세한 시스템 내역은 추후에 계속 포스팅을 적으면서 올리도록 하겠습니다.

posted by REDFORCE 2017. 3. 12. 15:55

2017년 3월 12일.


현재 DirectX 기반 2D game Engine을 제작하고 있습니다.



Win32 API 환경과 DirectX를 기반으로 2D Game Engine Client 을 개발중입니다만


계획했던 플랜대로 진행하기가 너무 버거운 관계로 속도를 제대로 내지 못하고 있습니다.


그래서 관심이 있으시다면 함께 개발해나가실 공동 프로젝트 인원을 구하고 있습니다.



인원은 1~3명으로 잡고 있으며, 인원이 다 확보 될 시 프로젝트 개발자 모집은 중단할 예정입니다.


현재 In Game FrameWork는 개발이 완료 된 상태이며


Win32 API 환경을 토대로 Engine GUI를 개발하고 있습니다.



참여 자격 조건은 


C++ / WinAPI / STL에 대해 관심있으시거나 공부하고 싶으신 분들을 받고 있습니다.


글쓴이 저자는 본명 : 김재준 으로 'REDFORCE' 라는 닉네임으로 활동 하고 있습니다.


엔진 개발 방송을 함께 자주 진행하고 있으며 [Twitch] ( https://www.twitch.tv/redforce01 )


언제든 관심 있으신 분은 해당 트위치 채널 또는

카카오 ID : redforce01

로 연락주시면 이야기 나눠드리겠습니다.


자세한 엔진에 대한 내용은 June_Engine 게시판을 참조하시기 바랍니다.