posted by REDFORCE 2017. 4. 19. 23:09

#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


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


Image Class의 header 파일을 살펴봤던 것에 이어서, 


.cpp 내용을 살펴보도록 하겠습니다.


1. 생성자 / 소멸자 


간단하게 생성자부터 확인하도록 하겠습니다.



생성자 내엔 역시나 주요 변수들에 대한 초기화가 이루어집니다.


포인터 형태인 변수는 null 값으로 초기화가 됐습니다만,

최근에는 모던 C++을 공부하면서 nullptr을 사용하는 것이 더 낫다 보여집니다.



소멸자 아무 내용도 없어서 여기에 담진 않았습니다.



2. initialize


두 번째 내용은 의미있는 초기화를 담당하고 있는 initialize 함수 입니다.


try - catch 구문으로 감싸져있으며, 어떤 exception이 발생할 시엔 return false 값을 내뱉고 종료합니다.


try 안에서는 매게변수로 받아온 


 (1) Graphics*

 (2) width / height

 (3) cols

 (4) textureManager*


값을 그대로 대입합니다.


아마 이글에서 textureManager (?) 하고 의문이 들수 있습니다.


지금까지 언급했던 내용중에는 textureManager라는 항목이 없었거든요.

많이 궁금하시겠지만 일단은 그냥 그런가보다 하고 넘어가시기 바랍니다.


여기서 꼭 숙지할 점은 받아온 각 파라미터의 값들이 spriteData 안에 대입이 되어진다는 것을 확인하시기 바랍니다.


그리고 Layer 라고 하는 클래스도 갑자기 등장했습니다만, 

추후 Layer 파트에 대한 메뉴얼이 있으므로 그곳에서 설명드리도록 하겠습니다.



3. Draw Functions


세 번째 Draw 함수들 입니다.


Graphics에서 보신것과 같이 기본적인 Image를 Draw 하는 함수와

Image의 Rect가 어느정도 크기인지를 볼 수 있게 도와주는 drawRect 함수입니다.


(drawNine 함수는 현재 제대로 작동하지 않아서 언급하지 않습니다. 추후 버그수정 후 다시 올리도록 하겠습니다)



draw 함수들에 대해서는 의미적으로 이미 바로 알 수 있기 때문에


어렵게 설명할 내용은 없습니다.


현재 Image 클래스에서 갖고있는 spriteData 구조체에 들어가있는 Texture와 각종 값들을 토대로 Texture 이미지를 그대로 graphics 클래스에게 부탁하여 drawSprite 함수를 호출합니다.



나머지 함수부터는 다음 글로 이어서 적도록 하겠습니다.

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

June_Engine #3_Layer Class  (0) 2017.04.21
June_Engine #3_Image Class .cpp (2)  (0) 2017.04.20
June_Engine #3_Image (Class) & SpriteData (Struct)  (0) 2017.04.19
June_Engine #2_Graphics.cpp (3)  (0) 2017.04.18
June_Engine #2_Graphics.cpp (2)  (0) 2017.04.17
posted by REDFORCE 2017. 4. 19. 04:38

#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


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


이번 글에서는 Image 클래스와 SpriteData 구조체에 대해서 자세히 살펴보도록 하겠습니다.


Image Class 자체는 Graphics 클래스에 비하면


헤더 내용 자체는 양반입니다만 의미 자체는 역시나 Graphics 클래스 못지않게

인게임에서 렌더링을 편하게 할 수 있게 도와주는 클래스 이므로 매우 중요합니다.



그럼 먼저 성격 급하신 분들을 위해 대체 Image Class가 뭐하는 것인지부터 

간략히 설명하도록 하겠습니다.



앞서 우리는 SpriteData 라는 구조체를 봤습니다.

SpriteData 구조체 만으로도 상당히 편하게 In game에서 사용할 이미지를 대충 뿌릴 수 있습니다만...


Image Class는 SpriteData 구조체보다 한 단계 위의 작업을 하기 위해 존재합니다.

