Top

[C++와 DirectX로 게임 엔진을 제작하며 배우는]
2D 게임 프로그래밍

  • 원서명Programming 2D Games (ISBN 9781466508682)
  • 지은이찰스 켈리
  • 옮긴이옥찬호
  • ISBN : 9788960776418
  • 40,000원
  • 2014년 11월 28일 펴냄
  • 페이퍼백 | 644쪽 | 188*235mm
  • 시리즈 : 게임 개발 프로그래밍

책 소개

예제코드

예제코드 다운로드: www.programming2dgames.com

요약

이 책은 C++와 DirectX를 이용해 간단한 게임엔진을 제작해보면서 2D 게임을 개발하는 데 필요한 내용을 배울 수 있는 입문서다. 먼저 기본적인 윈도우 프로그래밍과 DirectX부터 간단한 게임 엔진 제작, 스프라이트 및 애니메이션, 게임 물리, 사운드, 텍스트 등을 배운다. 그러고 나서 타일 기반 게임을 제작하는 방법을 배우며, 프로젝트 관리 방법과 함께 그동안에 제작한 각 부분을 합쳐 게임을 완성한다. 마지막으로 간단하게 네트워크 프로그래밍을 배우며 책을 마친다.

이 책에서 다루는 내용

■ 충돌 감지 등 2D 프로그래밍 기법

■ 게임 엔진을 만드는 과정과 만든 엔진을 사용해 완성된 게임을 개발했을 때의 장점

■ C++를 사용해 최신 DirectX와 윈도우 프로그래밍 코딩 방법

■ 각 장의 내용을 복습할 수 있는 복습문제와 프로그래밍 연습 문제 포함

■ 철저하게 테스트된 예제 프로그램을 www.programming2dgames.com 사이트에서 제공

■ 이 책에서 만들어 보는 2D 게임의 종류

• 측면, 수직 스크롤 게임

• 고전 아케이드 게임

• 타일 기반 게임

• 동적 어드벤처 게임

• 퍼즐 게임.

이 책의 대상 독자

객체 지향 프로그래밍을 처음 접한다고 하더라도, 염려할 필요는 없다. 모든 코드를 보여줄 것이다. 책에 있는 객체 지향 코드를 매우 간단하게 사용할 수 있으며, 많은 예제가 포함되어 있다. 책에 있는 코드를 통해 성공적으로 프로그램을 만들기 위해서는 C, C++ 언어나 자바에 대한 철저한 이해와 미리 선언된 클래스를 사용할 수 있는 능력과 같은 프로그래밍 전문 지식이 요구된다. 책에 포함된 게임 엔진 코드를 수정하거나 개선하고자 하는 숙달된 C++ 프로그래머를 위해 추가 토론과 연습 문제가 제공된다.

이 책의 구성

1장, 시작하기 1장에서는 마이크로소프트 비주얼 스튜디오 2010 개발 환경을 소개하고 간략하게 DirectX API에 대해 설명한다. 책에 나와 있는 코드는 C++ 프로그래밍 언어로 작성됐다. C++에 익숙하지 않지만 C나 자바(Java)에 익숙하다면 광범위한 예제가 제공되기 때문에 쉽게 이해하고 사용할 수 있다. C++ 언어에 대한 간단한 소개도 포함돼 있다. 또한 게임 엔진의 역할을 설명하고, 프로그래밍에 관한 일반적인 팁과 도움이 되는 도구를 알려준다. 1장이 끝난 뒤에는 개발 환경을 더 잘 이해하게 되고 게임 엔진이 제공하는 목적이 무엇인지 더 잘 알게 된다.

