tales v 2.0 분석문서

26
Tales V 2.0 분분분분

Upload: ulf

Post on 08-Feb-2016

54 views

Category:

Documents


0 download

DESCRIPTION

Tales V 2.0 분석문서. How to Read it ?. 흐름도 ( Flow Chart ) 위주로 되어 있으니 , 슬라이드 한 장 한 장 넘겨가며 읽을 것 . 우측 상단에 설명할 함수 명과 간략한 기능이 소개되어 있음 . 좌측 상단에 설명할 함수가 있는 프로젝트 이름과 해당 프로젝트 내의 파일 경로가 기입되어 있음 . 흐름도는 슬라이드 좌측 칸 안에 각 기능별로 기술됨 . ( 좌측 상단에서 좌측 하단으로 읽기 ) 다음 슬라이드에서 함수 안으로 진입 : - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Tales V 2.0 분석문서

Tales V 2.0

분석문서

Page 2: Tales V 2.0 분석문서

How to Read it ?• 흐름도 ( Flow Chart ) 위주로 되어 있으니 , 슬라이드 한 장 한 장

넘겨가며 읽을 것 .

• 우측 상단에 설명할 함수 명과 간략한 기능이 소개되어 있음 .

• 좌측 상단에 설명할 함수가 있는 프로젝트 이름과 해당 프로젝트 내의 파일 경로가 기입되어 있음 .

• 흐름도는 슬라이드 좌측 칸 안에 각 기능별로 기술됨 .( 좌측 상단에서 좌측 하단으로 읽기 )

• 다음 슬라이드에서 함수 안으로 진입 :

• 현재 슬라이드에서 함수 끝 :

• 코멘트를 잘 읽을 것 .

Step In.

Step Out.

Page 3: Tales V 2.0 분석문서

프로그램의 전체 흐름

Page 4: Tales V 2.0 분석문서

WinMain() : Program EntryProject : Tales File : main.cpp

Option 구조체 세팅

MessageLoop() : 게임 이벤트 루프

InitIlluminia() : 게임 엔진 초기화

InitTalesGame() : 게임 객체 초기화

ReleaseGame() : 게임 객체 릴리즈

ReleaseIlluminia() : 게임 엔진 릴리즈

Step In

• Program 의 Entry 함수 .함수의 구조 변경 사항은 없을 것으로 보임 .

• 단 , 지금은 Option 구조체를 한데 뭉뚱그려 놓았는데 이를 기능별로 분리하는 것이 좋을것으로 보임 .

• 가령 InitOption, GameOption이라든지 .

Page 5: Tales V 2.0 분석문서

InitIlluminia() : 게임 엔진 초기화Project : Illuminia File : Illuminia\ Illuminia.cpp

InitWin32() : Window 초기화 .

InitD3D() : DirectX 10 객체 초기화

구조개선 여지없음 .

Step In

• 여기서부터 코드가 꼬일 기미가 보임 .• 후에 설명할 InitTalesGame() 함수 ( 슬라이드 8 참조 ) 에서 초기화되고 있는 모든 관리객체들을

이곳으로 가져와야 함 .

Page 6: Tales V 2.0 분석문서

InitD3D() : DirectX 10 객체 초기화Project : Illuminia File : Support\ D3D.cpp

윈도우 영역 계산

Frame Buffer 얻어오고 , RTV 생성

Swap Chain Description 초기화

Device 및 Swap Chain 생성 ( HAL )

Depth-Stencil Texture, View 생성

OM Stage 에 DS view, RTV 병합

IF( FAIL ) : REF 로 생성

IF( FAIL) : 객체생성 불가

뷰포트 지정

• 각 스테이지별 FAIL 검사 있음 .• 여기서는 DX API 함수를 사용하므로 ,

함수명을 표기하지 않음 .

• 한 함수가 너무 많은 객체를 초기화함 .루틴을 나누는 것이 좋을 듯 .

• GPU Rendering 을 위한 RTV 생성을

고려해야 함 .

• RTV : Render Target View• DS View : Depth-Stencil View

Step Out.

Page 7: Tales V 2.0 분석문서

InitIlluminia() : 게임 엔진 초기화Project : Illuminia File : Illuminia\ Illuminia.cpp

InitWin32() : Window 초기화 .

InitD3D() : DirectX 10 객체 초기화

Step Out.

Page 8: Tales V 2.0 분석문서

WinMain() : Program EntryProject : Tales File : main.cpp

Option 구조체 세팅

MessageLoop() : 게임 이벤트 루프

InitIlluminia() : 게임 엔진 초기화

InitTalesGame() : 게임 객체 초기화

ReleaseGame() : 게임 객체 릴리즈

ReleaseIlluminia() : 게임 엔진 릴리즈

Step In

