"Python과 Pygame으로 그래픽 게임에 도전해 보자.”
이 책은 Pygame 프레임워크(Pygame 라이브러리)와 Python 프로그래밍 언어를 사용하여 그래픽 컴퓨터 게임을 만드는 방법에 대해 다루고 있다. 중급 프로그래머 이상을 대상으로 하고 있지만, Python은 배우기에 그리 어렵지 않은 언어이므로 책에 나오는 소스 코드 예제를 천천히 따라해 보면 누구나 쉽게 이해할 수 있다.
기존에 출간된 Python 관련 도서들이 대부분 기본 입문 내용이나 웹 프로그래밍 관련 내용들을 다루고 있는데 반해 이 책은 유일하게 Pygame 라이브러리에 대한 소개와 함께 2D 그래픽 게임을 만드는 방법에 대해 설명하고 있다. 저자가 직접 만든 게임 소스 코드 전체를 수록해 놓았으며, 코드가 어떻게 작동하는지 설명하고 있기 때문에 실제 게임 프로그램에서 Pygame 라이브러리를 어떻게 이용하는지 쉽게 알 수 있다.
목차
Chapter 01 Python과 Pygame 설치하기
시작하기 전 알아두어야 할 사항
Python 다운로드해서 설치하기
Windows 설치 방법
Max OS X 설치 방법
Ubuntu 및 Linux 설치 방법
Python 시작하기
Pygame 설치하기
책 사용법
소스 코드
그래픽과 사운드 파일 다운로드
라인넘버와 스페이스
자동 줄 바꿈
온라인으로 코드 검사하기
http://invpy.com에서 더 많은 정보 찾아보기
Chapter 02 Pygame의 기본
GUI 대 CLI
Pygame으로 만든 ‘Hello World’ 소스 코드
게임 루프와 게임 스테이트
Pygame.event.Event 객체
Quit 이벤트와 pygame.quit() 함수
픽셀 좌표
함수, 메소드, 생성자 함수(Constructor Function), 모듈 내 함수에 대한 주의사항과 차이점
Surface 객체와 윈도우
색깔
투명색
pygame.Color 객체
Rect 객체
기본 형태 그리기 함수
pygame.PixelArray 객체
pygame.display.update() 함수
애니메이션
초당 프레임과 pygame.time.Clock 객체
pygame.image.load()와 blit()로 이미지 그리기
폰트
안티 앨리어싱
소리 재생하기
요약
Chapter 03 메모리 퍼즐
메모리 퍼즐하기
중첩된 for문
메모리 퍼즐 소스 코드
크레디트와 import 문
매직 넘버는 좋지 않다
assert 문으로 Sanity Checks
숫자가 짝수인지 홀수인지 알아내기
가능한 자주, 빨리 크래시가 일어날수록 좋다
소스 코드 예쁘게 만들기
문자열 대신 상수 변수 사용하기
아이콘이 충분한지 확인하기
Tuple 대 List, Immutable 대 Mutable
아이템이 하나인 튜플은 뒤에 쉼표가 따라와야 한다
리스트와 튜플 사이에 변환하기
Global문 그리고 전역변수가 문제인 이유
데이터 구조와 2D 리스트
게임을 시작하는 애니메이션
게임 루프
이벤트 처리 루프
어느 상자 위에 마우스 커서가 있는지 알아내기
첫 번째 클릭한 상자 처리하기
짝이 맞지 않는 아이콘 처리하기
플레이어가 이긴 경우 처리하기
게임 상태를 화면에 그리기
‘열린 상자’에 대한 데이터 구조 만들기
게임판 데이터 구조 만들기 : 1단계-가능한 모든 아이콘 조합하기
2단계-모든 아이콘을 섞은 다음 추려내기
3단계-게임판에 아이콘 배치하기
2차원 리스트로 가르기
서로 다른 좌표계
픽셀 좌표계에서 게임판 좌표계로 변환하기
아이콘 그리기 그리고 Syntactic Sugar
게임판 아이콘의 형태와 색깔을 얻는 Syntactic Sugar
상자 덮개 그리기
닫히고 열리는 애니메이션 처리하기
전체 게임판 그리기
하이라이트 그리기
‘게임 시작’ 애니메이션
상자 그룹을 보여주고 닫기
‘게임 승리’ 애니메이션
플레이어가 승리했는지 알아내기
왜 main() 함수를 신경 쓰는가
왜 가독성에 신경 쓰는가
요약 그리고 해킹 제안
Chapter 04 슬라이드 퍼즐
슬라이드 퍼즐하기
슬라이드 퍼즐 소스 코드
두 번째 버전과 유사한 첫 번째 버전
버튼 설정하기
단순한 코드로 똑똑해지기
게임 루프
버튼 클릭하기
마우스로 타일 밀기
키보드로 타일 밀기
in 연산자로 ‘이들 중 하나와 일치’ 트릭 쓰기
WASD와 화살표 키
타일 밀기를 실제로 실행하기
IDLE와 Pygame 프로그램 종료하기
특정 이벤트 검사하기, Pygame의 이벤트 큐에 이벤트 포스팅하기
게임판 데이터 구조 만들기
빈 칸 위치는 그때그때 찾아낸다
게임판 데이터 구조를 갱신해서 이동하기
왜 Assertion을 쓰면 안 될까?
무작위적이지 않은 움직임 얻기
타일 좌표를 픽셀 좌표로 변환하기
픽셀 좌표를 게임판 좌표로 변환하기
타일 그리기
화면상에 문자열 보여주기
게임판 그리기
게임판 테두리 그리기
버튼 그리기
타일 슬라이드 애니메이션
copy() Surface 메소드
새 퍼즐 만들기
보드 리셋 애니메이션
시간vs메모리 상쇄 효과
아무도 몇 바이트는 신경 쓰지 않는다
아무도 몇 밀리언 나노세컨드는 신경 쓰지 않는다
요약
Chapter 05 시뮬레이트
시뮬레이트 게임하기
시뮬레이트 소스 코드
일반적인 시작 부분
버튼 설정하기
main() 함수
프로그램에서 사용한 지역변수
테두리 그리기와 입력 처리하기
마우스 클릭 검사하기
키보드 입력 검사하기
게임 루프의 2가지 상태
플레이어가 맞는 버튼을 눌렀는지 알아내기
기준 시간(Epoch time)
화면에 게임판 그리기
기존의 terminate()함수
상수 재활용하기
깜박이는 버튼 애니메이션
버튼 그리기
배경 바뀌는 애니메이션
게임 종료 애니메이션
픽셀 좌표계를 버튼으로 변환하기
암묵적인 것보다 명시적인 것이 낫다
Chapter 06 워미
워미(wormy)
워미 소스 코드
격자
셋업 코드
main() 함수
분리한 runGame() 함수
이벤트 처리 루프
충돌 감지
사과와의 충돌 감지
벌레 움직이기
insert() 리스트 메소드
화면 그리기
화면에 ‘Press a key’ 텍스트 그리기
checkForKeyPress() 함수
시작 화면
시작 화면 텍스트 회전하기
회전만으로는 완전하지 않다
사과가 나타날 위치 결정하기
게임 종료 화면
그리기 함수
변수를 재활용하지 마라
Chapter 07 테트로미노
테트로미노
테트로미노 용어 정리
테트로미노 소스 코드
셋업 코드
키를 누르고 있는 동안의 타이밍 설정 상수
셋업 코드 추가
이벤트 처리 루프
여러 줄에 걸쳐 코드 나누기
main() 함수
새 게임 시작
게임 루프
이벤트 처리 루프
게임을 잠시 멈추기
사용자 입력을 처리하기 위해 움직임 관련 변수를 사용하기
밀거나 회전했을 때 유효한지 확인하기
바닥을 찾아내기
키를 누르고 있는 동안 움직이기
피스가 ‘자연스럽게’ 떨어지도록 만들기
스크린상에 모두 그리기
makeTextObjs() - 텍스트를 만드는 단축 함수
기존의 terminate() 함수
checkForKeyPress()에서 키 눌림 이벤트가 발생했는지 기다리기
showTextScreen() - 보통의 텍스트 스크린 함수
checkForQuit() 함수
calculateLevelAndFallFreq() 함수
getNewPiece() 함수로 새 피스 만들기
보드 데이터 구조에 피스 추가하기
새 보드 데이터 구조 만들기
isOnBoard()와 isValidPosition() 함수
완전한 한 줄이 되었는지 검사해서 없애기
게시판 좌표계를 픽셀 좌표계로 전환하기
보드나 화면 어딘가에 상자 그리기
스크린에 모두 그리기
점수와 현재 레벨 텍스트 그리기
보드나 화면 어딘가에 피스 그리기
‘다음’ 피스 그리기
요약
Chapter 08 다람쥐 먹기
다람쥐 먹기(Squirrel Eat Squirrel)
다람쥐 먹기 디자인
다람쥐 먹기 소스 코드
셋업 코드
데이터 구조 설명
main() 함수
pygame.transform.flip() 함수
좀 더 상세히 설명한 게임 상태
일반적으로 텍스트 생성 코드
카메라
활성 영역(Active Area)
게임 월드 안의 물건의 위치 추적하기
잔디부터 시작하기
게임 루프
무적 상태를 꺼야 하는지 검사
적 다람쥐 움직이기
멀리 있는 잔디와 다람쥐 객체 없애기
리스트에 있는 아이템을 지울 때 리스트 거꾸로 돌리기
새로운 잔디와 다람쥐 객체 추가하기
카메라 슬랙 그리고 카메라 뷰 옮기기
배경, 잔디, 다람쥐, 헬스 미터 그리기
이벤트 처리 루프
플레이어를 움직이고 점프 확인하기
충돌 감지 : 먹느냐 먹히느냐
게임 종료 화면
승리
그래픽 헬스 미터 그리기
똑같은 terminate() 함수
Sine 함수의 수학
Python 버전2와 하위 호환성(Backward Compatibility)
getRandomVelocity() 함수
다람쥐와 잔디를 추가할 장소 찾기
적 다람쥐 데이터 구조 만들기
다람쥐 이미지 뒤집기
잔디 데이터 구조 만들기
활성 영역 바깥인지 검사하기
요약
Chapter 09 스타 푸셔
스타 푸셔
스타 푸셔 소스 코드
초기 셋업
플레이어를 움직이고 점프확인하기
스타 푸셔의 데이터 구조
‘게임 상태’ 데이터 구조
‘맵’ 데이터 구조
‘레벨 데이터 구조
텍스트 파일 읽기와 쓰기
텍스트 파일과 바이너리 파일
파일에 쓰기
파일에서 읽기
재귀 함수
스택 오버플로우
기저 사례로 스택 오버플로우 방지하기
플러드 필 알고리즘
맵 그리기
레벨이 끝났는지 검사하기
요약
Chapter 10 보너스 게임 4개
플리피, ‘오델로’ 클론
플리피 소스 코드
잉크 채우기, ‘플루드잇’ 클론
잉크 채우기 소스 코드
4개 연속, ‘커넥트포’ 클론
4개 연속 소스 코드
젬젬, ‘비주얼드’ 클론
젬젬 소스 코드
요약
용어해설
인덱스
저자 소개
저자 : 알슈베이가르트
알 슈베이가르트 (Al Sweigart) 캘리포니아 샌프란시스코의 소프트웨어 개발자이다. 자전거 타기, 독서, 자원봉사, 컴퓨터 보안, 유용한 소프트웨어 만들기를 즐긴다. 원래는 텍사스 휴스턴 출신이며 오스틴의 텍사스 대학에서 컴퓨터과학 학위를 받았다. 친절하고 내성적이며 고양이를 좋아하고 하루하루 뇌세포가 늙어가는 것을 걱정한다. 공원에서 다람쥐를 발견하면 바보같이 크게 웃곤 한다. 빈 아파트에서 외로울 때면 NPR 뉴스 리포트를 들으며 마음을 치유한다.