2장, 윈도우 프로그래밍 기초 2장에서는 윈도우 프로그래밍의 기초를 알아본다. 비주얼 스튜디오에서 새 프로젝트를 만드는 방법부터 시작한 후 소스 파일을 추가하고 첫 번째 윈도우 프로그램으로 고전적인 ‘Hello World’를 만들어본다. 윈도우 애플리케이션의 요구 사항이나 작업이 설명돼 있다. 또한 키보드로부터 입력을 받는 방법, 프로그램이 하나 이상의 복사본을 갖지 못하게 만드는 방법 등도 살펴본다. 2장이 끝난 뒤에는 완전한 기능이 있는 윈도우 프로그램을 만들고, 컴파일하고, 실행할 수 있을 것이다.

3장, DirectX 입문 DirectX는 고성능 그래픽, 사운드, 주변 장치와 특별한 상호 작용을 필요로 하는 프로그램을 만드는 데 사용하는 애플리케이션 프로그래밍 인터페이스(API)다. 3장에서는 먼저 DirectX API를 살펴보고 어떻게 사용하는지 알아본다. 3장에서 소개하는 DirectX 코드는 Graphics 클래스에 포함할 것이다. Graphics 클래스는 게임 엔진의 일부분이 될 것이다. DirectX 프로그래밍을 위해 비주얼 스튜디오 프로젝트를 만들고 환경설정을 한 후 첫 번째 DirectX 프로그램을 만들어본다.

4장, 게임 엔진 4장에서는 게임 엔진을 만들기 시작한다. 먼저 엔진의 핵심인 Game 클래스를 만든다. 윈도우 메시지 핸들링과 고성능 윈도우 타이머를 포함한다. 잃어버린 윈도우 장치를 복구하는 적절한 방법을 살펴보고 관련 코드를 추가한다. 다음으로 화면에 이미지를 그리기 위해 DirectX가 요구하는 코드를 살펴본다. Game 클래스의 메인 게임 루프에 코드를 감싼 뒤 게임의 속도를 조절하는 방법을 알아본다. 또한 4장에서는 Input 클래스를 만든다. Input 클래스에서 키보드, 마우스, 게임 컨트롤러에서 어떻게 입력을 받는지 알아본다. 책의 나머지 부분에 걸쳐 만들 Spacewar 게임의 첫 모습을 보면서 4장을 마무리한다. 4장이 끝난 뒤에는 게임 엔진을 위한 기본적인 프레임워크를 완성하게 될 것이며, 게임과 같은 실시간 애플리케이션이 윈도우 환경에서 어떻게 동작하는지 알 수 있게 될 것이다.

5장, 스프라이트와 애니메이션 5장에서는 스프라이트와 애니메이션 그래픽 그리기와 관련된 사항을 전반적으로 다룬다. DirectX 스프라이트를 사용해 화면에 이미지를 그린다. 스프라이트는 투명한 부분을 포함하고 있는 이미지를 지원한다. 스프라이트로 그려진 이미지는 텍스처라고 부른다. 파일로부터 텍스처를 어떻게 불러오는지, 텍스처 관리(Texture Manager) 클래스를 통해 메모리로 불러온 뒤 텍스처를 어떻게 관리하는지 살펴본다. 실제로 스프라이트를 그리는 코드는 Image 클래스의 일부분이 된다. 5장에서 만든 새 클래스들은 게임 엔진에 포함할 것이다. 애니메이션 스프라이트를 어떻게 그리는지 살펴보면서 5장을 마무리한다. 5장이 끝난 뒤에는 애니메이션 그래픽을 그리는 데 게임 엔진을 사용할 수 있을 것이다

6장, 충돌과 개체 6장에서는 스프라이트를 어떻게 물리가 적용된 개체(entity)처럼 만드는지 살펴본다. 벡터와 관련된 수학을 살펴보며 6장을 시작한다. DirectX는 계산을 수행하는 데 도움을 주기 위해 사용하는 벡터 작업이 많이 포함돼 있다. 화면에 게임 아이템이 충돌할 때 어떻게 감지하는지 철저하게 설명한다. 그리고 개체가 현실적으로 반응하게 만들기 위해 게임에서 물리를 어떻게 사용하는지 알아본다. 충돌 코드와 물리 코드는 게임 엔진에 추가할 새 Entity 클래스의 일부분이 된다. 기능이 적용된 버전의 Spacewar 게임을 보며 6장을 마무리한다. 6장이 끝난 뒤에는 서로에게 반응할 수 있는 애니메이션 그래픽을 그릴 수 있을 것이다.

