목차 일부
지은이의 말 ... 4
옮긴이의 말 ... 5
CHAPTER 00 머리말
01 이 책은 어떤 책인가 ... 36
02 대상 독자 ... 36
필요한 기술 ... 37
03 필요한 준비 ... 38
컴파일러와 운영체제 ... 39
DirectX ... 40
CPU와 메모리 ... 40
그래...
더보기
목차 전체
지은이의 말 ... 4
옮긴이의 말 ... 5
CHAPTER 00 머리말
01 이 책은 어떤 책인가 ... 36
02 대상 독자 ... 36
필요한 기술 ... 37
03 필요한 준비 ... 38
컴파일러와 운영체제 ... 39
DirectX ... 40
CPU와 메모리 ... 40
그래픽 하드웨어 ... 40
그래픽과 음악 소재 ... 40
04 이 책 진행 방법 ... 41
05 이 책 학습 방법 ... 42
06 예제 코드 ... 42
소프트웨어 등 사용 허가서 ... 43
Part Ⅰ 2차원 게임
CHAPTER 01 처음 만드는 게임
1.1. 퍼즐 게임을 만들자 ... 48
예제 ... 48
준비 ... 50
메인 루프 ... 52
처리 내용을 작성한다 ... 53
검사 ... 53
1.2. 예제 코드 ... 54
헤더 포함 ... 54
스테이지 데이터 상수 ... 54
열거형 ... 55
함수 프로토타입 ... 56
main 함수 ... 56
스테이지 초기화 ... 58
화면 그리기 ... 60
갱신 ... 61
클리어 판정 ... 65
정리 ... 66
1.3. 스테이지 데이터를 읽자 ... 66
준비 ... 67
데이터 형식 ... 68
스테이지 크기 ... 69
오류 처리 ... 71
예제 코드 ... 72
1.4. C++ 보충 ... 73
이름공간 ... 73
템플릿 ... 74
생성자와 소멸자 ... 75
초기 설정 ... 76
멤버함수에서 const ... 78
두 가지 delete ... 79
문자열 상수 ... 80
1.5. 팁: 플래그와 비트 연산 ... 82
플래그 ... 82
플래그 저장 ... 82
계산으로 플래그를 추출하는 방법 ... 83
곱셈 나눗셈과 시프트 연산 ... 85
비트 연산을 사용한다 ... 87
플래그를 온으로 하자 ... 88
플래그를 오프로 하자 ... 89
여러 플래그를 한 번에 조작한다 ... 90
16진수 ... 92
1.6. 팁: 포인터와 메모리 ... 93
메모리는 배열이다 ... 93
포인터 ... 94
포인터와 배열 ... 97
0 포인터 ... 99
포인터 형 ... 100
new와 delete ... 101
배열과 new 차이 ... 102
포인터 정리 ... 103
1.7. 팁: 참조 ... 103
참조와 포인터 ... 104
성능 향상을 위한 포인터와 참조 107
참조 문제점 ... 108
참조 '반환'에 주의 ... 110
1.8. 정리 ... 112
CHAPTER 02 점에서 시작하는 2D 그래픽
2.1. 2D 그래픽 ... 114
라이브러리 ... 114
2.2. 준비 ... 116
라이브러리 경로를 설정한다 ... 117
디버그와 릴리스 ... 118
환경변수 ... 119
멤버함수 ... 120
앞 장에 cout, cin과의 차이 ... 120
2.3. 점을 찍자 ... 121
예제 코드 ... 122
2.4. 배달맨을 이식한다 ... 122
그래픽이 나오지 않는 배달맨 만들기 ... 123
배달맨에 그래픽을 덧붙인다 ... 124
그래픽을 확대한다 ... 125
2.5. 팁: 종료 처리 ... 127
종료 처리용 함수 ... 128
종료 처리가 필요한 이유 ... 129
2.6. 정리 ... 130
CHAPTER 03 이미지 파일을 사용하자
3.1 파일에서 이미지를 읽는다 ... 132
이미지 형식 ... 132
DDS 이미지를 준비한다 ... 133
DDS 구조를 조사한다 ... 133
데이터를 추출하자 ... 139
사각형 화면에 붙인다 ... 140
이미지 일부를 잘라내자 ... 141
배달맨에 적용하자 ... 142
3.2. 그래픽 버전인 배달맨 예제 코드 ... 145
전체 구성 ... 145
maincpp ... 146
Statecpp ... 147
Filecpp ... 148
Imagecpp ... 148
3.3. 알파 채널을 사용한다 ... 149
알파 테스트 ... 149
배달맨에 도입한다 ... 153
알파 블렌딩 ... 155
배달맨에 적용하자 ... 158
3.4. 포함 관계 결정 방법 ... 158
전통적인 방법 ... 158
문제점은 무엇인가 ... 159
정의와 선언 ... 160
인클루드 가드 ... 162
결국 어떻게 하면 되는가 ... 163
헤더 인클루드를 생각하는 의미 ... 163
3.5. 팁: 알파 블렌딩 최적화 ... 164
정수로 계산한다 ... 164
시프트를 지우자 ... 166
3.6. 팁: 가산 블렌딩 ... 167
3.7. 정리 ... 169
CHAPTER 04 실시간 게임
4.1. 실시간 게임 ... 172
어디를 수정해야 하는가 ... 172
새로운 입력 함수: Framework::isKeyOn() ... 173
입력 페이스 조정 ... 174
4.2. 애니메이션을 만들자 ... 177
4.3. 애니메이션이 들어간 배달맨 예제 코드 ... 177
Stateh ... 177
Statecpp ... 179
4.4. 프레임 레이트를 구한다 ... 185
프레임 레이트 계산 ... 185
4.5. 프레임 레이트 차이에 대응한다 ... 187
프레임 레이트를 고정한다 ... 187
unsigned 범위를 넘었을 때 대처 ... 190
4.6. 팁: 프레임 레이트에 맞게 게임 속도를 바꾸는 방법 ... 191
좋은 점과 나쁜 점 ... 191
만들어 본다 ... 192
예제 코드 ... 192
unsigned와 int ... 194
가변 프레임 레이트와 고정 프레임 레이트 비교 ... 196
4.7. 팁: 티어링 문제 ... 197
티어링을 어떻게 잡을 수 있을까 ... 198
4.8. 정리 ... 199
CHAPTER 05 간단한 시퀀스 전이
5.1. 라이브러리 추가 기능 ... 202
입력 취득 기능 ... 202
프레임 레이트 관련 기능 ... 202
편리한 매크로 ... 203
5.2. 단순한 방법 ... 207
if 문으로 한다 ... 207
switch 문을 사용한다 ... 208
5.3. 시퀀스를 늘리자 ... 210
시퀀스 사양 ... 210
이것은 간단한 과제인가 ... 212
5.4. 코드 검사 ... 213
자원 로드와 해제에 관한 문제 ... 213
시퀀스에 걸쳐 있는 자원 문제 ... 214
계층 구조 시퀀스 전이 ... 214
전이 트리거를 어디에 둘까 ... 216
계층 간 이동 ... 219
5.5. 예제 코드 ... 222
파일 배치 ... 222
프로젝트 설정 ... 223
클래스 구성 ... 223
데이터 배치 ... 224
maincpp ... 225
Sequence/Parenth ... 225
Sequence/Parentcpp ... 226
Game::Parent ... 229
1초 대기 ... 230
몇 가지 기능 추가 ... 230
stringstream ... 232
5.6. 정리 ... 233
CHAPTER 06 문자를 출력하는 방법
6.1. 폰트용 이미지 ... 236
6.2. 문자 그리기 함수 ... 236
ASCII 코드 ... 237
6.3. 사용하기 편하게 ... 240
클래스화 ... 240
배경을 투명하게 만들자 ... 240
색을 바꾼다 ... 240
표시 위치 지정 ... 241
오류 검사 ... 242
6.4. 사용한다 ... 242
6.5. 예제 코드 ... 244
싱글톤 ... 244
6.6. 저작권에 주의하자! ... 249
6.7. 예제 라이브러리 기능 ... 250
6.8. 정리 ... 251
CHAPTER 07 처음 시작하는 액션 게임
7.1. 사용할 라이브러리 ... 254
문자 그리기 ... 254
난수 ... 254
7.2. '폭탄맨'을 만들자 ... 255
7.3. 예제 코드 ... 256
라이브러리를 대응시킨다 ... 257
시퀀스만 만들어 보자 ... 257
시퀀스만 추가한 예제 코드 ... 262
7.4. 일단 배경을 출력한다 ... 263
이미지를 준비한다 ... 264
State 클래스를 바꿔 쓴다 ... 264
움직이지 않는 오브젝트 클래스를 정비한다 ... 266
스테이지 형태 ... 267
그리자 ... 271
7.5. 움직이는 오브젝트를 배치한다 ... 274
움직이는 오브젝트 클래스 ... 274
배치 ... 277
움직이게 한다 ... 279
7.6. 드디어 게임을 하자 ... 280
7.7. 정리 ... 281
CHAPTER 08 평면 충돌 처리
8.1. 충돌 검출 ... 284
정사각형 교차 판정 ... 284
데이터 표현 방법 ... 285
교차 판정 코드 ... 285
8.2. 충돌 응답 ... 286
충돌하면 움직이지 않는다 ... 287
충돌 직전에 멈춘다 ... 287
이동시켜 처리한다 ... 289
어느 방법이 좋을까 ... 293
8.3. 복수 충돌 문제 ... 294
충돌하면 움직이지 않는다 ... 294
충돌 직전에 멈춘다 ... 294
겹쳐 있으면 이동시킨다 ... 294
어느 것을 선택할 것인가 ... 295
8.4. 충돌 응답과 조작성 ... 295
겉보기와 실체 크기를 다르게 한다 ... 296
충돌하면 벽면을 따라 미끄러지게 한다 ... 296
가로 이동과 세로 이동을 따로 다룬다 ... 297
움직이는 캐릭터를 원형으로 한다 ... 298
어느 방법을 택해야 하는가 ... 299
8.5. 움직이는 것끼리 충돌한다 ... 299
8.6. 폭탄맨 충돌 처리 ... 300
DynamicObject 확장 ... 300
움직이는 것끼리 ... 300
움직이는 것과 움직이지 않는 것 판정 ... 301
폭탄 설치 문제 ... 301
연쇄 폭발 ... 302
8.7. 정리 ... 303
CHAPTER 09 다양한 입력장치
9.1. 입력장치 인스턴스 취득 ... 306
9.2. 키보드 ... 307
9.3. 마우스 ... 308
9.4. 조이스틱 ... 309
9.5. 폭탄맨을 조이스틱으로 조작한다 ... 310
라이브러리를 은폐하는 것 ... 311
예제 코드 ... 312
9.6. 정리 ... 313
CHAPTER 10 좀 더 나은 시퀀스 전이
10.1. 도대체 무엇이 문제였을까 ... 316
10.2. 상속을 사용한다 ... 317
기반 클래스 ... 317
파생 클래스 ... 318
파생 클래스와 기저 크래스 ... 319
가상 소멸자 ... 320
10.3. 실제로 사용하자 ... 321
예제 코드 ... 323
10.4. 팁: 시퀀스 이동 코드를 짧게 한다 ... 325
문제는 어디에 있는가 ... 326
잘못된 분기를 바로잡는다 ... 326
예제 코드 ... 327
10.5. 팁: 계층 간 시퀀스 이동 코드도 짧게 한다 ... 329
dynamic cast ... 331
계층마다 기반 클래스를 다시 정의한다 ... 331
예제 코드 ... 333
이렇게까지 할 필요가 있을까 ... 334
10.6. 팁: 상속을 좀 더 자세히 ... 335
상속을 흉내낸다 ... 336
상속은 무엇을 희생하고 있는가 ... 338
상속은 언제 사용해야 하는가 ... 339
순수 가상 함수 ... 341
10.7. 정리 ... 343
CHAPTER 11 소리를 내다
11.1. 사운드 라이브러리 ... 346
데시벨 ... 347
예제 코드 ... 347
11.2. 팁: 컴퓨터에서 소리를 재생한다는 것 ... 348
라이브러리 ... 349
11.3. 팁: 소리 높이와 크기 ... 350
소리 높이 ... 350
소리 크기 ... 351
11.4. 팁: 음색 ... 351
11.5. 팁: 소리 겹침 ... 353
11.6. 팁: 도레미 원리 ... 354
도레미로 놀아보자 ... 354
11.7. 팁: 악보를 읽어 연주한다 ... 356
예제 코드 ... 356
11.8. 팁: WAV 파일 읽기 ... 358
WAV 파일 내용 ... 359
11.9. 팁: Sound 모듈을 사용한 웨이브 합성 ... 360
11.10. 정리 ... 360
CHAPTER 12 회전, 확대, 이동
12.1. 회전 ... 362
좌표를 돌리는 간단한 방법 ... 363
삼각함수 ... 366
삼각함수를 사용해 회전시킨다 ... 371
좀 더 나은 방법 ... 376
12.2. 벡터와 행렬 도입 ... 379
벡터형 도입 ... 379
행렬 도입 ... 383
12.3. 정점 ... 386
12.4. 확대ㆍ축소 ... 396
코드로 만들자 ... 397
12.5. 확대ㆍ축소하면서 회전시킨다 ... 399
코드로 만들자 ... 400
12.6. 행렬이 지닌 위력 ... 401
이동을 행렬로 표현한다 ... 402
확대ㆍ축소를 행렬로 나타낸다 ... 404
복수 조작을 하나로 모은다 ... 405
12.7. 팁: 왜 이 공식으로 회전이 될까 ... 411
12.8. 팁: 제대로 돌려보자 ... 414
래스터라이즈 ... 415
12.9. 팁: 수학 속 행렬 ... 416
행렬과 벡터 곱 ... 416
행렬과 행렬 곱 ... 418
12.10. 정리 ... 422
CHAPTER 13 하드웨어 파워
13.1. 사용할 라이브러리 ... 424
13.2. 그래픽 하드웨어로 삼격형을 그린다 ... 424
흰색 삼각형을 그린다 ... 425
색칠한 삼각형을 그린다 ... 426
13.3. 삼각형에 이미지를 붙인다 ... 427
텍스처를 만든다 ... 427
텍스처를 사용한다 ... 428
텍스처 좌표 ... 429
텍스처와 정점 병용 ... 430
13.4. 알파 블렌드 ... 431
13.5 회전, 확대ㆍ축소, 이동 ... 432
변환 순서를 생각한다 ... 432
행렬을 사용해 drawTriangle2D()를 호출한다 ... 435
13.6. 폭탄맨을 이식한다 ... 436
텍스처 잘라내기 ... 436
예제 코드 ... 437
13.7. 정리 ... 440
Part Ⅱ 3차원 게임
CHAPTER 14 입체를 그리자
14.1. 라이브러리 ... 444
텍스처 등록 ... 444
14.2. 3D 액션 게임 '로보 파이트'를 만들려면 ... 445
로보 파이트에 필요한 것 ... 445
14.3. 삼각형을 그린다 ... 446
14.4. 가까운 쪽을 가까이에 그린다 ... 448
반투명과 Z 버퍼법 ... 451
14.5. 멀리 있는 것을 작게 그리기 ... 453
거리로 나눈다 ... 454
직접 했을 때 문제점 ... 460
그래픽 하드웨어를 이용하자 ... 462
14.6. 좌표 교환 ... 465
좌표축 방향 ... 465
z축을 반전한다 ... 466
행렬과 벡터 확장 ... 467
3차원 회전 행렬 ... 472
어떻게 보이는지 생각한다 ... 476
두 개 축 이상 회전이 필요할 때 ... 479
뷰 변환 행렬 ... 482
14.7. 투시 변환도 행렬로 ... 483
무엇을 하고 있었는지 떠올린다 ... 483
또 하나 z 범위 변환 ... 485
화각 도입 ... 486
종횡비 보정 ... 488
행렬 완성 ... 488
모든 변환 합성 ... 489
14.8. 로보 파이트를 만들기 시작하자 ... 491
클래스 설계 ... 491
메인 루프 ... 491
로보 클래스 선언 ... 491
스테이지 클래스 선언 ... 494
그림을 출력하는 경로를 생각한다 ... 494
시점 조작과 투시 변환 ... 496
로보를 출력하자 ... 497
시점 이동을 만든다 ... 501
로보를 움직인다 ... 503
텍스처를 붙인다 ... 505
시선 방향을 따라 이동 방향을 수정한다 ... 507
14.9. 팁: Z 버퍼 정밀도 문제 ... 509
14.10. 정리 ... 513
CHAPTER 15 라이브러리 제작법
15.1. 전체 설계 ... 516
리소스와 인스턴스 ... 516
15.2. 리소스 내역 ... 518
정점 버퍼 클래스 ... 518
인덱스 버퍼 클래스 ... 519
배치 클래스 ... 520
그리기 인스턴스 클래스 ... 522
리소스 컨테이너 클래스 ... 526
카메라 클래스 ... 528
15.3. 사용해보자 ... 529
15.4. 파일에서 로드한다 ... 531
너무 정직한 방법 ... 531
XML처럼 만들자 ... 532
유사 XML을 라이브러리에 ... 534
15.5. 팁: 라이브러리를 게임에서 분리한다 ... 535
비주얼 스튜디오 프로젝트 설정 ... 536
15.6. 정리 ... 545
CHAPTER 16 유사 XML 읽기
16.1. 파일 형식을 결정한다 ... 548
16.2. 사전 준비 ... 549
std::string ... 550
단순화 ... 551
16.3. 처리 흐름 ... 553
Document 클래스 ... 553
Element 클래스 ... 554
16.4. 문자열 해석 ... 556
상태 전이 집합으로 분해한다 ... 556
실제로 분해한다 ... 557
16.5. 코드로 만든다 ... 559
16.6. 사용해보자 ... 562
필요한 함수 ... 562
16.7. 예제 코드 ... 566
Texture 클래스 ... 566
배치와 이름공간 ... 567
추가에 관한 문제 ... 567
문자열에서 수치로 변환 ... 569
사용자 코드 ... 571
16.8. 팁: 쓰기 ... 572
사용자가 코드를 작성한다 ... 572
어트리뷰트 설정 ... 574
추가 ... 575
16.9. 정리 ... 576
CHAPTER 17 느리지 않은 코드를 작성하려면
17.1. 알고리즘과 계산량 오더 ... 578
간단한 예 ... 578
계산량 오더 ... 580
17.2. 데이터 구조 기초 ... 682
데이터 구조 성질 ... 583
정렬되지 않은 배열 ... 583
정렬되어 있는 배열 ... 585
리스트 ... 588
이진 트리 ... 592
정렬된 이진 트리 ... 593
조작을 제한한다 ... 597
17.3. 스루풋과 레이턴시 ... 598
CPU 명령 ... 599
더욱 큰 주제 ... 601
17.4. 병렬성 ... 601
병렬화 비용 ... 602
17.5. 메모리 문제 ... 602
메모리에 해당하는 레이턴시를 짧게 하는 두 가지 방법 ... 604
모아서 처리하기 ... 605
캐시에 대해 생각해보자 ... 606
어떻게 하면 좋을까 ... 610
17.6. STL과 데이터 구조 ... 612
이터레이터 ... 613
vector ... 614
list ... 615
set ... 615
map ... 616
포인터를 넣을까 실체를 넣을까 ... 617
17.7. 어디가 느린가 ... 620
17.8. 팁: 함수 호출에 걸리는 무게 ... 621
클래스 간 처리 분담을 변경한다 ... 622
호출 횟수를 줄인다 ... 623
인라인화한다 ... 624
17.9. 팁: 빠른 계산과 느린 계산 ... 627
나눗셈 ... 627
17.10. 정리 ... 629
CHAPTER 18 입체 충돌 처리
18.1. 직육면체 충돌 처리 ... 632
응답 문제 ... 633
예제 코드 ... 634
직육면체로는 할 수 없는 일 ... 636
18.2. 부동 소수점 수를 사용한 충돌 검출 ... 637
어떤 형상이 필요할까 ... 637
구와 구 교차 판정 ... 637
충돌 응답 ... 641
내적과 각도 ... 643
충돌 응답으로 돌아가서 ... 646
복수 충돌 ... 646
지면에 똑바로 서고 싶다 ... 648
18.3. 삼각형과 선분 교차 판정 ... 649
기하학 형상 표현 방법 ... 649
연립방정식으로 한 번에 구하는 방법 ... 651
두 단계로 판정한다 ... 653
외적과 법선 ... 654
t를 구한다 ... 655
삼각형 안에 있는가 ... 656
코드로 만든다 ... 660
18.4. 실용적인가 ... 662
이음새 문제 ... 663
18.5. 남겨진 문제 ... 665
속도 문제 ... 665
응답 문제 ... 666
계산 정밀도 문제 ... 666
18.6. 정리 ... 666
CHAPTER 19 로보 파이트 설계
19.1. 시퀀스 전이 ... 670
19.2. 조작계 ... 670
이동 ... 670
점프 ... 671
선회 ... 671
무기 발사 ... 672
예제 코드 ... 672
19.3. 총을 쏘다 ... 674
탄환 클래스 ... 674
탄환 데이터 구조 ... 675
유도탄 ... 675
예제 코드 ... 677
19.4. 하나로 모은다 ... 678
추가 요소 ... 678
예제 코드 ... 680
19.5. 프론트엔드 ... 684
카메라와 관계없는 그래픽 ... 684
예제 코드 ... 685
19.6. 여전히 부족한 것 ... 687
19.7. 정리 ... 688
CHAPTER 20 빛이 닿는다는 것
20.1. 물체가 보인다는 것 ... 690
레이 트레이스 ... 690
무리한 레이 트레이스 ... 691
간략화 ... 693
20.2. 빛이 감소하는 과정 ... 695
태양에서 물체까지 ... 695
면 각도 ... 696
반사하는 비율 ... 698
물체에서 카메라까지 ... 699
20.3. 계산하자 ... 699
실제로 계산하는 식을 세운다 ... 700
속임수를 쓰다 ... 701
색에 대한 이야기 ... 702
예제 코드 ... 704
20.4. 로보 파이트에 넣자 ... 708
20.5. 팁: 속도 개선 힌트 ... 709
로컬 좌표로 계산한다 ... 709
법선을 미리 준비한다 ... 710
정점에 법선을 연결한다 ... 711
예제 코드 ... 713
20.6. 팁: 조금 더 나은 그림을 만들려면 ... 713
20.7. 정리 ... 715
CHAPTER 21 캐릭터가 움직이기 시작한다
21.1. 상대 이동 ... 718
초보자 애니메이션 ... 718
상대 이동 개념 ... 720
복수 좌표계 ... 721
좌표계 이동 ... 721
행렬 합성 ... 722
태양계 구현 ... 723
하루와 한달 ... 724
21.2. 계층 모델 클래스 ... 726
Node 클래스 ... 727
21.3. 자동으로 트리 구조 구축 ... 731
데이터 파일에 친자 관계를 기술한다 ... 731
Tree 클래스 ... 732
초기값도 파일에 넣는다 ... 733
노드와 트리 리소스화 ... 734
노드 정의 ... 735
21.4. 애니메이션 데이터화 ... 738
데이터화 실현 ... 738
애니메이션 데이터 세부 사항 ... 741
예제 코드 ... 744
21.5. 보간법 ... 747
1차 함수 보간 ... 747
2차 함수 보간 ... 752
미분 ... 753
다시 2차 함수 보간으로 ... 757
3차 함수 보간 ... 759
기울기를 주고 보간한다 ... 761
3차 함수 보간 코드 ... 762
21.6. 로보 파이트에 넣는다 ... 764
21.7. 팁: 연립방정식 vs 정해진 기울기 ... 765
21.8. 팁: 부족한 것 ... 767
애니메이션 전환 ... 767
정점 블렌딩 ... 768
IK ... 769
깨끗한 회전 보간 ... 770
21.9. 정리 ... 771
Part Ⅲ 판매용 제품으로 가는 길
CHAPTER 22 느리지 않은 충돌 검출
22.1. 전체 검사를 하면 속도가 느리다 ... 776
22.2. 속도를 개선할 때 기본 ... 777
두 가지 아이디어 ... 778
충돌 검출은 '검색'이다 ... 779
22.3. 정렬에 바탕을 둔 방법 ... 782
아주 단순한 방법 ... 782
양 끝을 정렬한다 ... 782
만난 사람 리스트 ... 783
코드로 만든다 ... 785
조금씩 개량 ... 787
정렬에 의한 방법을 사용할 때 약점 ... 789
22.4. 분할에 의한 방법 ... 792
균등 분할 ... 792
std::list를 사용해서 만든다 ... 796
개수를
더보기 닫기