CHAPTER 00 머리말
01 이 책은 어떤 책인가
02 대상 독자
필요한 기술
03 필요한 준비
컴파일러와 운영체제
DirectX
CPU와 메모리
그래픽 하드웨어
그래픽과 음악 소재
04 이 책 진행 방법
05 이 책 학습 방법
06 예제 코드
소프트웨어 등 사용 허가서
Part I 2차원 게임
CHAPTER 01 처음 만드는 게임
1.1 퍼즐 게임을 만들자
예제
준비
메인 루프
처리 내용을 작성한다
검사
1.2 예제 코드
헤더 포함
스테이지 데이터 상수
열거형
함수 프로토타입
main 함수
스테이지 초기화
화면 그리기
갱신
클리어 판정
정리
1.3 스테이지 데이터를 읽자
준비
데이터 형식
스테이지 크기
오류 처리
예제 코드
1.4 C++ 보충
이름공간
템플릿
생성자와 소멸자
초기 설정
멤버함수에서 const
두 가지 delete
문자열 상수
1.5 팁: 플래그와 비트 연산
플래그
플래그 저장
계산으로 플래그를 추출하는 방법
곱셈 나눗셈과 시프트 연산
비트 연산을 사용한다
플래그를 온으로 하자
플래그를 오프로 하자
여러 플래그를 한 번에 조작한다
16진수
1.6 팁: 포인터와 메모리
메모리는 배열이다
포인터
포인터와 배열
0 포인터
포인터 형
new와 delete
배열과 new 차이
포인터 정리
1.7 팁: 참조
참조와 포인터
성능 향상을 위한 포인터와 참조
참조 문제점
참조 '반환'에 주의
1.8 정리
CHAPTER 02 점에서 시작하는 2D 그래픽
2.1 2D 그래픽
라이브러리
2.2 준비
라이브러리 경로를 설정한다
디버그와 릴리스
환경변수
멤버함수
앞 장에 cout, cin과의 차이
2.3 점을 찍자
예제 코드
2.4 배달맨을 이식한다
그래픽이 나오지 않는 배달맨 만들기
배달맨에 그래픽을 덧붙인다
그래픽을 확대한다
2.5 팁: 종료 처리
종료 처리용 함수
종료 처리가 필요한 이유
2.6 정리
CHAPTER 03 이미지 파일을 사용하자
3.1 파일에서 이미지를 읽는다
이미지 형식
DDS 이미지를 준비한다
DDS 구조를 조사한다
데이터를 추출하자
사각형 화면에 붙인다
이미지 일부를 잘라내자
배달맨에 적용하자
3.2 그래픽 버전인 배달맨 예제 코드
전체 구성
maincpp
Statecpp
Filecpp
Imagecpp
3.3 알파 채널을 사용한다
알파 테스트
배달맨에 도입한다
알파 블렌딩
배달맨에 적용하자
3.4 포함 관계 결정 방법
전통적인 방법
문제점은 무엇인가
정의와 선언
인클루드 가드
결국 어떻게 하면 되는가
헤더 인클루드를 생각하는 의미
3.5 팁: 알파 블렌딩 최적화
정수로 계산한다
시프트를 지우자
3.6 팁: 가산 블렌딩
3.7 정리
CHAPTER 04 실시간 게임
4.1 실시간 게임
어디를 수정해야 하는가
새로운 입력 함수: Framework::isKeyOn()
입력 페이스 조정
4.2 애니메이션을 만들자
4.3 애니메이션이 들어간 배달맨 예제 코드
Stateh
Statecpp
4.4 프레임 레이트를 구한다
프레임 레이트 계산
4.5 프레임 레이트 차이에 대응한다
프레임 레이트를 고정한다
unsigned 범위를 넘었을 때 대처
4.6 팁: 프레임 레이트에 맞게 게임 속도를 바꾸는 방법
좋은 점과 나쁜 점
만들어 본다
예제 코드
unsigned와 int
가변 프레임 레이트와 고정 프레임 레이트 비교
4.7 팁: 티어링 문제
티어링을 어떻게 잡을 수 있을까
4.8 정리
CHAPTER 05 간단한 시퀀스 전이
5.1 라이브러리 추가 기능
입력 취득 기능
프레임 레이트 관련 기능
편리한 매크로
5.2 단순한 방법
if 문으로 한다
switch 문을 사용한다
5.3 시퀀스를 늘리자
시퀀스 사양
이것은 간단한 과제인가
5.4 코드 검사
자원 로드와 해제에 관한 문제
시퀀스에 걸쳐 있는 자원 문제
계층 구조 시퀀스 전이
전이 트리거를 어디에 둘까
계층 간 이동
5.5 예제 코드
파일 배치
프로젝트 설정
클래스 구성
데이터 배치
maincpp
Sequence/Parenth
Sequence/Parentcpp
Game::Parent
1초 대기
몇 가지 기능 추가
stringstream
5.6 정리
CHAPTER 06 문자를 출력하는 방법
6.1 폰트용 이미지
6.2 문자 그리기 함수
ASCII 코드
6.3 사용하기 편하게
클래스화
배경을 투명하게 만들자
색을 바꾼다
표시 위치 지정
오류 검사
6.4 사용한다
6.5 예제 코드
싱글톤
6.6 저작권에 주의하자!
6.7 예제 라이브러리 기능
6.8 정리
CHAPTER 07 처음 시작하는 액션 게임
7.1 사용할 라이브러리
문자 그리기
난수
7.2 '폭탄맨'을 만들자
7.3 예제 코드
라이브러리를 대응시킨다
시퀀스만 만들어 보자
시퀀스만 추가한 예제 코드
7.4 일단 배경을 출력한다
이미지를 준비한다
State 클래스를 바꿔 쓴다
움직이지 않는 오브젝트 클래스를 정비한다
스테이지 형태
그리자
7.5 움직이는 오브젝트를 배치한다
움직이는 오브젝트 클래스
배치
움직이게 한다
7.6 드디어 게임을 하자
7.7 정리
CHAPTER 08 평면 충돌 처리
8.1 충돌 검출
정사각형 교차 판정
데이터 표현 방법
교차 판정 코드
8.2 충돌 응답
충돌하면 움직이지 않는다
충돌 직전에 멈춘다
이동시켜 처리한다
어느 방법이 좋을까
8.3 복수 충돌 문제
충돌하면 움직이지 않는다
충돌 직전에 멈춘다
겹쳐 있으면 이동시킨다
어느 것을 선택할 것인가
8.4 충돌 응답과 조작성
겉보기와 실체 크기를 다르게 한다
충돌하면 벽면을 따라 미끄러지게 한다
가로 이동과 세로 이동을 따로 다룬다
움직이는 캐릭터를 원형으로 한다
어느 방법을 택해야 하는가
8.5 움직이는 것끼리 충돌한다
8.6 폭탄맨 충돌 처리
DynamicObject 확장
움직이는 것끼리
움직이는 것과 움직이지 않는 것 판정
폭탄 설치 문제
연쇄 폭발
8.7 정리
CHAPTER 09 다양한 입력장치
9.1 입력장치 인스턴스 취득
9.2 키보드
9.3 마우스
9.4 조이스틱
9.5 폭탄맨을 조이스틱으로 조작한다
라이브러리를 은폐하는 것
예제 코드
9.6 정리
CHAPTER 10 좀 더 나은 시퀀스 전이
10.1 도대체 무엇이 문제였을까
10.2 상속을 사용한다
기반 클래스
파생 클래스
파생 클래스와 기저 크래스
가상 소멸자
10.3 실제로 사용하자
예제 코드
10.4 팁: 시퀀스 이동 코드를 짧게 한다
문제는 어디에 있는가
잘못된 분기를 바로잡는다
예제 코드
10.5 팁: 계층 간 시퀀스 이동 코드도 짧게 한다
dynamic cast
계층마다 기반 클래스를 다시 정의한다
예제 코드
이렇게까지 할 필요가 있을까
10.6 팁: 상속을 좀 더 자세히
상속을 흉내낸다
상속은 무엇을 희생하고 있는가
상속은 언제 사용해야 하는가
순수 가상 함수
10.7 정리
CHAPTER 11 소리를 내다
11.1 사운드 라이브러리
데시벨
예제 코드
11.2 팁: 컴퓨터에서 소리를 재생한다는 것
라이브러리
11.3 팁: 소리 높이와 크기
소리 높이
소리 크기
11.4 팁: 음색
11.5 팁: 소리 겹침
11.6 팁: 도레미 원리
도레미로 놀아보자
11.7 팁: 악보를 읽어 연주한다
예제 코드
11.8 팁: WAV 파일 읽기
WAV 파일 내용
11.9 팁: Sound 모듈을 사용한 웨이브 합성
11.10 정리
CHAPTER 12 회전, 확대, 이동
12.1 회전
좌표를 돌리는 간단한 방법
삼각함수
삼각함수를 사용해 회전시킨다
좀 더 나은 방법
12.2 벡터와 행렬 도입
벡터형 도입
행렬 도입
12.3 정점
12.4 확대·축소
코드로 만들자
12.5 확대·축소하면서 회전시킨다
코드로 만들자
12.6 행렬이 지닌 위력
이동을 행렬로 표현한다
확대·축소를 행렬로 나타낸다
복수 조작을 하나로 모은다
12.7 팁: 왜 이 공식으로 회전이 될까
12.8 팁: 제대로 돌려보자
래스터라이즈
12.9 팁: 수학 속 행렬
행렬과 벡터 곱
행렬과 행렬 곱
12.10 정리
CHAPTER 13 하드웨어 파워
13.1 사용할 라이브러리
13.2 그래픽 하드웨어로 삼격형을 그린다
흰색 삼각형을 그린다
색칠한 삼각형을 그린다
13.3 삼각형에 이미지를 붙인다
텍스처를 만든다
텍스처를 사용한다
텍스처 좌표
텍스처와 정점 병용
13.4 알파 블렌드
13.5 회전, 확대·축소, 이동
변환 순서를 생각한다
행렬을 사용해 drawTriangle2D()를 호출한다
13.6 폭탄맨을 이식한다
텍스처 잘라내기
예제 코드
13.7 정리
Part II 3차원 게임
14.1 라이브러리
텍스처 등록
14.2 3D 액션 게임 '로보 파이트'를 만들려면
로보 파이트에 필요한 것
14.3 삼각형을 그린다
14.4 가까운 쪽을 가까이에 그린다
반투명과 Z 버퍼법
14.5 멀리 있는 것을 작게 그리기
거리로 나눈다
직접 했을 때 문제점
그래픽 하드웨어를 이용하자
14.6 좌표 교환
좌표축 방향
z축을 반전한다
행렬과 벡터 확장
3차원 회전 행렬
어떻게 보이는지 생각한다
두 개 축 이상 회전이 필요할 때
뷰 변환 행렬
14.7 투시 변환도 행렬로
무엇을 하고 있었는지 떠올린다
또 하나 z 범위 변환
화각 도입
종횡비 보정
행렬 완성
모든 변환 합성
14.8 로보 파이트를 만들기 시작하자
클래스 설계
메인 루프
로보 클래스 선언
스테이지 클래스 선언
그림을 출력하는 경로를 생각한다
시점 조작과 투시 변환
로보를 출력하자
시점 이동을 만든다
로보를 움직인다
텍스처를 붙인다
시선 방향을 따라 이동 방향을 수정한다
14.9 팁: Z 버퍼 정밀도 문제
14.10 정리
CHAPTER 15 라이브러리 제작법
15.1 전체 설계
리소스와 인스턴스
15.2 리소스 내역
정점 버퍼 클래스
인덱스 버퍼 클래스
배치 클래스
그리기 인스턴스 클래스
리소스 컨테이너 클래스
카메라 클래스
15.3 사용해보자
15.4 파일에서 로드한다
너무 정직한 방법
XML처럼 만들자
유사 XML을 라이브러리에
15.5 팁: 라이브러리를 게임에서 분리한다
비주얼 스튜디오 프로젝트 설정
15.6 정리
CHAPTER 16 유사 XML 읽기
16.1 파일 형식을 결정한다
16.2 사전 준비
std::string
단순화
16.3 처리 흐름
Document 클래스
Element 클래스
16.4 문자열 해석
상태 전이 집합으로 분해한다
실제로 분해한다
16.5 코드로 만든다
16.6 사용해보자
필요한 함수
16.7 예제 코드
Texture 클래스
배치와 이름공간
추가에 관한 문제
문자열에서 수치로 변환
사용자 코드
16.8 팁: 쓰기
사용자가 코드를 작성한다
어트리뷰트 설정
추가
16.9 정리
CHAPTER 17 느리지 않은 코드를 작성하려면
17.1 알고리즘과 계산량 오더
간단한 예
계산량 오더
17.2 데이터 구조 기초
데이터 구조 성질
정렬되지 않은 배열
정렬되어 있는 배열
리스트
이진 트리
정렬된 이진 트리
조작을 제한한다
17.3 스루풋과 레이턴시
CPU 명령
더욱 큰 주제
17.4 병렬성
병렬화 비용
17.5 메모리 문제
메모리에 해당하는 레이턴시를 짧게 하는 두 가지 방법
모아서 처리하기
캐시에 대해 생각해보자
어떻게 하면 좋을까
17.6 STL과 데이터 구조
이터레이터
vector
list
set
map
포인터를 넣을까 실체를 넣을까
17.7 어디가 느린가
17.8 팁: 함수 호출에 걸리는 무게
클래스 간 처리 분담을 변경한다
호출 횟수를 줄인다
인라인화한다
17.9 팁: 빠른 계산과 느린 계산
나눗셈
17.10 정리
CHAPTER 18 입체 충돌 처리
18.1 직육면체 충돌 처리
응답 문제
예제 코드
직육면체로는 할 수 없는 일
18.2 부동 소수점 수를 사용한 충돌 검출
어떤 형상이 필요할까
구와 구 교차 판정
충돌 응답
내적과 각도
충돌 응답으로 돌아가서
복수 충돌
지면에 똑바로 서고 싶다
18.3 삼각형과 선분 교차 판정
기하학 형상 표현 방법
연립방정식으로 한 번에 구하는 방법
두 단계로 판정한다
외적과 법선
t를 구한다
삼각형 안에 있는가
코드로 만든다
18.4 실용적인가
이음새 문제
18.5 남겨진 문제
속도 문제
응답 문제
계산 정밀도 문제
18.6 정리
CHAPTER 19 로보 파이트 설계
19.1 시퀀스 전이
19.2 조작계
이동
점프
선회
무기 발사
예제 코드
19.3 총을 쏘다
탄환 클래스
탄환 데이터 구조
유도탄
예제 코드
19.4 하나로 모은다
추가 요소
예제 코드
19.5 프론트엔드
카메라와 관계없는 그래픽
예제 코드
19.6 여전히 부족한 것
19.7 정리
CHAPTER 20 빛이 닿는다는 것
20.1 물체가 보인다는 것
레이 트레이스
무리한 레이 트레이스
간략화
20.2 빛이 감소하는 과정
태양에서 물체까지
면 각도
반사하는 비율
물체에서 카메라까지
20.3 계산하자
실제로 계산하는 식을 세운다
속임수를 쓰다
색에 대한 이야기
예제 코드
20.4 로보 파이트에 넣자
20.5 팁: 속도 개선 힌트
로컬 좌표로 계산한다
법선을 미리 준비한다
정점에 법선을 연결한다
예제 코드
20.6 팁: 조금 더 나은 그림을 만들려면
20.7 정리
CHAPTER 21 캐릭터가 움직이기 시작한다
21.1 상대 이동
초보자 애니메이션
상대 이동 개념
복수 좌표계
좌표계 이동
행렬 합성
태양계 구현
하루와 한달
21.2 계층 모델 클래스
Node 클래스
21.3 자동으로 트리 구조 구축
데이터 파일에 친자 관계를 기술한다
Tree 클래스
초기값도 파일에 넣는다
노드와 트리 리소스화
노드 정의
21.4 애니메이션 데이터화
데이터화 실현
애니메이션 데이터 세부 사항
예제 코드
21.5 보간법
1차 함수 보간
2차 함수 보간
미분
다시 2차 함수 보간으로
3차 함수 보간
기울기를 주고 보간한다
3차 함수 보간 코드
21.6 로보 파이트에 넣는다
21.7 팁: 연립방정식 vs 정해진 기울기
21.8 팁: 부족한 것
애니메이션 전환
정점 블렌딩
IK
깨끗한 회전 보간
21.9 정리
Part III 판매용 제품으로 가는 길
22.1 전체 검사를 하면 속도가 느리다
22.2 속도를 개선할 때 기본
두 가지 아이디어
충돌 검출은 '검색'이다
22.3 정렬에 바탕을 둔 방법
아주 단순한 방법
양 끝을 정렬한다
만난 사람 리스트
코드로 만든다
조금씩 개량
정렬에 의한 방법을 사용할 때 약점
22.4 분할에 의한 방법
균등 분할
std::list를 사용해서 만든다
개수를 정해서 배열로 만들자
균등 공간 분할을 사용할 때 약점
균등 공간 분할 용도
22.5 팁: 균등 분할을 추가로 개량
조금씩 new하면서 용량 제한을 없앤다
list 자체를 줄인다
더욱 빠르게 한다
22.6 팁: 고도의 공간 분할
k-d tree를 만든다
예제 코드
k-d tree 용도
22.7 정리
CHAPTER 23 로딩
23.1 왜 로딩 시간이 길어지는가
23.2 파일 로더 클래스
일단 사용 방식을 정하자
예제 코드
우선 한 프레임에 한 파일로 한다
한 프레임에 정해진 양만 로드한다
23.3 파일 결합에 의한 속도 개선
파일 결합 전략
파일 결합은 언제 해야 하는가
읽기 프로그램
파일을 열거한다
Archiver1 예제를 사용한다
읽는 쪽
23.4 압축에 의한 속도 개선
압축 종류
연장 압축
사전 압축
실제 사용을 고려한다
23.5 팁: 멀티 스레드에 의한 비동기 처리
스레드 만들기
공유 자원 문제
공유 자원에는 자물쇠를 걸자
Mutex를 사용한다
메모리에 정말로 쓰고 있는가
스레드 세이프
로더를 멀티 스레드화한다
23.6 팁: 부호화
부호화 예
부호화 사용 방법
23.7 팁: 내부를 감추기 위한 결합과 압축
23.8 정리
CHAPTER 24 float 사용 방법
24.1 자릿수에 한계가 있다는 것
24.2 float 내부
float 읽는 법
float 정밀도
24.3 어중간한 수에 의한 오차
24.4 어느 정도 오차가 나는가
덧셈
뺄셈
곱셈과 나눗셈
상대오차는 어느 정도일까
24.5 오차 길들이기
계산 순서를 바꿔서 회피한다
다항식
계산 횟수를 줄인다
= =와 ! =를 사용하지 않는다
큰 값을 넣지 않는다
뺀 것으로 나눈다
대소 판정
10과 1f
24.6 특별한 수
제로
무한대
비수
오류를 찾는 방법
비정규수
24.7 정리
CHAPTER 25 부속 라이브러리 사양
25.1 라이브러리 클래스
싱글톤
실체가 따로 있는 클래스
보통 클래스
25.2 시작 환경 설정
파일을 로드한다
명령창 문자열
모니터 갱신 주기를 사용하는 고정 프레임 레이트(수직 동기)
25.3 Framework 모듈
DebugScreen 클래스
25.4 WindowCreator 모듈
25.5 FileIO 모듈
아카이브 사용법
25.6 Base 모듈
25.7 Math 모듈
Random 클래스
각도 단위
25.8 Threading 모듈
Thread
Semaphore
Mutex
Event
getCurrentThreadId()
스레드 수
25.9 Input 모듈
25.10 Sound 모듈
25.11 PseudoXml 모듈
25.12 Graphics 모듈
대략적인 사용 방법
DrawCube 예제
25.13 Scene 모듈
PrimitiveRenderer
StringRenderer
Collisonmesh
CollisonDetctor
25.14 안티앨리어싱
25.15 최종 버전 라이브러리에 로보 파이트를 이식한다
25.16 X 파일
25.17 정리
CHAPTER 26 버그와 친해지는 법
26.1 불조심과 불끄기
26.2 버그 종류
논리 버그
기술 버그
처리 지연
메모리 오버플로우
26.3 예방 혹은 불조심
배열 범위 오류
해제된 포인터에 접근
초기화되지 않은 포인터 접근
위험한 함수를 무분별하게 사용
std::vector를 무분별하게 사용
메모리 해제 잊음
포인터를 추방한다
GameLib의 클래스
코딩 스타일
26.4 치료 혹은 소화
'분할' 응용
기본은 이진 검색
뒤로 미루지 않는다
시제품은 버려라
메모리 누수 검출
26.5 로보 파이트 안전 사양
26.6 팁: 메모리 누수 검출 내부
new 내부
delete 내부
정보를 늘린다
파일 이름과 줄 번호
26.7 정리
CHAPTER 27 더욱 앞으로
27.1 무엇을 배우면 좋을까
27.2 도구
명령창 도구
GUI 도구
27.3 AI
27.4 네트워크
27.5 셰이더
27.6 참고문헌
수학과 계산기 과학
프로그래밍
물리학
컴퓨터 그래픽
27.7 이런 책이 있었으면
게임을 소재로 한 프로그래밍 책
게임을 소재로 한 물리와 수학책
누군가 써 주기를