7장, 사운드 7장에서는 게임 엔진이 자신의 목소리를 얻게 된다. Audacity 유틸리티를 사용해 오디오 파일을 만들고 편집하는 방법을 알아본다. 다음으로 XACT를 사용해 게임에 사용할 오디오 파일을 어떻게 준비하는지 살펴본다. 그리고 XACT 엔진을 사용해 사운드를 재생하는 방법을 알아본다. 오디오 코드는 게임 엔진에 추가할 Audio 클래스에 추가할 것이다. 7장이 끝난 뒤에는 게임 오디오 파일을 만들고, 편집하고, 재생하는 방법을 이해하게 될 것이다.

8장, 텍스트 기존 그래픽 코드를 사용해 어떻게 스프라이트 기반의 텍스트 시스템을 만드는지 살펴보고, DirectX 텍스트를 사용하는 방법도 알아본다. 텍스트 코드는 새 Text 클래스로 감싼다. 새로 만든 텍스트 기능을 게임 엔진에 포함시켜 콘솔을 추가하는 데 사용한다. 8장이 끝난 뒤에는 게임에 텍스트 메시지를 보여줄 수 있게 될 것이며, 콘솔에 명령을 추가할 수 있게 될 것이다.

9장, 향상된 외관 9장에서는 게임의 외관을 향상시키기 위한 여러 기법을 살펴본다. 이 기법들은 게임에 깊은 느낌을 주는 기법과 사용자 인터페이스 요소를 추가하는 기법을 포함한다. 9장이 끝난 뒤에는 2D 게임의 외관을 향상하기 위한 여러 기법을 배웠을 것이다.

10장, 타일 기반 게임 타일 기반 게임은 나온 지 꽤 됐지만, 오늘날에도 여전히 의미가 있다. 먼저 타일 기반 게임의 장점을 알아본다. 다음으로 도구를 이용해 타일 세트를 만들고 게임 맵을 편집하는 방법을 분석한다. 마지막으로 타일 세트를 게임 화면에 그리는 흥미로운 방법을 살펴본다. 10장이 끝난 뒤에는 자신의 게임을 플랫폼 방식으로 만들 수 있을 것이다.

11장, 게임 완성 11장에서는 게임을 완성하기 위해 그동안 작업했던 모든 기능을 하나로 합친다. 시간과 자원을 관리하는 방법을 포함해 프로젝트 관리의 기초 일부분을 다룬다. 그리고 Spacewar 게임을 만들기 위해 거쳐야 하는 여러 단계를 차례로 밟아나간다. 또한 Space Pirates 게임의 도움을 약간 받아 게임 상태를 저장하고 불러오는 방법을 다룬다.

12장, 네트워크 프로그래밍 TCP/IP와 UDP/IP는 단지 웹 서핑 이상으로 훨씬 유용하다. 12장에서는 윈도우 소켓을 사용해 게임에 네트워크 통신 기능을 추가한다. 윈도우 소켓이 어떻게 동작하는지 설명하면서 12장을 시작한다. 소켓 코드는 게임 엔진의 일부분인 Net 클래스에 포함돼 있다. 새로운 네트워크 코드는 간단한 클라이언트/서버 채팅 프로그램과 Spacewar의 네트워크 플레이 버전을 만드는 데 사용된다.

저자/역자 소개

저자 서문