결과만 먼저 한 줄로 이야기 해드리자면, 바로 애니메이션! 을 돌리기 위함 입니다.


1. 먼저 헤더 파일의 일부를 살펴보겠습니다.




위와 같이 Protected 접근한정자 영역 안에

이미 SpriteData 구조체가 들어가 있음을 볼 수 있습니다.


즉 Image Class 자체에 텍스쳐 및 이미지 정보를 가지고 있는 SpriteData를 내포하고 있습니다.



위에서 아래로 차례대로 변수들의 목적에 대해서 설명해드리겠습니다.


 (1) *graphics : 이미지가 사용 될 Graphics 클래스 포인터

 (2) *textureManager : SpriteData에 입력 될 Texture 정보

 (3) spriteData : SpriteData 구조체

 (4) colorFilter : 투명화 시킬 컬러 필터 값 ( 아무것도 안주면 WHITE 컬러 = No change)

 (5) cols : 텍스쳐에서 애니메이션화 시킬 프레임의 열 갯수

 (6) startFrame : 시작 프레임

 (7) endFrame : 끝 프레임

 (8) currentFrame : 현재 출력중인 프레임

 (9) frameDelay : 애니메이션 딜레이

 (10) animTimer : 애니메이션 타이머

 (11) hr : 초기화 시 리턴 값

 (12) loop : 반복 애니메이션 여부

 (13) visible : 출력 여부

 (14) initialized : 초기화 성공 여부

 (15) animComplete : 애니메이션 끝났는지 여부

 (16) *layer : Layer 클래스 포인터


이렇게 총 16개의 변수가 있어서 상당히 뭐가 많아 보이긴 합니다만.


그저 Image 클래스를 자주 쓰다보면 저절로 익혀지는 내용들이라 

지금 당장 숨가쁘게 이해하실 필요는 없습니다.



2. 다음, Image Class의 각 함수들 입니다.


코드를 보신다면 아마 헐... 뭐가 이렇게 함수가 많아 라고 하실 분들도 계실텐데


주석의 량 때문에 함수 구간이 길어지다보니 많아보일 뿐

사실 함수 갯수자체로는 각 변수별 필요한 내용들에 대한 Setter/Getter 밖에없습니다.


따라서 함수에 대한 설명은 Setter/Getter 함수들을 제외한


특별한 함수들에 대해서만 설명하겠습니다.


헤더에서 일단 이런게 있구나 살펴볼 함수들은 


 (1) initialize

 (2) draw

 (3) drawLine

 (4) drawRect

 (5) update


이상 5가지 입니다.


(함수에 대한 설명글은 .cpp 에서 잇도록 하겠습니다)


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

June_Engine #3_Image Class .cpp (2)  (0) 2017.04.20
June_Engine #3_Image Class .cpp (1)  (0) 2017.04.19
June_Engine #2_Graphics.cpp (3)  (0) 2017.04.18
June_Engine #2_Graphics.cpp (2)  (0) 2017.04.17
June_Engine #2_Graphics.cpp (1)  (0) 2017.04.15
posted by REDFORCE 2017. 4. 18. 23: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


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


이번 글에서는 앞서 다룬 DrawSprite 함수에 이어서 적도록 하겠습니다.



1. changeDisplayMode (화면 전환 함수 [창모드/전체화면모드] )


이어서 다룰 첫 번째 함수는 changeDisplayMode 입니다.


이름만봐도 알 수 있듯이 위 함수는 전체화면이나 창모드 화면으로 변경할 시에 사용 되는 함수입니다.


사용빈도 자체는 높진 않지만 일반적인 게임이라면 필수적으로 지원되야하는


기능이라 할 수 있습니다.


우리는 일상에서 많은 게임들이 Alt+Enter 키를 누르면 전체화면이나 창모드로 바뀌는 그런 경우를 볼 수 있었을 것 입니다.


