100 likes | 398 Views
시간 , 자본 , 질 (Quality) 어떤 것에 집중 할 것인가 하나의 게임 제목과 유사한 모토를 정한다 . 중요한 일과 중요하지 않은 일을 구분 : 다른 파트와의 병목이 생기는 일 : 게임 진행에 큰 영향을 끼치는 일 : 질을 높이고 최적화 하는 일은 나중 : 간과하기 쉬운 스케줄 관리. 01. 게임 개발 프로세스의 균형.
E N D
시간, 자본, 질(Quality) 어떤 것에 집중 할 것인가 하나의 게임 제목과 유사한 모토를 정한다. 중요한 일과 중요하지 않은 일을 구분: 다른 파트와의 병목이 생기는 일: 게임 진행에 큰 영향을 끼치는 일: 질을 높이고 최적화 하는 일은 나중: 간과하기 쉬운 스케줄 관리 실용주의 게임 개발 01 게임 개발 프로세스의 균형
원화의 중요성: 참고 자료가 아닌 실제적인 소스로 활용해야 한다.: 원화와 모델링/매핑의 결과는 거의 동일해야 한다.: 그 자체로 유저들이 사고 싶은 것이 되어야 한다. 장인 정신: 고치고 또 고친다. 원활한 커뮤니케이션: 누구라도 그래픽, 기획, 프로그램에 대해 이야기 실용주의 게임 개발 02 퀄러티 높은 게임을 위하여
불평, 불만이 있는 팀원의 해결 빠른 프로토타입의 제작 적당한 압박과 관리 미리 형성된 커뮤니티 개발 홈페이지 많은 리소스가 소모되는 부분의 빠른 진행 확실하게 ‘티’ 내기 실용주의 게임 개발 03 수동을 능동으로
Gather, Read, Think …and Code 끝까지 책임을 가지고 완수하려는 책임감 유명한 알고리즘, 패턴 왜 쓰는지 알고 쓸 것 Data driven: 외부에서 수정 가능 남이 보기 쉬운 코드 (Naming, 일관성) 인터페이스의 활용 실용주의 게임 개발 04 프로그래머!?
인터페이스 클래스의 활용: 모듈은 변하더라도 외부 인터페이스는 수정될 필요가 없다.: 공통된 인터페이스를 쓰므로 통일감 있는 설계가 가능하고 가독성이 좋아지게 된다. C 언어로 개발 할 때는 함수 포인터를 활용 ITaskBase 인터페이스를 상속 받아서 실제 CTaskIntro, CTaskLogin, CTaskCharSelect 를 구현 ITaskBase 에는 Init, Update, Render 등의 순수 가상 함수가 선언되어 있다. : virtual BOOL Init() = 0;: virtual BOOL Update(FLOAT fDeltaTime) = 0;: virtual BOOL Render() = 0;: virtual VOID SetEnable(BOOL bEnable) = 0; ITaskMgr 에서 ITaskBase 를 리스트로 관리. Enable 플래그가 켜져 있는 경우에 Update 와 Render를 해주게 된다. : virtual BOOL Update(FLOAT fDeltaTime) = 0;: virtual BOOL Render() = 0;: virtual BOOL AttachTaskPost(IDKTask* pWork, CONST CHAR* szName) = 0; : virtual BOOL RemoveTaskPost(CONST CHAR* szName) = 0; 실용주의 게임 개발 05 Task 단위의 작업 동영상/인트로 로그인 케릭터 선택 로비 게임필드
실용주의 게임 개발 06 Node 단위의 장면 Tree • 특정 물체에 카메라를 붙인다든가, 칼에 파티클 을 붙인다든가, 움직이는 손에 라이트 를 붙이는 등의 작업이 자유롭다. • 특정 부모의 Node 를 전체적으로 움직이거나 숨기는 것이 쉬우며 관리가 편하다.
실용주의 게임 개발 07 Tips and Tricks • 헤더 파일에 다른 헤더파일을 포함시키는 것을 최소화 시키자.: class 를 미리 선언한다. class CCharacter; • XML 의 활용- 버젼업이 자유롭다. 어디라도 <>tag가 들어갈 수 있고 자신이 해석하지 못하는<>tag에 대해서는 그냥 넘어가기 때문. - 익스플로어만 실행시켜도 <>tag 에 대한 에러를 확인 할 수 있어 문법 검사가 쉬움. - 세계 공통적인 파일 포맷으로 여러가지 뷰어가 존재한다. (XMLSpy, XMLNotepad) - 계층 구조로 작업 하기가 편리하다. - 특별한 바이너리화 작업이 필요없다. • 간단한 설정은 ini 파일로 • PNT Vertex 32바이트: 알파 조정은SetRenderState( D3DRS_DIFFUSEMATERIALSOURCE , D3DMCS_MATERIAL ); • 텍스쳐 별 소트 : std::map<ITexture*, std::vector<RENDER_ELEMENT> > m_TexSortList • : 통합된 VB/IB 로 RenderState 의 횟수를 줄여준다. • 쉐이더 없이 그림자에 블러 주기: SetSamplerState( 0, DKSAMP_MIPMAPLODBIAS , *((DWORD*)&fBias)); • 쉐이더 없이 스펙큘러 흉내내기: 스피어 맵을 이용: SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACENORMAL );: SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATEALPHA_ADDCOLOR );: SetTextureStageState( 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );: matScaleBias._11 = 0.5 matScaleBias._22 = -0.5 matScaleBias._41 = 0.5 matScaleBias._42 = 0.5 : SetTransform( (D3DTS_TEXTURE0+1), &matScaleBias ); // -1.0~1.0 => 0.0~1.0 • 충돌 처리 슬라이딩 효과: 구와 삼각형의 충돌 (평면을 가지고 슬라이딩 되어질 위치를 찾는다): 안으로 들어가 버리는 경우의 처리 (델타 시간을 제한하거나 시간을 쪼개서 여러 번 계산한다): 슬라이딩 하려는 면에 장애물이 있을 시 (현재의 위치를 고수해준다)
june8036@tzsoft.co.kr추천 도서: 게임 프로그래머를 위한 C++추천 사이트: gamedev.net, gpgstudy.com 감사 합니다 실용주의 게임 개발