오늘날 상용 게임의 대부분은 C++로 작성돼 있으며, 게임 엔진을 사용해 만들어진다. 이런 핵심 요소를 다루기 위해 이 책에서는 게임 프로그래밍에 필요한 모든 내용을 소개한다. 책에 있는 모든 코드는 C++를 사용해 면밀하게 작성했다. 독자들은 게임 프로그래밍 기술을 배우며 자신의 게임 엔진을 통합하고, 만든 게임 엔진을 사용해 완성된 게임을 만드는 방법을 알게 된다. 이 책은 스프라이트, 애니메이션, 충돌 감지, 사운드, 텍스트 디스플레이, 게임 대시보드, 특수 그래픽 효과, 타일 기반 게임, 네트워크 프로그래밍을 모두 다룬다. 또한 DirectX 애플리케이션을 프로그래밍하는 방법을 체계적으로 설명하고, 알맞은 소프트웨어 공학 기법에 초점을 맞춘다. 모든 주제는 이론적으로 설명하며, 실용적인 코드 예제를 함께 제공한다.

저자 소개

찰스 켈리 (Charles Kelly)

먼로 카운티 커뮤니티 대학(Monroe County Community College)의 교수로, 게임 프로그래밍과 컴퓨터과학 과목들을 가르치고 있다. 오픈소스 어셈블러/시뮬레이터인 ‘EASy68K’ 프로젝트의 리더이자 주 기여자이기도 하다. 미시간 주 디어 본 대학(University of Michigan-Dearborn)에서 컴퓨터과학 석사 학위를 받았으며, 외래 강사로도 일했다.

옮긴이의 말

바야흐로 게임 엔진의 시대다. 유니티(Unity) 엔진을 선두로 언리얼(Unreal) 엔진, 코코스 2D(Cocos 2D)부터 시작해 코드 작성이 필요하지 않은 게임샐러드(GameSalad)까지, 세상에는 수많은 게임 엔진이 있다. 불과 일이십 년 전 네이티브(Native)로 게임을 만들던 시절에 비하면 눈부신 발전을 했다고 볼 수 있다. 그 당시에 코드를 작성하지 않고 게임을 만들 수 있다고 생각이나 했을까?

물론 게임 엔진은 편리하고, 빠른 게임 개발을 할 수 있게 도와준다. 한 번의 클릭으로 육면체나 구를 만들 수 있으며, 물리나 사운드를 추가할 수도 있다. 하지만 게임 엔진을 사용해 게임을 만드는 것이 정말 좋기만 한 것일까?

게임 엔진을 통해 캐릭터에 대한 애니메이션 동작을 추가하는 방법은 알지만, 내부적으로 애니메이션 동작이 어떻게 실행되는지 아는 사람은 많지 않다. 물론 애니메이션 동작의 실행 원리를 반드시 알 필요는 없다. 원리를 모른다고 해서 게임을 만들지 못하는 것은 아니기 때문이다.

하지만 “아는 만큼 보인다.”라는 말이 있다. 애니메이션 동작의 실행 원리를 아는 사람이 게임 엔진을 더 빨리 이해하며, 문제가 생겼을 경우 더 빨리 해결할 수 있다. 그리고 다른 게임 엔진을 사용해야 되는 경우 더 빨리 적응할 수 있다.

이 책은 여러분이 ‘아는 만큼 볼 수’ 있게 2D 게임 제작에 필요한 부분을 C++와 DirectX를 통해 배운다. 또한 간단하게나마 게임 엔진을 제작하며 각 부분을 만들고 통합하는 방법도 배운다. 초반부에는 C++를 빠르게 복습하며, 기본적인 윈도우 프로그래밍과 DirectX에 대해 다룬다. 그 뒤에는 게임 엔진의 뼈대를 구축하는 과정에서 스프라이트 및 애니메이션, 게임 물리, 사운드, 텍스트 등을 배우게 된다. 후반부에는 타일 기반의 게임 제작 방법을 배우며, 프로젝트 관리 방법과 함께 그동안에 제작한 각 부분을 합쳐 게임을 완성한다. 마지막으로 네트워크 프로그래밍을 간략하게 배우며 책을 마친다.