단축키 자체는 별도로 작성해서 이 함수를 호출하도록 하게끔만 만들면 되므로

키 입력에 대한 내용은 추후 Input Class 에서 다루도록 하고 여기서는


어떻게 화면이 변환되는지에 대해서만 언급하겠습니다.


먼저 코드를 살펴보겠습니다.




함수 내용 전체는 try - catch 문으로 감싸져 있습니다.


이유는 미리 우리가 정의해놓은 어떤 디스플레이 모드 상에서 바뀌는 거라면

상관이 없지만 어떤 에러로 인해 제대로 동작이 안될 경우를 대비하여 


안전하게 화면을 바꾸기 위함입니다.



천천히 try 문 부터 살펴보도록 하겠습니다.



switch 문으로 mode 플래그 값을 통해 구분이 되어있는데


동작 원리는 밖에 선언해두었던 fullscreen (bool) 값을 이용하여 단순히 true / false 를 교체해주는 행위를 합니다.


그리고 switch 문에서 나오면 


reset() 함수를 호출하네요.


reset 함수의 내용은 아래와 같습니다.



그리고 fullscreen 값을 체크하여 true 라면

현재 모니터의 전체 화면으로 메인 윈도우를 늘려주고,


아니라면 현재 게임의 width / height 값으로 창화면을 만들어줍니다.


catch 구문으로 갔을 경우의 하는 역할도 마찬가지 입니다.



2. pixelCollision (픽셀 충돌 함수)


두 번째로 다룰 함수는 픽셀 충돌 함수 입니다.


pixelCollision 함수는 저도 꽤 어려운 구역이라 어떻게 설명을 드려야 할지 저도 잘 모르겠습니다. 그래도 아에 스킵하고 넘어갈순 없으므로 어떤 식으로 픽셀 충돌을 검출하는지 확인해보겠습니다.


다음이 픽셀 충돌 함수의 내용입니다.



픽셀 충돌은 먼저 두 개의 spriteData 구조체 파라미터를 받습니다.

그리고 다소 어려운 내용일 수도 있지만 깊이 버퍼 값을 이용하여 픽셀 충돌을 검사합니다.


코드를 보시면, 처음 stencilSupport 여부를 체크하는데요.

이것은 그래픽카드에서 깊이 버퍼를 이용한 기술적 지원을 해주는지 여부를 확인합니다.

(위 stencilSupport 값은 Initialize( ) 에서 true / false 여부가 판단되어 있습니다)


다음, 깊이 버퍼 기술을 이용할 수 있다면


다양한 RenderState를 설정하는 것을 볼 수 있습니다.

이 값들이 의미하는 바에 대해서는 여기서 일일이 설명드리기에 너무 많으므로


MSDN이나 구글링 하시는 것을 통해 알아가시기를 양해드립니다.



첫 번째, 


중요한 요점은 D3DRS_STENCILE 이라 하는 RenderState 값들을 이용한다는 점을 숙지하는 것 입니다.



두 번째,


설정한 RenderState 값들 중에 몇가지는 spriteBegin() 이 호출된 이후에 설정되어야 하는 값들이 있습니다.



세 번째,


pOcclusionQuery (IDirect3DQuery9*)를 이용하여 두 스프라이트의 픽셀 갯수만큼 while 문을 돌고 픽셀 충돌 여부를 검출합니다.


그리고 반환 된 충돌 된 픽셀 갯수가 numberOfPixelsColliding 에 담겨서 리턴되게 됩니다.



만약 이 함수를 이용하여 픽셀 충돌을 검사한다면 numberOfPixelsColliding 값이 0보다 큰지 아닌지만 검사한다면 픽셀 충돌이 이뤄졌는가 아닌가를 알 수 있습니다.



여기까지가 주요 Graphics Class에 대한 내용들이었습니다.


의외로 세 번에 걸쳐서 글을 쓰게 될줄은 몰랐습니다.



처음에는 한번에 다 적을 수 있겠지~~ 했는데, 

