[Gpg1권 박민근] 1.0 1.4 요약 정리
-
Upload
mingeun-park -
Category
Documents
-
view
591 -
download
0
Transcript of [Gpg1권 박민근] 1.0 1.4 요약 정리
1.0 데이터 주도적 설계의 마법1.1 객체 지향적 프로그래밍과 설계 기법1.3 자동적인 단일체 유틸리티
데브루키 – GPG 스터디 박민근2010.03.27
1.0 데이터 주도적 설계의 마법
기본
Data Driven Design 게임 데이터는 당연히 코드 외부에서
로드되어야 한다 . 개발중에는 XML 과 같은 텍스트 파일로
작업하고 , 실제 배포시에는 이진 파일을 사용한다 .
개발중에는 텍스트 파일을 사용해야 편집 /수정이 가능하다 .
최소한의 원칙
상수들을 하드코딩해서는 안된다 !!
하드코딩을 아예 없애라
“ 아예 없애라” – 농담이 아님
기획자와 디자이너가 프로그래머 자리에 오지
않도록 만들어라
게임을 데이터를 최대한 추상화 시켜라 !
게임의 흐름은 스크립트로 제어할것
연출 , 이벤트의 발생 조건 , 원인 – 결과
로직 , 퀘스트 등은 스크립트로 제어
적절한 스크립트 언어를 선택하라 . 이왕이면
컴파일 가능한 스크립트 언어로
스크립트 남용의 해악
게임 디자이너가 스크립트 작성자가 게임
프로그래밍을 하도록 해서는 안된다 – 스크립트의
비율이 프로그래밍보다 많아지면 안된다
과유불급
스크립트는 C++ 보다 디버깅이 어렵다
데이터의 중복을 피해라
여러곳에 사용되는 데이터를 하나로 모아라
데이터에 상속 구조를 적용해 보아라 .
데이터를 만들어 내는 도구를 작성할 것
텍스트 파일이 작성하기에 너무 큰경우 , 툴을
만드는 것이 훨씬 효율적이다 .
좋은 예제
워크래프트 3 – 맵툴 스타크래프트 – 유즈맵 WoW – 플러그인 , UI
1.1 객체 지향적 프로그래밍과 설계 기법
코딩 스타일
헝가리언 표기법
제일 중요한것은 팀내에 코딩 규약을 반드시
정해야 하고 , 그 규약에 통일된 코딩을
해야만 한다 !
클래스 설계
통일된 매서드의 명명 규칙을 사용한다 .
생성자와 소멸자에서 생성 / 소멸 메소드를
호출하는 구조로 작성하면 유연성이 높아진다 .
클래스 계통 구조의 설계
포함과 상속을 사용할 곳을 정확히 구별해야 한다 .
Is – a 관계가 성립되지 않는 다면 , 무조건 포함을 사용해야 한다 .
포함을 사용할곳에 단지 편의를 위해서 상속을 사용하면 안된다 !!
상속보다는 포함이 낫다 ( 래핑 )
설계 패턴들
싱글톤 패턴
퍼사드 패턴
상태 패턴 (FSM)
팩토리 패턴
1.3 자동적인 단일체 유틸리티
싱글톤의 정의
클래스의 인스턴스가 단 하나만 존재하는 것을 보장
전역 객체 처럼 사용 할 수 있음
매니저 클래스들 , 리소스 관리 클래스등 , 사운드
관리 , 게임 프레임워크 등 전반적으로 사용
싱글톤의 장점
코드의 가독성 관점에서 명료하다 전역 객체처럼 간단히 사용할 수 있다 객체의 생성 , 접근 , 해제 시점을 제어 할 수
있다 .
일반 전역 객체와의 차이
전역 객체 – 생성 , 해제 , 접근 시점을 제어할 수 없다 . 가독성이 떨어진다 . 위험하다 .
싱글톤 패턴은 위 문제를 해결할 수 있다 . 원하는 시기에 생성 / 해제 할 수 있으며 , 접근
함수를 통해서 접근 시점을 제어할 수 있다 .
전통적인 해결책SingleTon& GetSingle-Ton(){ static T SingleTon; return T;}생성 시점은 제어할 수 있지만 ,
해제 시점은 제어할 수 없다 .
더 나은 방식class CTextureMgr{ static CTextureMgr* m_Instance;
public: CTextureMgr() {m_Instance = this;} ~CTextureMgr() {m_Instance = NULL;}
static CTextureMgr& GetInstance() {return *m_Instance;}}
// 사용CTextureMgr::GetInstance().Method();
하지만 , 모든 싱글톤 클래스에 추가 코드가 들어가야 한다 .
좀더 나은 방식template<typename T>class ISingleTon{ static T* m_instance;
public: ISingleTon() { int offset = (int)(T*)1 - (int)(ISingleTon<T>*)(T*)1; m_instance = (T*)((int)this + offset); } ~ISingleTon() {m_instance = NULL;} static T& GetSingleton() {return *m_instance;}}
템플릿을 상속 받아 하위 클래스에서 자동으로 싱글톤이 생성되게 한다 .다중 상속 구조가 되는 경우가 있기 때문에 Offset 을 계산해서 할당한다 .