이 책은 기본적으로 프로그래밍에 대한 지식을 요구한다. 물론 1장에서 C++를 빠르게 복습하는 시간을 갖기는 하지만, C++ 프로그래밍에 대한 기본적인 지식이 없다면 책을 읽는 데 어려움을 겪을 수 있다. 따라서 C++ 프로그래밍을 먼저 공부한 뒤, 또는 C++프로그래밍을 공부하면서 이 책을 보기 바란다.

나는 언제나 기본에 충실해야 된다고 생각한다. 혹시 여러분이 게임 개발자를 꿈꾸는 학생이라면 이 책을 반드시 읽기를 바란다. 이 책을 통해 자신의 기본기를 다시 다져보는 시간이 됐으면 좋겠다. 마지막으로, 게임 개발자 인터뷰에서 송재경 XL게임스 대표가 말했던 이야기 중 일부를 인용한다.

“게임을 개발할 때 가장 중요하게 여기는 가치는 무엇입니까? 최근 개발되는 게임 중 적지 않은 게임들이 기본에 충실하기보다는 독특함만을 추구하는 것 같습니다. 그런데 독특함은 의외로 기본에 충실할 때 만들어낼 수 있습니다. <리니지>를 개발할 때와 지금의 상황은 많이 달라졌지만, 게임의 변하지 않는 핵심은 재미를 선사해야 한다는 것입니다. 재미있는 게임은 당연히 게이머들에게 좋은 반응을 얻습니다. 따라서 기본에 충실히 하는 것이야말로 아무리 강조해도 지나치지 않고, 저 역시 게임을 개발할 때 가장 중요하게 여기고 있습니다.”

옮긴이 소개

옥찬호

경북대학교 대학 IT 컴퓨터학부를 거쳐 KAIST 전산학과에서 석사 과정을 밟고 있다. C++와 게임(엔진) 개발, 컴퓨터 그래픽스에 관심이 많다. 현재 페이스북 C++ Korea 그룹을 운영하며, 번역가로도 활동 중이다. 또한 중고등학생들을 대상으로 IT 관련 스터디와 멘토링을 진행하는 등 꿈나무들을 육성하는 데 힘을 쏟고 있다. 옮긴 책으로는 에이콘출판사에서 출간한 『게임샐러드로 코드 한 줄 없이 게임 만들기』(2013), 『유니티 Shader와 Effect 제작』 (2014)이 있다.

목차