코드를 포함하여 적다보니 량이 적지않구나 하는걸 느낀 후로 조금 나눠서 글을 적게 되었습니다.


만약 여기까지 읽어주셨다면 정말 감사드리고, 궁금하신 점 있으시면 답글이나 이메일

redforce01@naver.com 으로 주시면 제가 아는 한에서 꼭 답변해드리겠습니다.




추신. getDeviceState() 함수가 여기서는 다뤄지지 않은 것 같습니다만,

추후에 reset() 함수를 다시 활용할 때 한번 더 정리 하여 올릴 예정입니다.



아래는 Graphics 클래스의 .h 파일과 .cpp 파일 전체 입니다.


헤더 코드입니다.


cpp 코드입니다.


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

June_Engine #3_Image Class .cpp (1)  (0) 2017.04.19
June_Engine #3_Image (Class) & SpriteData (Struct)  (0) 2017.04.19
June_Engine #2_Graphics.cpp (2)  (0) 2017.04.17
June_Engine #2_Graphics.cpp (1)  (0) 2017.04.15
June_Engine #2_Graphics.h  (0) 2017.04.07
posted by REDFORCE 2017. 4. 17. 21:53

#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


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


Graphics Class의 핵심 내용에 이어서 나머지 함수들에 대해서 정리하도록 하겠습니다.


아래 코드는 Graphics class에서 제공해주는 VertexBuffer / Draw Quad / Draw Line 함수 입니다.



1. createVertexBuffer


VertexBuffer 라는 말에서 볼 수 있듯이


createVertexBuffer 함수는 directX를 공부하셨다면 Vertex 라는 개념을 이해할 수 있습니다.

이때 사용하는 함수인데, 모든 이미지나 어떤 출력물은 vertex라 하는 좌표점들을 통해 구성이 되어집니다.


특히 3D의 모델은 삼각형으로 이루어진 폴리곤의 집합체라 볼 수 있습니다.


마찬가지로 2D 에서도 Vertex를 이용한 Drawing이 필요할 때가 있습니다.


그 예시들은 다음에 기회가 되면 설명드리기로 하고, 지금은 일단 넘어가겠습니다.



2. DrawLine / DrawQuad


DrawLine과 DrawQuad는 Vertex를 이용하여 어떤 선 / 면을 그리는 함수 입니다.

인게임 자체에서 자주 이용할지 여부는 때에 따라 다르나,


맵툴에서의 타일 또는 간단한 테스팅을 위한 UI용도로는 상당히 편리한 함수입니다.




3. showBackBuffer


세 번째 showBackBuffer 함수는 매우 심플하여 별거 없어보이지만

의미 자체는 정말 중요한 함수입니다.


showBackBuffer의 내용을 보면 간단히 코드 한줄로만 이루어져 있습니다.

(return 문은 계산에서 제외..)


device3d->Present(NULL, NULL, NULL, NULL);


가 그 코드인데요.


present(NULL, NULL, NULL, NULL)로 주는 순간. 


Device에서는 "아~ 내가 출력할 것들다 넣어줬어? 그럼 이제 렌더링해야지~"

하고 받아들이게 됩니다.


결국 showbackbuffer 라는 함수는 매 프레임 렌더할 내용들이 끝나는 시점인 마지막에

호출하게 됩니다.



4. isAdapterCompatible


isAdapterCompatible 함수는 원래 initialize 를 다룰때 설명해드렸어야 했으나


제가 실수로 이제와서 언급하게 되었네요.


함수의 내용을 보면 UINT 값 modes 를 통해 현재 모니터의 어댑터 모드를 볼 수 있습니다. DVI라던지...HDMI라던지...그리고 받아온 값을 통해 전체화면으로 출력 할 시


adapter 값을 확인하고 화면의 width height 값 만큼 전체 화면으로 출력 해줍니다.



5. drawSprite


5번째로 설명할 drawSprite 함수는 Graphics 클래스에서 가장 많이 사용 되어지며