• InitIlluminia() 함수까지 초기화가 끝났다 .

• 이제 InitTalesGame() 함수로 들어감 .

* 주의 ! 마음을 단단히 먹고 들어가시오 .

Page 9: Tales V 2.0 분석문서

Project : TalesCore File : TalesCore.cpp

*.fx 파일로부터 Effect 생성

지형 객체 초기화

Effect 로부터 테크닉 , 상수변수들 얻기

카메라 객체 초기화 ( WALKER )

월드 및 투사행렬 초기화

Mesh 및 애니메이션 리소스 초기화

스카이박스 객체 초기화

상수행렬 초기화사운드 매니저 객체 초기화

RenderState 객체 초기화 ( Game, Init )

“Init” Render State 로 전환

마우스 관리 객체 초기화 ( 640, 480 )

initFSM() : 캐릭터 생성 ( AI 처리 )

InitTalesGame() : 게임 객체 초기화

• 가장 골 때리는 함수 .• 모든 객체의 초기화 루틴이 들어와 있다 .

대부분 initIlluminia() 로 옮기는 것이 합당 .

• 쉐이더에서 상수변수들을 굉장히 많이 가져오는데 , 객체 별로 쉐이더 파일을 분할하든지 하는 대책이필요함 . 이 때문에 코드가 더 복잡해 보임 .

• 상수변수들은 반드시 각 관리객체에서 가져 올 것 .

• 애니메이션 리소스 파일경로 등을 String Table 로 관리하는 것은 어떨지 ?

• Render 함수들을 State 패턴으로 처리한 것은 정말 탁월한 선택이었음 ! 최초의 RenderState 는 초기화면을 그릴 객체인 RenderInit 객체 .

• initFSM() 에서 Lua 등 스크립팅 언어 처리가 필요함 .

Step In

Page 10: Tales V 2.0 분석문서

initFSM() : 캐릭터 생성Project : TalesCore File : TalesCore.cpp

• 현재라면 논리상 결함은 없음 .

• 단 , 차후 각 스테이지 별로 초기 주인공 캐릭터의 위치가 fix 되어 있다고 가정하면 , 주인공 캐릭터의 생성 뒤에 적 캐릭터를 중복되지 않게 배치하는 것이 맞음 .

• 그리고 이 루틴은 AI 처리 루틴이 되므로 , 스크립팅 언어 embedded 로 작성하는 것이 옳을 것으로 보임 .

랜덤 시드 설정 . – srand()

캐릭터 위치설정 – 중복 방지

적 캐릭터의 위치 설정

주인공 캐릭터의 위치 설정

Step Out.

Page 11: Tales V 2.0 분석문서

Project : TalesCore File : TalesCore.cpp

*.fx 파일로부터 Effect 생성

지형 객체 초기화

Effect 로부터 테크닉 , 상수변수들 얻기

카메라 객체 초기화 ( WALKER )

월드 및 투사행렬 초기화

Mesh 및 애니메이션 리소스 초기화

스카이박스 객체 초기화

상수행렬 초기화사운드 매니저 객체 초기화

RenderState 객체 초기화 ( Game, Init )

“Init” Render State 로 전환

마우스 관리 객체 초기화 ( 640, 480 )

initFSM() : 캐릭터 생성 ( AI 처리 )

InitTalesGame() : 게임 객체 초기화

Step Out

Page 12: Tales V 2.0 분석문서

WinMain() : Program EntryProject : Tales File : main.cpp

Option 구조체 세팅

MessageLoop() : 게임 이벤트 루프

InitIlluminia() : 게임 엔진 초기화

InitTalesGame() : 게임 객체 초기화

ReleaseGame() : 게임 객체 릴리즈

ReleaseIlluminia() : 게임 엔진 릴리즈

Step In

• 게임 내의 모든 객체의 초기화가 끝남 .

• 이제 사용자 메시지 처리와게임 Render Loop 로 들어감 .

Page 13: Tales V 2.0 분석문서

MessageLoop() : 게임 이벤트 루프

현재 시간 얻기

• 메시지 및 렌더링 루프 .

• 각각 윈도우 메시지는 윈도우 프로시저에서 , 렌더링은 Render-State객체에서 처리 .

• 초기화면 RenderState : RenderInit게임화면 RenderState : Ren-derGame

Project : Illuminia File : Illuminia\ Illuminia.cpp

발생한 이벤트가 WM_QUIT 인가 ?

들어온 메시지가 있는가 ?

메시지 처리

Yes

No

renderState->Render() : 초기 or 게임 화면 렌더링

No

Yes

게임 종료

Step In

Page 14: Tales V 2.0 분석문서

렌더링 분기 1

RenderState = RenderInit( 초기화면 렌더링 )

Page 15: Tales V 2.0 분석문서

RenderInit->Render() : 초기화면 렌더링