목차
  • 1장 시작하기
    • 1.1 개요
    • 1.2 개발 환경
    • 1.3 DirectX란?
    • 1.4 C++를 사용하는 이유
    • 1.5 명명 규칙
    • 1.6 게임 엔진
    • 1.7 팁과 툴
    • 정리
    • 복습문제
    • 연습문제

  • 2장 윈도우 프로그래밍 기초
    • 2.1 윈도우 프로그래밍 기초
    • 2.2 윈도우 스타일의 ‘Hello World’
    • 2.3 디바이스 컨텍스트
    • 2.4 윈도우 API를 통한 키보드 입력
    • 2.5 뮤텍스로 다중 인스턴스 방지
    • 2.6 윈도우에서의 멀티태스킹
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 3장 DirectX 입문
    • 3.1 DirectX 입문
    • 3.2 DirectX 초기화
    • 3.3 디바이스 생성
    • 3.4 디스플레이 버퍼 비우기
    • 3.5 페이지 전환
    • 3.6 정확한 종료
    • 3.7 Graphics 클래스
    • 3.8 첫 번째 DirectX 프로그램
    • 3.9 전체 화면이나 창 화면
    • 3.10 디버그와 리테일 DLL
    • 3.11 디바이스 성능 결정
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 4장 게임 엔진
    • 4.1 게임 엔진, 1부
    • 4.2 Game 클래스
    • 4.3 Input 클래스
    • 4.4 Spacewar 클래스
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 5장 스프라이트와 애니메이션
    • 5.1 게임 그래픽 얻기
    • 5.2 그래픽스 파이프라인
    • 5.3 투명도를 적용해 그리기
    • 5.4 TextureManager 클래스
    • 5.5 Image 클래스
    • 5.6 게임 엔진
    • 5.7 간단한 애니메이션
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 6장 충돌과 개체
    • 6.1 벡터
    • 6.2 충돌
    • 6.3 Entity 클래스
    • 6.4 2D 게임을 위한 물리
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 7장 사운드
    • 7.1 오디오 파일 얻기
    • 7.2 오디오 파일 만들기
    • 7.3 XACT 사용
    • 7.4 게임 엔진에 오디오 추가
    • 7.5 게임에 사운드 추가
    • 7.6 오디오 재생 조정
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 8장 텍스트
    • 8.1 스프라이트 텍스트
    • 8.2 사용자 정의 글꼴 작성
    • 8.3 Text 클래스의 세부 내용
    • 8.4 DirectX 텍스트
    • 8.5 TextDX 클래스 세부 사항
    • 8.6 FPS 디스플레이 추가
    • 8.7 콘솔 추가
    • 8.8 Console 클래스
    • 8.9 게임 엔진에 Console을 통합
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 9장 향상된 외관
    • 9.1 비트맵 스크롤링
    • 9.2 화가 알고리즘
    • 9.3 페럴렉스 스크롤링
    • 9.4 그림자와 반사된 모습
    • 9.5 메시지 대화상자
    • 9.6 입력 대화상자
    • 9.7 전체 화면의 DirectX 애플리케이션에서 사용하는 윈도우 대화상자
    • 9.8 대시보드
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 10장 타일 기반 게임
    • 10.1 왜 타일 기반의 게임인가?
    • 10.2 타일 세트 작성
    • 10.3 레벨 배치
    • 10.4 타일 표시
    • 10.5 직교 투영법
    • 10.6 경사 투영법
    • 10.7 등각 투영법
    • 10.8 등각 지형
    • 10.9 높이 레이어
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 11장 게임 완성
    • 11.1 점진적 프로토타이핑
    • 11.2 프로젝트 관리
    • 11.3 디자인 문서
    • 11.4 프로토타입 텍스처
    • 11.5 Spacewar 작업
    • 11.6 Spacewar v1.0
    • 11.7 저장과 불러오기
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 12장 네트워크 프로그래밍
    • 12.1 네트워크 개요
    • 12.2 Net 클래스
    • 12.3 네트워크 초기화
    • 12.4 서버 생성
    • 12.5 클라이언트 생성
    • 12.6 로컬 IP 주소 얻기
    • 12.7 전송
    • 12.8 수신
    • 12.9 소켓 닫기
    • 12.10 오류 얻기
    • 12.11 클라이언트/서버 채팅
    • 12.12 클라이언트/서버 Spacewar
    • 12.13 Spacewar 서버
    • 12.14 Spacewar 클라이언트
    • 정리
    • 복습문제
    • 연습문제
    • 예제

  • 마치면서

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

정오표

2014.12.3 수정사항

[p.55 : 23행]
CreateWindow -> CreateMainWindow

[p.62 : 12행]
CreateWindow -> CreateMainWindow

[p.63 : 19행]
hwnd -> hWnd

[p.63 : 19행, 23행, 24행, 27행]
hwnd -> hWnd

2015.1.21 수정사항

[p.45 : 1행]
HINSTANCE, hPrevInstance
-> HINSTANCE hPrevInstance

2015. 6. 11 수정사항

[p. 57: 아래에서 2행]
UpdateWIndow(hwnd);
->
UpdateWindow(hwnd);

2016. 2. 22 수정사항

[p.66: 19행]
InvalidRect(hwnd, NULL, TRUE);
->
InvalidateRect(hwnd, NULL, TRUE);

[p.66 : 9행]

[p.224 : 코드 2행]

[p.225 : 코드 11행]

[p.225 : 코드 17행]