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(UNIT nChar, UINT nRepCnt, 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, CDi<?import namespace ... m ur 변수 선언 ... 129 이미지의 컬러 수 확인 ... 130 팔레트 얻기 ... 131 팔레트 생성 ... 131 [5]void CChap2View::LoadBMP(LPDIRECTDRAWSURFACE7 pSurface, CDi<m:math xmlns ... '"htt 변수 선언 ... 132 Surface 잠그기 ... 133 변수 초기화 ... 133 이미지의 가로 길이 확인 ... 134 Surface와 이미지의 포인터 위치 설정 ... 134 이미지 로드 및 Surface 잠금 해제 ... 136 [6]BOOL CChap2View::OnSetCursor(CWn<m:math xmlns ... '"htt 화면에서 마우스 제거 ... 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 CChap3View::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, HMMI<m:math xmlns ... '"htt ReadMMIO(HMMIO hmmioh, MMCKINF<m:math xmlns ... '"htt WaveStartDataRead(HMMI<m:math xmlns ... '"htt WaveReadFile(HMMIO hmmioln, UINT cbRead, BYT<m:math xmlns ... '"htt [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 DIDEVICEINSTANC<m:math xmlns ... '"htt 장치 생성 ... 380 [4]BOOL CALLBACK EnumAxesCallback(const DIDEVICEOBJECTINSTANC<m:math xmlns ... '"htt [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(Cdi<m:math xmlns ... '"htt BOOL CDD::LoadBMP(LPDIRECTDRAWSURFACE7 pSurface, CDi<m:math xmlns ... '"htt BOOL CDD::CreateOffScreen(UINT SurfaceNum, CString BMPName) ... 431 ????????????????? ... 432 BOOL CDD:BitBMP(UINT SurfaceNum, int x, int y, REC<m:math xmlns ... '"htt 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(CWaveFileSoun<m:math xmlns ... '"htt 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(UNIT nFalags, CPoint point) ... 496 효과음 출력 ... 496 [3]void CDSTestView::OnRButtonDown(UNIT nFlags, CPoint point) ... 496 배경 음악 출력 ... 496 [4]BOOL CDTestView::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 HRESULT 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〉 ... 543 〈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