결과적으로 Graphics 클래스가 궁극적으로 'rendering' 이라는 역할을 수행하는

함수가 바로 drawSprite 입니다.




drawSprite 함수는 2가지 파라미터 값을 받습니다.


 (1) SprtieData 구조체 타입 값

 (2) 투명 적용시킬 컬러 값


SpriteData 구조체는 앞에서 몇번 언급했듯이 모든 이미지들이 담겨져있는 데이터 구조체 입니다.


SpriteData 구조체를 까먹으신 분들을 위해 다시 한번 SpriteData 구조체안에 어떤 정보들이 담겨있는지 다시 살펴보겠습니다.



구조체 안에 있는 정보들을 보면 


 (1) width / height  (텍스쳐 그림 크기)

 (2) x, y (출력할 x, y 좌표)

 (3) scale (스케일 크기)

 (4) angle (출력 할 그림의 각도)

 (5) rect (텍스쳐 안에서 출력 할 부분)

 (6) 기타..(texture / 반전 여부)


들이 있습니다. 위 항목들을 토대로 drawSprite 함수에서 필요한 내용들이 수행되어집니다.


차례대로 함수안의 내용을 나열해보겠습니다.


 A. spriteCenter : SpriteCenter 값은 출력 할 스프라이트(그림)의 센터를 받아옵니다.

 B. translate : 스크린상의 x, y 좌표로 변환 값

 C. scaling : SpriteData 안에 있는 scale 값을 토대로 이미지에 연산 시킬 스케일 값

 D. 좌우상하 반전 여부를 통해 센터값을 기준으로 상하좌우 반전을 계산합니다.

 E. D3DXMatrixTransformation2D 함수를 통해 연산 값들을 넣어 최종 D3DMATRIX (matrix)에 넣습니다.

 F. 나온 결과 값을 토대로 sprite에 matrix 값을 transform 시킵니다.

 G. 마지막으로 Draw 함수 수행.


위 과정을 간추려 요약하자면  3가지 단계로 이루어지게 됩니다.


 ① SpriteData구조체 값을 통해 출력 할 내용을 D3DMatrix 값으로 변환 

 ② LPD3DXSPRITE 에 SetTransform (위치나 스케일 등 Setup)

 ③ LPD3DXSPRITE Draw


첫 번째 과정이 조금 길게 느껴지실 수 있으나 한번 위와같이 설정해두면 우리는 어떤 그림이든 이제 이 함수 자체만을 통해 바로바로 그림을 출력 할 수 있게 됩니다.


계속해서 적으면 글이 너무 길어지므로, 이번 글에서는 DrawSprite 까지만 다루도록 하겠습니다.

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

June_Engine #3_Image (Class) & SpriteData (Struct)  (0) 2017.04.19
June_Engine #2_Graphics.cpp (3)  (0) 2017.04.18
June_Engine #2_Graphics.cpp (1)  (0) 2017.04.15
June_Engine #2_Graphics.h  (0) 2017.04.07
June_Engine #1_MainNode  (0) 2017.04.07
posted by REDFORCE 2017. 4. 15. 01:51

#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


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


이번 글에서는 Graphics 클래스의 cpp 파일을 확인하도록 하겠습니다.


먼저 헤더 내용을 정리하며 가리켰던 3가지 항목


A. struct VertexC

B. struct SpriteData

C. Class Graphics


를 다시 상기해볼 필요가 있습니다.


A. VertexC에 대해서 간략히 다시 설명하자면


앞으로 사용 할 모든 이미지들은 x,y 좌표가 필요한데, DirectX 상에서는 3D 좌표를 이용하므로

z 축 좌표가 하나 더 필요합니다.


그러나 여기서 다룰 2D 게임을 위한 엔진에서는 z 축은 사실 상 필요가 없습니다.

따라서 z 축 자체는 0 값으로 모두 보존됩니다.



