목차
1부 게임과 DirectX의 개요
1. 게임의 역사와 종류 = 27
1-1 게임의 역사 = 27
1-2 게임의 종류 = 32
아케이드(Arcade) = 32
어드벤처(Adventure) = 32
롤플레잉(Role Playing) = 33
시뮬레이션(Simulation) = 34
2. DirectX의 개요 = 35
2-1 DirectX의 소개 = 35
2-2 DirectX의 구조 = 36
DirectDraw = 37
Direct3D = 37
DirectSound = 37
DirectInput = 37
DirectPlay = 37
DirectSetup = 37
2-3 DirectX 설치하기 = 38
2부 DirectDraw 익히기
1. DirectDraw 맛보기 = 45
1-1 프로그램 따라하기 = 45
1-2 프로그램 설명 = 59
[1] void CChap1View::OnInitialUpdate() = 60
변수선언 = 60
변수 초기화 = 60
DirectDraw 객체 생성 = 61
Window 모드 설정 = 61
Display 모드 설정 = 62
Surface 생성 = 63
BackBuffer 내용 저장 = 63
Flipping = 63
[2] BOOL CChap1View::CreateSurfaces() = 64
변수 선언 = 64
DDSURFACEDESC 구조 초기화 = 65
Primary Surface와 BackBuffer 생성 = 67
[3] BOOL CChap1View::ClearSurface(LPDIRECTDRAWSURFACE pSurface) = 68
변수 선언 및 초기화 = 68
Surface에 대한 Lock() 함수 실행 = 69
잠긴 면 지우기 및 unlock()을 이용한 잠김 해제 = 70
[4] void CChap1View::UpdateSurface() = 71
변수 선언 = 71
첫 번째 화면과 두 번째 화면 생성 = 71
화면 가운데에 문장 표시 = 74
[5] void CChap1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlag) = 75
Flipping(surface 전환) = 75
프로그램 종료 = 76
1-3 프로그램 전체 소스 코드 = 77
〈Chap1.h〉 = 77
〈Chap1.cpp〉 = 78
〈stdafx.h〉 = 82
〈stdafx.cpp〉 = 83
〈Resource.h〉 = 83
〈MainFrm.h〉 = 84
〈MainFrm.cpp〉 = 85
〈Chap1Doc.h〉 = 87
〈Chap1Doc.cpp〉 = 89
〈Chap1View.h〉 = 91
〈Chap1View.cpp〉 = 93
2. BMP(Bitmap) File 출력 = 101
2-1 프로그램 따라하기 = 101
2-2 프로그램 설명 = 112
[1] void CChap2View::OnInitialUpdate() = 113
변수 선언 = 113
변수 초기화 = 114
DirectDraw 객체 생성 = 114
Window 모드 및 Display 모드 설정 = 115
Surface 생성 및 BackBuffer 초기화 = 116
Flipping = 116
[2] void CChap2View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlag) = 117
화면 Update 및 Flipping = 117
프로그램 종료 = 117
[3] void CChap2View::UpdateSurface() = 118
BackBuffer Clear = 118
Image 객체 생성 = 118
팔레트 생성 = 127
Surface에 이미지 Data 로드 = 128
다음 그림을 위한 변수 증가 = 128
[4] LPDIRECTDRAWPALETTE CChap2View::CreateDDPalette(LPDIRECTDRAW7 pDDObj, CDib^* cdib) = 129
변수 선언 = 129
이미지의 컬러 수 확인 = 130
팔레트 얻기 = 131
팔레트 생성 = 131
[5] void CChap2View::LoadBMP(LPDIRECTDRAWSURFACE7 pSurface, CDib^* cdib) = 132
변수 선언 = 132
Surface 잠그기 = 133
변수 초기화 = 133
이미지의 가로 길이 확인 = 134
Surface와 이미지의 포인터 위치 설정 = 134
이미지 로드 및 Surface 잠금 해제 = 136
[6] BOOL CChap2View::OnSetCursor(CWnd^* pWnd, UINT nHitTest, UINT message) = 137
화면에서 마우스 제거 = 137
2-3 프로그램 전체 소스 코드 = 138
〈Chap2.h〉 = 138
〈Chap2.cpp〉 = 139
〈StdAfx.h〉 = 143
〈StdAfx.cpp〉 = 144
〈MainFrm.h〉 = 144
〈MainFrm.cpp〉 = 145
〈Chap2Doc.h〉 = 147
〈Chap2Doc.cpp〉 = 149
〈Chap2View.h〉 = 151
〈Chap2View.cpp〉 = 153
3. Animation 제작하기 = 163
3-1 프로그램 따라하기 = 163
3-2 프로그램 설명 = 179
[1] void CChap3iew::OnInitialUpdate() = 181
변수 선언 = 181
변수 초기화 = 181
DirectDraw 초기화 = 182
Multimedia Timer 설정 = 183
[2] BOOL CChap3View::CreateSurfaces() = 186
변수 선언 = 186
Primary Surface와 Backbuffer 생성 = 187
배경 및 캐릭터 이미지 객체 생성 = 187
배경 및 캐릭터를 위한 Surface 생성 = 188
투명색 지정 = 192
[3] void CChap3View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) = 194
프로그램 종료 = 194
캐릭터의 위치 이동 = 194
[4] void CChap3View::UpdateSurface() = 195
변수 선언 = 195
배경 Surface로부터 BackBuffer로 이미지 로드 = 195
캐릭터 Surface로부터 BackBuffer로 이미지 로드 = 200
화면 Flipping = 203
[5] void CChap3View::OnMMTimer() = 204
UpdateSurface() 함수 호출 = 204
3-3 프로그램 전체 소스 코드 = 205
〈StdAfx.h〉 = 205
〈StdAfx.cpp〉 = 206
〈Chap3.h〉 = 206
〈Chap3.cpp〉 = 207
〈MainFrm.h〉 = 211
〈MainFrm.cpp〉 = 213
〈Chap3Doc.h〉 = 214
〈Chap3Doc.cpp〉 = 216
〈Chap3View.h〉 = 218
〈Chap3View.cpp〉 = 220
3부 DirectSound 익히기
1. Wave File의 구조와 DirectSound의 사용 = 235
1-1 프로그램 따라하기 = 235
1-2 프로그램 설명 = 243
[1] void CChap1View::OnInitialUpdate() = 244
DirectSound 객체 생성 및 독점 모드 설정 = 244
Wave File reading = 245
LoadWaveFile(CString strFilename) = 249
WaveOpenFile(CString strFilename, HMMIO^* phmmioln, MMCKINFO^* pcklnRIFF) = 252
ReadMMIO(HMMIO hmmioln, MMCKINFO^* pcklnRIFF) = 253
WaveStartDateRead(HMMIO^* phmmioln, MMCKINFO^* pckln, MMCKINFO^* pcklnRIFF) = 256
WaveReadFile(HMMIO hmmioln, UINT cbRead, BYTE^* pbDest) = 257
[2] HRESULT CChap1View::CreateSoundBuffer() = 257
변수 선언 및 초기화 = 257
2차 버퍼 생성 = 260
2차 버퍼로 Wave data의 로드 = 260
[3] void CChap1View::OnLButtonDown(UINT nFlags, CPoint point) = 262
배경 음악 출력 = 262
[4] void CChap1View::OnLButtonDown(UINT nFlags, CPoint point) = 263
효과음 출력 = 263
1-3 프로그램 전체 소스 코드 = 265
〈StdAfx.h〉 = 265
〈StdAfx.cpp〉 = 265
〈MainFrm.h〉 = 266
〈MainFrm.cpp〉 = 267
〈Chap1.h〉 = 269
〈Chap1.cpp〉 = 270
〈Chap1Doc.h〉 = 274
〈Chap1Doc.cpp〉 = 276
〈Chap1View.h〉 = 278
〈Chap1View.cpp〉 = 280
〈WaveFile.h〉 = 286
〈WaveFile.cpp〉 = 287
4부 DirectInput 익히기
1. KeyBoard 입력하기 = 293
1-1 프로그램 따라하기 = 293
1-2 프로그램 설명 = 302
[1] BOOL CKeyDlg::OnInitDialog() = 303
[2] HRESULT CKeyDlg::InitDirectInput() = 303
DirectInput 객체 생성 = 303
장치 설정 = 304
Data 포맷 설정 = 304
Windows 모드 설정 = 305
[3] HRESULT CKeyDlg::UpdateInputState() = 306
변수 선언 = 306
키보드 상태 정보 가져오기 = 307
키의 값을 16진수로 변환 = 308
Edit box에 출력 = 314
[4] void CKeyDlg::OnMMTimer() = 314
UpdateInputState() 함수 호출 = 314
[5] BOOL CKeyDlg::DestroyWindow() = 315
객체 제거 = 315
1-3 프로그램 전체 소스 코드 = 316
〈StdAfx.h〉 = 316
〈StdAfx.cpp〉 = 316
〈Key.h〉 = 317
〈Key.cpp〉 = 318
〈KeyDlg.h〉 = 320
〈KeyDlg.cpp〉 = 322
2. Mouse 입력하기 = 329
2-1 프로그램 따라하기 = 329
2-2 프로그램 설명 = 338
[1] BOOL CMouseDlg::OnInitDialog() = 338
[2] HRESULT CMouseDlg::InitDirectInput() = 339
DirectInput 객체 생성 = 339
장치 설정 = 340
Data 포맷 설정 = 340
Windows 모드 설정 = 341
[3] HRESULT CMouseDlg::UpdateInputState() = 342
마우스 상태 정보 얻기 = 342
마우스 위치 출력 = 343
마우스 버튼 정보 출력 = 345
[4] void CMouseDlg::OnMMTimer() = 346
UpdateInputState() 함수 호출 = 346
[5] BOOL CMouseDlg::DestroyWindow() = 347
객체 제거 = 347
2-3 프로그램 전체 소스 코드 = 348
〈StdAfx.h〉 = 348
〈StdAfx.cpp〉 = 348
〈Mouse.h〉 = 349
〈Mouse.cpp〉 = 350
〈MouseDlg.h〉 = 352
〈MouseDlg.cpp〉 = 354
3. 조이스틱 입력하기 = 361
3-1 프로그램 따라하기 = 361
3-2 프로그램 설명 = 374
[1] BOOL CJoyDlg::OnInitDialog() = 375
[2] HRESULT CJoyDlg::InitDirectInput() = 376
DirectInput 객체 생성 = 376
장치 열거 = 377
Data 포맷, Windows 모드 설정 = 378
장치 세부 정보 열거 = 379
[3] BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE^* pdidInstance, VOID^* pContext) = 380
장치 생성 = 380
[4] BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANCE^* pdidoi, VOID^* pContext) = 382
[5] HRESULT CJoyDlg::UpdateInputState() = 385
변수 선언 = 385
장치 획득 및 장치 상태 얻기 = 386
조이스틱의 위치 출력을 위한 변수 초기화 = 387
조이스틱의 위치 출력 = 387
버튼 상태 출력 = 388
[6] void CJoyDlg::OnMMTimer() = 389
[7] BOOL CJoyDlg::DestroyWindow() = 390
3-3 프로그램 전체 소스 코드 = 391
〈StdAfx.h〉 = 391
〈StdAfx.h〉 = 391
〈Joy.h〉 = 392
〈Joy.cpp〉 = 393
〈JoyDlg.h〉 = 395
〈JoyDlg.cpp〉 = 397
5부 Class Library 제작하기
1. DirectDraw Class Library 제작하기 = 409
1-1 프로그램 따라하기 = 409
1-2 CDD Class 설명 = 421
[1] dd.h = 421
Include 및 Class 정의 = 421
멤버 변수 선언 = 422
멤버 함수 선언 = 423
[2] dd.cpp = 425
"stdafx.h", "dd.h" include 및 생성자 소멸자 정의 = 425
BOOL CDD::InitDD() = 426
BOOL CDD::CreatePrimarySurface() = 427
BOOL CDD::ClearSurface(LPDIRECTDRAWSURFACE7 pSurface) = 428
BOOL CDD::CreateDDPalette(Cdib^* cdib) = 429
BOOL CDD::LoadBMP(LPDIRECTDRAWSURFACE7 pSurface, CDib^* cdib) = 430
BOOL CDD::CreateOffScreen(UINT SurfaceNum, CString BMPName) = 431
void CDD::○ = 432
BOOL CDD::BitBMP(UINT SurfaceNum, int x, int y, RECT^* rect) = 432
void CDD::Flipping() = 433
1-3 CDD Class의 사용 = 434
1-4 CDD Class 예제 설명 = 441
void CDDTestView::OnInitialUpdate() = 441
void CDDTestView::UpdateSurface() = 441
1-5 프로그램 전체 소스 코드 = 446
〈StdAfx.h〉 = 446
〈StdAfx.cpp〉 = 446
〈MainFrm.h〉 = 447
〈MainFrm.cpp〉 = 448
〈DDTest.h〉 = 450
〈DDTest.cpp〉 = 451
〈DDTestDoc.h〉 = 455
〈DDTestDoc.cpp〉 = 457
〈DDTestView.h〉 = 459
〈DDTestView.cpp〉 = 461
〈dd.h〉 = 467
〈dd.cpp〉 = 468
2. DirectSound Class Library 제작하기 = 477
2-1 프로그램 따라하기 = 477
2-2 CSoundBuffer Class 설명 = 482
[1] soundbuffer.h = 482
Include 및 Class 정의 = 482
멤버 변수 선언 = 483
멤버 함수 선언 = 483
[2] soundbuffer.cpp = 484
"soundbuffer.h" include 및 DirectSound 객체 포인터 변수 선언 및 생성 = 484
DirectSound 객체 제거 = 484
CSoundBuffer class의 생성자와 소멸자 = 485
void CSoundBuffer::CreateBufferFromWaveFile(CString strFileName) = 486
HRESULT CSoundBuffer::CreateFromWaveFile(CWaveFileSound^* pWaveFileSound) = 486
HRESULT CSoundBuffer::PlaySound(BOOL bLooped) = 488
HRESULT CSoundBuffer::StopSound() = 488
2-3 CSoundBuffer Class의 사용 = 490
2-4 CSoundBuffer Class 예제 설명 = 494
[1] void CDSTestView::OnInitialUpdate() = 494
DirectSound 객체 생성 = 494
2차 버퍼 생성 = 494
[2] void CDSTestView::OnLButtonDown(UINT nFlags, CPoint point) = 496
효과음 출력 = 496
[3] void CDSTestView::OnRButtonDown(UINT nFlags, CPoint point) = 496
배경 음악 출력 = 496
[4] BOOL CDSTestView::DestroyWindow() = 497
DirectSound 객체 제거 = 497
2-5 프로그램 전체 소스 코드 = 498
〈StdAfx.h〉 = 498
〈StdAfx.h〉 = 498
〈MainFrm.h〉 = 499
〈MainFrm.cpp〉 = 500
〈DSTest.h〉 = 502
〈DSTest.cpp〉 = 504
〈DSTestDoc.h〉 = 507
〈DSTestDoc.cpp〉 = 509
〈DSTestView.h〉 = 511
〈DSTestView.cpp〉 = 513
〈soundbuffer.h〉 = 517
〈soundbuffer.cpp〉 = 518
3. DirectInput Class Library 제작하기 = 525
3-1 프로그램 따라하기 = 525
3-2 CDIKey Class에 대한 설명 = 529
[1] di.h = 529
Include 및 Class 정의 = 529
멤버 변수 선언 = 530
멤버 함수 선언 = 530
[2] di.cpp = 531
"stdafx.h", "di.h" include 및 생성자 소멸자 정의 = 531
HRESULT CDIKey::InitDIKey() = 532
HRESULT CDIKey::UpdateInputState() = 533
BOOL CDIKey::IsKeyDown(UINT KeyIndex) = 534
3-3 CDIKey Class의 사용 = 535
3-4 CDIKey Class 예제 설명 = 541
BOOL CDIKeyDlg::OnInitDialog() = 541
void CDIKeyDlg::OnMMTimer() = 541
void CDIKeyDlg::ShowInputState() = 542
3-5 프로그램 전체 소스 코드 = 543
〈stdafx.h〉 = 543
〈stdafx.cpp〉 = 544
〈DIKey.h〉 = 544
〈DIKey.cpp〉 = 545
〈DIKeyDlg.h〉 = 547
〈DIKeyDlg.cpp〉 = 549
〈di.h〉 = 553
〈di.cpp〉 = 554
6부 게임용 캐릭터 Class 추가하기
1. 캐릭터 Class 제작하기 = 559
1-1 Player Class 작성하기 = 561
멤버 변수 = 561
멤버 함수 = 562
1-2 CPlayer class 전체 소스 코드 = 562
〈player.h〉 = 562
〈player.cpp〉 = 563
1-3 Enemy Class 작성하기 = 564
멤버 변수 = 564
1-4 CEnemy class 전체 소스 코드 = 569
〈CEnemy.h〉 = 569
〈CEnemy.cpp〉 = 569
1-5 Pok Class 작성하기 = 572
멤버 변수 = 572
멤버 함수 = 573
1-6 CPok class 전체 소스 코드 = 574
〈pok.h〉 = 574
〈pok.cpp〉 = 574
7부 실전 게임 제작하기
1. 프로그램 따라하기 = 579
2. 프로그램 설명하기 = 600
[1] void CGameView::OnInitialUpdate() = 602
변수 초기화 = 602
DirectDraw 클래스 객체 생성 = 603
배경 OffScreen 생성 = 603
아군 전투기 OffScreen 생성 = 604
무기 생성 = 605
적군 전투기 생성 = 606
출력할 캐릭터의 위치와 효과음 포인터 배열의 초기화 = 607
폭발 이미지 OffScreen Surface 생성 = 607
DirectInput 객체 생성 = 608
DirectSound 객체 생성 및 배경 음악을 위한 SoundBuffer 생성 = 609
Multimedia Timer 설정 및 기타 변수 초기화 = 610
[2] void CGameView::OnMMtimer() = 611
[3] void CGameView::Check_Key() = 612
아군 전투기의 위치 이동 = 612
무기 발사 = 614
프로그램 종료 = 616
[4] void CGameView::UpdateSurface() = 616
[5] void CGameView::Scroll_Back() = 617
[6] void CGameView::Show_Player = 617
폭발 이미지 출력 = 617
출력할 아군 전투기의 영역 설정 = 618
게임 시작시의 아군 전투기 출력 = 619
아군 전투기의 충돌 체크 및 출력 = 620
[7] void CGameView::Show_Weapon() = 621
무기 출력을 위한 영역 설정 = 621
생성되어 있는 총알의 출력 = 622
[8] void CGameView::Show_Enemy() = 623
이동 Type에 따라 적군 전투기 위치 class 생성 = 623
적군 이미지 출력 = 626
[9] BOOL CGameView::Collision_Player(int x, int y, int width, int height) = 627
아군 전투기와 적군 전투기의 거리 차이 구하기 = 627
[10] BOOL CGameView::Collision_Enemy(int x, int y, int width, int height) = 630
[11] void CGameView::Del_e_Pok() = 631
[12] void CGameView::Del_p_Pok() = 633
[13] void CGameView::Show_p_Pok(int px, int py) = 635
[14] void CGameView::Show_e_Pok(int px, int py) = 636
[15] void CGameView::Del_Sound() = 637
3. 프로그램 전체 소스 코드 = 638
〈StdAfx.h〉 = 638
〈StdAfx.cpp〉 = 639
〈MainFrm.h〉 = 639
〈MainFrm.cpp〉 = 640
〈Game.h〉 = 642
〈Game.cpp〉 = 644
〈GameDoc.h〉 = 648
〈GameDoc.cpp〉 = 649
〈GameView.h〉 = 651
〈GameView.cpp〉 = 654