게임 프로그래밍 알고리즘 [게임 프로그래머를 위한 실전 알고리즘 원리와 기법]
- 원서명Game Programming Algorithms and Techniques: A Platform-Agnostic Approach (ISBN 9780321940155)
- 지은이산자이 마드하브(Sanjay Madhav)
- 옮긴이김홍중
- ISBN : 9788960778016
- 40,000원
- 2015년 12월 30일 펴냄 (절판)
- 페이퍼백 | 404쪽 | 188*235mm
- 시리즈 : 게임 개발 프로그래밍
판매처
- 현재 이 도서는 구매할 수 없습니다.
책 소개
이 책의 예제는 저자의 홈페이지(http://gamealgorithms.net/)에서 내려받을 수 있습니다.
요약
이 책은 서던 캘리포니아 대학교(USC)의 비디오게임 프로그래밍 과정 강사인 저자가 수업에 활용할 보조교재를 목적으로 쓴 책이다. 목적에 충실하게 특정 게임 엔진이나 플랫폼에 얽매이지 않고 2D, 3D 그래픽, 수학, 물리학, 사운드, 인공지능, 사용자 인터페이스 등 게임 개발에 쓰이는 다양한 알고리즘과 기법을 소개한다. 마지막으로 본문에서 소개한 내용을 종합해서 두 개의 예제 게임을 만들어 보면서 배운 내용을 복습한다.
이 책에서 다루는 내용
게임 시간의 운영, 속도 제어를 통해 하드웨어의 차이와 관계없이 일관성을 유지하는 방법
최신 모바일 게임에 쓰이는 핵심적인 2D 그래픽 기법
3D 게임에 필요한 벡터, 행렬, 선형 대수학
좌표 공간, 조명과 셰이딩, Z 버퍼링, 사원수 등 3D 그래픽 기법
다양한 디지털 입력, 아날로그 입력의 처리 방법
사운드 이벤트, 3D 오디오, 디지털 신호 처리를 포함하는 사운드 시스템
충돌 확인과 수치 적분을 포함하는 게임 물리학의 기초
1인칭 카메라, 수행 카메라, 스플라인 카메라 등 다양한 카메라
길 찾기, 상태 기반 행동, 전략과 계획 등의 인공지능
메뉴 시스템, HUD 같은 사용자 인터페이스
스크립트 언어와 텍스트 형식 데이터 파일을 사용해야 하는 이유와 시기, 상황
프로토콜과 네트워크 토폴로지 등 네트워크 게임에 필요한 기본 지식
이 책의 대상 독자
이 책은 C++, C#, 자바 같은 객체지향 언어로 프로그래밍하는 방법을 알고 연결 리스트, 이진 트리, 해시 테이블 같은 기본적인 데이터 구조에 친숙한 독자를 대상으로 한다. 일반적인 대학 컴퓨터 과학 교육 과정이라면 첫 두 학기에 이런 내용을 모두 소개하므로 수업만 잘 들었다면 별문제 없을 것이다. 또 미적분학을 수강했다면 선형 대수학, 물리학을 다루는 단원에서 소개하는 개념을 한층 수월하게 이해할 수 있을 것이다.
꼭 필요한 조건은 아니지만 간단한 게임을 기획해본 적이 있거나 게임에 친숙하기만 하다면 책의 내용을 이해하는 데 여러모로 유리하다. 특정 장르에만 쓰이는 프로그래밍 기법을 소개할 때도 있으므로 해당 장르 게임을 잘 알고 있다면 이해하기 쉬울 것이다. 또 게임메이커 같은 툴을 사용해서 게임을 프로토타이핑해본 적이 있다면 이해가 빠르겠지만 해본 적이 없어도 딱히 상관없다.
이 책은 강의를 목적으로 쓰였지만, 이미 일반적인 프로그래밍을 잘 알고 있으면서 전문적인 게임 프로그래밍에 관심이 있는 사람이라면 누구에게나 유용할 수 있다. 모든 주제를 실용성과 활용성에 초점을 맞춰서 설명한다는 점이 다른 대학 교재와의 차이점이다. 마지막으로 이 책은 게임 프로그래밍에 관한 다양한 주제를 폭넓게 소개하므로 게임 프로그래밍의 색다른 면모를 공부해보고 싶은 초보 프로그래머에게도 유용할 수 있다.
이 책의 구성
1장부터 12장까지는, 게임 프로그래밍에 쓰이는 다양한 알고리즘과 기법을 간략하게 소개한다. 2D/3D 그래픽, 물리학, 인공지능, 카메라 등 상당히 폭넓은 주제를 다룬다. 1장부터 순서대로 차례로 읽게 구성했지만, 어느 정도 벗어나도 상관없다.
마지막 두 개 장인 13장과 14장은 12장까지 앞에서 소개한 다양한 알고리즘과 기법을 토대로 만든 예제 게임을 소개하는 일종의 사례 연구를 다룬다. 두 개의 예제 게임은 각각 cocos2d를 사용해서 오브젝티브C로 만든 iOS용 2D 횡 스크롤 게임과 XNA, 모노 게임을 사용해서 C#으로 만든 PC, 맥, 리눅스용 3D 타워 디펜스 게임이다. 소스 코드는 이 책의 웹사이트인 http://gamealgorithms.net에서 다운로드할 수 있다.
1장, 게임 프로그래밍 개요
비디오 게임의 시대별 변천사를 통해 게임 프로그래머의 역할이 바뀌어온 과정을 간단하게 소개한다. 먼저 비디오 게임의 역사를 간략하게 살펴본 뒤에 게임을 프로그래밍하는 데 있어서 중요한 개념인 게임 루프, 시간 운영, 게임 오브젝트를 소개한다.
2장, 2D 그래픽
웹, 스마트폰, 독립 게임의 폭발적인 증가와 맞물려 2D 그래픽은 일종의 르네상스를 맞고 있다. 개발자가 2D에 끌리는 이유는 개발 예산과 인원을 줄일 수 있기 때문이다. 게이머가 2D에 끌리는 이유는 게임이 깔끔하고 단순하기 때문이다.
이 책은 주로 3D 게임에 초점을 맞추고 있지만 2D 그래픽에 숨어있는 핵심 개념을 그냥 지나치는 우를 범하진 않으려 한다. 또 다른 장에서 소개할 물리학, 음향, UI 프로그래밍에 관한 내용 중 상당수는 2D 게임과 3D 게임 양쪽에 똑같이 적용할 수 있다는 점도 명심하기 바란다.
3장, 선형 대수학
수학의 한 분야인 선형 대수학은 따로 책 한 권을 쓰기에 충분할 만큼 광범위한 학문이다. 하지만 3D 컴퓨터 게임에 쓰이는 선형 대수학은 그 넓은 범위 중 극히 일부다. 3장에서는 선형 대수학을 뒷받침하는 이론과 증명을 속속들이 소개하는 대신에 실제로 게임 프로그래밍과 관련이 있는 내용만 소개할 예정이다.
게임 프로그래머에게 벡터와 행렬의 중요성은 아무리 강조해도 지나치지 않다. 게임 업계에 종사하는 프로그래머라면 벡터와 행렬을 마주하지 않는 날이 드물 정도다.
4장, 3D 그래픽
최초의 3D 게임은 아케이드(상점가, 특히 국내의 경우 ‘오락실’을 의미) 시대에 등장했지만 사실상 3D 게임의 시대는 1990년대 중후반에 와서야 막을 올렸다. 요즘은 콘솔과 PC를 막론하고 거의 모든 AAA 타이틀이 3D 게임이다. 또 스마트폰의 성능이 높아지면서 모바일 게임에서도 3D의 비중이 점점 높아지고 있다.
기술적으로 3D 게임의 가장 큰 어려움은 3D인 게임 세계를 2D 화면에 표시해야 한다는 점이다. 4장에서는 이런 문제를 극복하는 데 필요한 요소를 설명하려 한다.
5장, 입력
게임에서 사용자의 입력을 빼버리면 영화, TV와 별다를 바 없다. 실제로 게임은 키보드, 마우스, 컨트롤러 등 다양한 입력 장치와 상호작용한다. 5장에서는 모바일 기기용 입력 장치를 포함해서 다종다양한 입력 장치를 상세하게 살펴본다. 게다가 한층 수준 높은 입력 시스템을 설계하고 구현하는 방법도 설명한다.
6장, 사운드
종종 간과하곤 하지만 사운드는 게임의 중요한 구성 요소다. 사운드의 중요성을 직접 느껴보고 싶다면 좋아하는 게임을 무음 상태로 플레이해보기 바란다. 사운드가 없으면 확실히 허전한 느낌이 들 것이다.
6장에서는 먼저 소스 데이터를 게임 코드가 재생할 ‘큐’로 전환하는 방법을 설명한다. 그런 다음 도플러 효과, 디지털 신호 처리, 사운드 폐쇄 등 특정 상황에서 쓸 수 있는 좀 더 수준 높은 사운드 기법을 소개한다.
7장, 물리학
아무리 물리학이 필요 없어 보이는 게임도 최소한 충돌 확인과 운동 정도는 구현해야 할 수 있다. 충돌 확인을 사용하면 두 게임 오브젝트가 서로 겹쳤는지 확인할 수 있다. 7장에서는 충돌을 확인할 때 사용할 수 있는 다양한 알고리즘 중에 가장 기본적인 알고리즘 몇 가지를 소개하려 한다.
물리학의 운동에 관한 부분에서는 고전역학에서 유래한 힘, 가속도, 질량 등의 속성을 고려해서 프레임 단위로 오브젝트의 위치를 결정하는 방법을 소개한다. 이 과정에는 미적분학, 특히 7장의 뒷부분에서 설명하는 수치 적분이 꼭 필요하다.
8장, 카메라
카메라는 3D 게임 세상에서 플레이어의 시점(視點)을 나타낸다. 게임에 쓰이는 카메라의 종류는 다양하며 기본적으로 게임에 사용할 카메라는 개발 초기에 결정해야 한다.
8장에서는 요즘 게임에 주로 쓰이는 카메라 몇 종류를 소개하고 카메라에 따라 신 안에서 처리해야 할 계산에 관해 설명한다. 또 4장, ‘3D 그래픽’에서 처음 소개했던 원근 투영에 관해 좀 더 자세히 살펴본다.
9장, 인공지능
9장에서는 인공지능의 세 가지 주요 측면인 길 찾기, 상태 기반 행동, 전략과 계획을 소개한다. 길 찾기 알고리즘은 플레이어가 조종할 수 없는 NPC가 게임 세계를 돌아다닐 경로를 결정한다. 또 NPC는 상태 기반 행동을 통해 자신의 행동을 결정한다. 마지막으로 전략과 계획은 실시간 전략(RTS) 게임처럼 대규모 AI 계획이 불가피할 때 필요하다.
10장, 사용자 인터페이스
일반적으로 게임의 사용자 인터페이스는 메뉴 시스템과 헤드업 디스플레이(HUD)라는 두 가지 구성 요소를 지닌다. 메뉴 시스템은 모드 변경, 게임 일시 정지, 설정 선택 등 플레이어가 게임에 참여하는 방법과 게임에서 벗어나는 방법을 정의한다. 또 RPG처럼 인벤토리나 스킬을 관리하는 메뉴가 따로 있는 게임도 있다.
레이더, 탄약 수, 나침반, 조준선 등 실제로 게임을 플레이하는 플레이어에게 부가적인 정보를 제공하는 모든 요소가 HUD에 속한다. HUD가 없는 게임도 있고 설정을 통해 HUD를 없앨 수 있는 게임도 있지만, 대부분의 게임은 하다못해 기본적인 형태일지언정 HUD를 가진다.
11장, 스크립트 언어와 데이터 형식
게임 플레이에 관한 코드를 스크립트 언어로 작성하는 게임이 점점 늘고 있다. 11장에서는 스크립트 언어의 장단점과 함께 게임에 사용할 수 있는 몇몇 스크립트 언어를 소개한다.
또 레벨을 구성하는 데이터와 기타 게임 속성을 저장하는 방법도 살펴본다. 스크립트 언어에서 데이터를 바이너리와 텍스트로 표현하는 방법도 함께 소개한다.
12장, 네트워크
네트워크를 지원하는 게임은 인터넷 너머의 플레이어와 함께 플레이할 수 있다. 최근 가장 인기 있는 네트워크 게임인 〈헤일로〉, 〈콜 오브 듀티〉, 〈월드 오브 워크래프트〉 등은 네트워크를 지원하거나 네트워크에 연결해야만 플레이할 수 있는 게임이다. AI가 아무리 발전했다고 해도 AI를 상대로 하는 게임 경험은 진짜 사람과 플레이할 때의 게임 경험에 비할 바가 아니다.
네트워크를 지원하는 게임의 구현은 책 한 권을 다 채울 수 있을 만큼 상당히 복잡한 주제다. 12장에서는 네트워크를 통해 데이터를 전달하는 기본적인 방법과 네트워크 지원 때문에 달라져야 하는 게임 설계 방법을 소개한다.
13장, iOS용 횡 스크롤 게임 예제
횡 스크롤 게임이란 옆에서 바라보는 상태로 진행하는 게임을 말한다. 그리고 무한 스크롤이란 플레이어가 죽을 때까지 끊임없이 게임 세계를 스크롤하는 방식을 말한다. 잘 알려진 무한 횡 스크롤 게임으로 〈제트팩 조이라이드(Jetpack Joyride)〉가 있다. 13장에서 살펴볼 〈Ship Attack〉이라는 예제 게임은 2D 공간에서 펼쳐지는 무한 횡 스크롤 게임으로, cocos2d 프레임워크를 사용해서 오브젝티브C로 만든 iOS용 게임이다.
14장, PC, 맥용 타워 디펜스 게임 예제
타워 디펜스는 꽤 오랫동안 명맥을 이어온 장르지만 사실상 〈스타크래프트〉와 〈워크래프트 III〉 같은 게임의 유즈맵(사용자가 직접 만든 맵)을 계기로 주목받기 시작했다. 타워 디펜스는 요즘 큰 인기를 누리고 있는 장르로 거의 모든 게임 플랫폼에서 수많은 타워 디펜스 게임을 찾아볼 수 있다.
14장에서는 미래가 배경인 〈__Defense〉라는 타워 디펜스 게임을 구현해볼 예정이다. 이미지는 3D지만 실제 게임 플레이는 2D 평면상에서 이뤄진다. 게임의 코드는 XNA와 모노 게임 프레임워크를 사용해서 C#으로 만들었다.
부록A, 연습 문제 풀이
1장에서 12장까지의 연습문제에 대한 해답을 제공한다.
부록B, 유용한 프로그래밍 툴
다양한 툴을 통해 프로그램의 에러를 줄이고 프로그래머의 생산성을 높일 수 있다. 부록 B에서는 거의 모든 전문 개발자가 매일같이 사용하는 유용한 툴 몇 가지를 소개한다. 여기서 소개하는 툴은 매우 보편적인 툴이므로 사용법을 잘 익혀두면 게임 프로그램뿐만 아니라 다른 프로그램을 만들 때도 유용하게 쓸 수 있다.
상세 페이지
목차
목차
- 1장 게임 프로그래밍 개요
- 비디오 게임 프로그래밍의 발전
- 게임 루프
- 시간과 게임
- 게임 오브젝트
- 요약
- 연습 문제
- 참고 문헌
- 2장 2D 그래픽
- 2D 렌더링의 토대
- 스프라이트
- 스크롤
- 타일 맵
- 요약
- 연습 문제
- 참고 문헌
- 3장 선형 대수학
- 벡터
- 행렬
- 요약
- 연습 문제
- 참고 문헌
- 4장 3D 그래픽
- 3D의 기초
- 좌표 공간
- 조명과 셰이딩
- 가시성
- 월드 변환 재검토
- 요약
- 연습 문제
- 참고 문헌
- 5장 입력
- 입력 장치
- 이벤트 기반 입력 시스템
- 모바일 입력
- 요약
- 연습 문제
- 참고 문헌
- 6장 사운드
- 기본적인 사운드
- 3D 사운드
- 디지털 신호 처리
- 기타 사운드에 관한 주제
- 요약
- 참고 문헌
- 7장 물리학
- 평면, 반직선, 선분
- 충돌체
- 충돌 확인
- 물리학을 바탕으로 한 움직임
- 물리학 미들웨어
- 요약
- 연습 문제
- 참고 문헌
- 8장 카메라
- 카메라의 종류
- 원근 투영
- 카메라 구현
- 카메라를 뒷받침하는 알고리즘
- 요약
- 연습 문제
- 참고 문헌
- 9장 인공지능
- '실제' AI와 게임의 AI
- 길 찾기
- 상태 기반 행동
- 전략과 계획
- 요약
- 연습 문제
- 참고 문헌
- 10장 사용자 인터페이스
- 메뉴 시스템
- HUD의 구성 요소
- 기타 UI 고려사항
- 요약
- 연습 문제
- 참고 문헌
- 11장 스크립트 언어와 데이터 형식
- 스크립트 언어
- 스크립트 언어의 구현
- 데이터 형식
- 사례 연구: <월드 오브 워크래프트>의 UI MOD
- 요약
- 연습 문제
- 참고 문헌
- 12장 네트워크
- 프로토콜
- 네트워크 토폴로지
- 부정행위
- 요약
- 연습 문제
- 참고 문헌
- 13장 iOS용 횡 스크롤 게임 예제
- 개요
- 코드 분석
- 과제
- 요약
- 14장 PC, 맥용 타워 디펜스 게임 예제
- 개요
- 코드 분석
- 과제
- 요약
- 부록A 연습 문제 풀이
- 부록B 유용한 프로그래밍 툴