B. SpriteData 구조체는 모든 이미지를 사용함에 있어 그 데이터를 가지고 있습니다.

출력할 스크린 상의 x, y 좌표, 텍스쳐(이미지) 정보, 텍스쳐에서 어떤 부분을 사용할 것인지 RECT 값 등.


Graphics 클래스에서는 이 SpriteData 구조체를 주소 값 형식( * 가 아닌 & 연산자)으로 받아옴으로 원하고자 하는 SpriteData 정보를 이용하여 이미지를 출력합니다.



C. Graphics Class의 .cpp 내용을 지금 부터 확인해보겠습니다.



1. 생성자 ( Constructor )와 소멸자


생성자 구역은 헤더에서 선언한 주요 Graphics 클래스의 멤버들을 초기화합니다.

별 다른 특별한 내용은 없습니다.



소멸자는 releaseAll 함수를 호출하여 연결되어있던 내용들을 해지합니다.



releaseAll( ) 에서 사용한 safeRelease( ) 함수는 템플릿 형태로 미리 만들어 둔 매크로 입니다.




2. Initialize


이어서 Graphics Class의 시작인 initialize( )를 살펴보겠습니다.


initialize 의미 자체대로 모든 초기화에 대한 진행을 이곳에서 합니다.



주요 내용을 천천히 살펴보면 먼저 파라미터


 (1) 생성된 윈도우 핸들 값 (HWND) 

 (2) width / height 값 (int)

 (3) fullscreen 여부 (bool)


값들을 받습니다. 

그리고 direct3d 초기화에 들어갑니다.


위에서 보여지는 DirectX 초기화 설정에 대한 내용은 여기서 다루진 않겠습니다.

(추후 DirectX 관련 글을 올리면서 어떤 내용들이었는지 언급하여 다루겠습니다)


어 일단 이거 코드를 활용 해보고 싶은데? 라는 분들은 그대로 가져가셔서 쓰시되 필요한 설정에 대한 부분만 본인에 맞게 바꾸시면 될 것 같습니다.



3. LoadTexture


LoadTexture 함수는 Graphics Class Initialize 중에 생성 한 DirectX Device에

Texture를 올리는 함수입니다.


간단히 비유하여 설명드리자면,


2. Initialize에서 Direct9Device 라는 상자를 만들었고

LoadTexture 함수는 그 상자안에 Texture라는 내용들을 담아주는 거라 보시면 됩니다.



LoadTexture 함수는 파라미터 값으로 다음의 내용들을 받습니다.


 (1) fileName (const char*) - 파일 경로

 (2) transColor ( COLOR_ARGB ) - 걸러 내고싶은 컬러 값

 (3) width / height ( UINT [unsigned int] ) - 불러 올 텍스쳐 크기

 (4) &texture ( LP_TEXTURE ) - 텍스쳐의 주소 값


아래는 LoadTexture 함수 전체입니다.


간단히 설명하자면 


 (1) 파라미터로 받아온 파일 경로를 통해 이미지 정보를 생성

 (2) 텍스쳐 정보 생성 및 device에 입력


순으로 들어갑니다.


위 함수가 기본적인 텍스쳐 정보들을 Device에 담아주는 함수입니다만

아래와 같이 만약 시스템 메모리를 사용하여 텍스쳐를 담고 싶을 경우에는 


로드 텍스쳐 함수를 다음과 같이 이용합니다.



Graphics Class의 주요 핵심 내용은 이렇게 위 3가지로 좁혀집니다만.


다음 글 부터 나머지 Graphics class의 내용에 대해서 정리하도록 하겠습니다.

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

June_Engine #2_Graphics.cpp (3)  (0) 2017.04.18
June_Engine #2_Graphics.cpp (2)  (0) 2017.04.17
June_Engine #2_Graphics.h  (0) 2017.04.07
June_Engine #1_MainNode  (0) 2017.04.07
June_Engine #1_EngineError.h  (0) 2017.04.07
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