Project : TalesCore File : RenderStates\ RenderInit.cpp

마우스 입력 받음

텍스쳐 읽어오기

입력 받은 좌표가 261 <= x <= 381 이고 204 <= y <= 249 일 경우

RenderState 를 RenderGame 으로 전환

텍스쳐를 back buffer 에 그림

Swap Chain 을 present

Step Out

• 최초로 게임이 로드되면 실행될 Render 함수 .

• ‘ 버튼이벤트’ 가 따로 없이 , 그냥 윈도우의특정 영역 선택으로 이후의 스테이트를 판정함 .

입력 받은 좌표가 261 <= x <= 381 이고 370<= y <= 416 일 경우

게임 종료

Yes

No

Yes

No

Page 16: Tales V 2.0 분석문서

렌더링 분기 2

RenderState = RenderGame( 게임화면 렌더링 )

Page 17: Tales V 2.0 분석문서

updateFSM() : 캐릭터 위치갱신

카메라 이동에 따라 좌표 , 뷰 행렬 갱신

카메라 조작 ( WSAD )

마우스 입력에 따라 카메라 조작 ( yaw, pitch)

월드행렬 갱신

지형 렌더링• 큰 문제는 발견되지 않음 .

RenderGame>Render() : 게임화면 렌더링

Project : TalesCore File : RenderStates\ RenderGame.cpp

캐릭터 렌더링

Swap Chain presentStep Out

Page 18: Tales V 2.0 분석문서

종료 분기 1

WM_QUIT 메시지 입력

Page 19: Tales V 2.0 분석문서

MessageLoop() : 게임 이벤트 루프

현재 시간 얻기

Project : Illuminia File : Illuminia\ Illuminia.cpp

발생한 이벤트가 WM_QUIT 인가 ?

들어온 메시지가 있는가 ?

메시지 처리

Yes

No

renderState->Render() : 초기 or 게임 화면 렌더링

No

Yes

게임 종료

Step Out

Page 20: Tales V 2.0 분석문서

종료 분기 2

초기화면에서 ‘종료’ 에 해당하는 좌표 클릭

Page 21: Tales V 2.0 분석문서

RenderInit->Render() : 초기화면 렌더링

Project : TalesCore File : RenderStates\ RenderInit.cpp

마우스 입력 받음

텍스쳐 읽어오기

입력 받은 좌표가 261 <= x <= 381 이고 204 <= y <= 249 일 경우

RenderState 를 RenderGame 으로 전환

텍스쳐를 back buffer 에 그림

Swap Chain 을 present

Step Out

입력 받은 좌표가 261 <= x <= 381 이고 370<= y <= 416 일 경우

게임 종료

Yes

No

Yes

No

Page 22: Tales V 2.0 분석문서

WinMain() : Program EntryProject : Tales File : main.cpp

Option 구조체 세팅

MessageLoop() : 게임 이벤트 루프

InitIlluminia() : 게임 엔진 초기화

InitTalesGame() : 게임 객체 초기화

ReleaseGame() : 게임 객체 릴리즈

ReleaseIlluminia() : 게임 엔진 릴리즈

Step In

• 게임 종료 이벤트 발생 ..

Page 23: Tales V 2.0 분석문서

ReleaseGame() : 게임 객체 릴리즈Project : TalesCore File : TalesCore.cpp

스카이 박스 반납

마우스 입력 객체 릴리즈

releaseFSM() : 적 캐릭터 객체 릴리즈

사운드 관리 객체 릴리즈

주인공 캐릭터 객체 릴리즈

Step Out

• InitTalesGame() 에서생성되었던 모든 객체들이 반납되지 않고 있음 .

Page 24: Tales V 2.0 분석문서

WinMain() : Program EntryProject : Tales File : main.cpp

Option 구조체 세팅

MessageLoop() : 게임 이벤트 루프

InitIlluminia() : 게임 엔진 초기화

InitTalesGame() : 게임 객체 초기화

ReleaseGame() : 게임 객체 릴리즈

ReleaseIlluminia() : 게임 엔진 릴리즈

Step In

Page 25: Tales V 2.0 분석문서

ReleaseIlluminia() : 게임 엔진 릴리즈

윈도우 클래스 unregister

Step Out

Project : Illuminia File : Illuminia\ Illuminia.cpp

Page 26: Tales V 2.0 분석문서

WinMain() : Program EntryProject : Tales File : main.cpp

Option 구조체 세팅

MessageLoop() : 게임 이벤트 루프

InitIlluminia() : 게임 엔진 초기화

InitTalesGame() : 게임 객체 초기화

ReleaseGame() : 게임 객체 릴리즈

ReleaseIlluminia() : 게임 엔진 릴리즈 Step Out

• 전체종료 .

• 게임 끝 .