SlideShare uma empresa Scribd logo
1 de 93
Baixar para ler offline
www.hanbit.co.kr
이것이
프로그래밍이다!
이것이 안드로이드다
진정한 안드로이드 개발자로
이끌어줍니다.
SDK 5.0 롤리팝 호환!
책만 보고,
동영상 강좌로도 만족하지 못했다면 Daum
카페 '슈퍼드로이드'에서 만나요
cafe.daum.net/superdroid
박성근 저 | 1,164쪽 | 45,000원
이것이 C언어다
세상에 없던 새로운
C언어 입문서 탄생!
삼성, LG에서 펼쳐졌던
전설의 명강의를 풀타임 동영상 강좌로!
이보다 더 확실한 방법은 없다, 칠판강의
전체 동영상 강좌 유투브 전격 공개!
http://goo.gl/tJK3Tu
서현우 저 | 708쪽 | 25,000원
이것이 자바다
가장 중요한 프로그래밍 언어를 하나
배워야 한다면, 결론은 자바다!
중급 개발자로 나아가기 위한 람다식,
JavaFX, NIO 수록
자바의 모든 것을 알려주는 인터넷 강의
궁금한 것은 카페에서!
cafe.naver.com/thisisjava
신용권 저 | 1,224쪽 | 30,000원
저자직강동영상 제공!
모던 웹을 위한
JavaScript +
jQuery 입문
www.hanbit.co.kr
지금은
모던 웹 시대!
HTML5 분야 부동의 1위 도서
HTML5 표준안 확정에 맞춘 완전 개정판의 귀환!
HTML5 권고안과 최신 웹 브라우저 환경 대응
윤인성 저 | 624쪽 | 30,000원
모던 웹 디자인을 위한
HTML5 +
CSS3 입문
자바스크립트에서 제이쿼리, 제이쿼리 모바일까지
한 권으로 끝낸다!
시대의 흐름에 맞춰 다시 쓴 자바스크립트 교과서
윤인성 저 | 980쪽 | 32,000원
페이스북, 월마트, 링크드인은 왜
Node.js를 선택했는가?
이 물음에 대한 답은 Node.js가 보여주는 빠른 처리 능력 때문이다.
윤인성 저 | 484쪽 | 25,000원
모던 웹을 위한
Node.js
프로그래밍
필요한 것만 배워
바로 현장에서 쓰는 HTML5
순서대로 읽으며 실습할 수 있는 HTML5 자습서
김상형 저 | 700쪽 | 32,000원
HTML5 +
CSS3 정복
게임 매니악스 액션 게임 알고리즘 :
페르시아의 왕자, 슈퍼 마리오, 소닉, 젤다의 전설을 구현하는 기술
초판발행 2015년 7월 1일
지은이 마츠우라 켄이치로, 츠카사 유키 / 옮긴이 Wisdom Teeth / 펴낸이 김태헌
펴낸곳 한빛미디어 (주) / 주소 서울시 마포구 양화로 7길 83 한빛미디어(주) IT출판부
전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124
등록 1999년 6월 24일 제10 – 1779호 / ISBN 978 – 89 –6848 –206-9 93000
총괄 배용석 / 책임편집 최현우 / 기획 이복연 / 편집 백지선
디자인 표지•내지 강은영, 조판 이경숙
영업 김형진, 김진불, 조유미 / 마케팅 박상용, 서은옥 / 제작 박성우
이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로
알려주십시오. 잘못된 책은 구입하신 서점에서 교환해 드립니다. 책값은 뒤표지에 표시되어 있습니다.
한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr
ACTION GAME ALGORITHM MANIACS
Copyright © 2007 Kenichiro Matsuura, Yuki Tsukasa
All rights reserved.
Original Japanese edition published by SB Creative Corp.
Korean translation rights © 2015 by Hanbit Media Inc.
Korean translation rights arranged with SB Creative Corp., Tokyo
through Botong Agency, Seoul, Korea
이 책의 한국어판 저작권은 보통에이전시를 통한 저작권자와의 독점 계약으로 한빛미디어가 소유합니다.
신 저작권법에 의하여 한국 내에서 보호를 받는 저작물이므로 무단 전재와 무단 복제를 금합니다.
지금 하지 않으면 할 수 없는 일이 있습니다.
책으로 펴내고 싶은 아이디어나 원고를 메일 ( writer@hanbit.co.kr ) 로 보내주세요.
한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다.
4
현실에서 할 수 없거나 해보기 어려운 경험이 게임에서는 가능합니다. 길을 가다 몬스터를 잡
거나 건물과 건물 사이를 뛰어다닐 수 있습니다. 그리고 노력한 만큼 보상도 해주죠. 그래서 우
리는 게임에 열광하고, 좋아하는 것을 넘어 나만의 게임을 상상해보고, 또 직접 만들게 되나 봅
니다.
이 책은 지금까지 보았던 멋지고 화려한 게임 액션이 어떻게 만들어졌는지 다양한 예제를 통해
소개하고 있습니다. 수많은 게임 장르 중에서 액션 게임을 선택하신 여러분께 큰 도움이 되었
으면 합니다.
한국 게임 산업의 현황이나 발전 방향에 대해 물으신다면 딱히 드릴 말씀은 없습니다. 그러나
한국 게임 개발자들은 어떤 사람들이냐고 물으시면 그 역사와 환경에 비해 감히 세계 최고라고
말씀드립니다. 주변에서 늘 함께하는 선후배 게임 개발자들을 보며 매일 드는 생각입니다.
그런 분들을 위해, 그리고 원서의 명성과 『게임 매니악스』 시리즈에 누가 되지 않아야 한다는
마음으로 원고를 여러 번 살펴보았습니다. 그래도 어딘가 부족함이 보이겠지만, 이 책을 펼쳐
보시는 현역 게임 개발자 그리고 앞으로 게임 개발자가 되실 여러분께 멋진 참고서가 되어줄
것이라 자신합니다.
끝으로 이 책이 나오기까지 함께 해주신 많은 분들과 한빛미디어 이복연 과장님, 박지영 대리
님, 김진불 차장님께 진심으로 감사드립니다.
2015년 여름
옮긴이_ Wisdom Teeth
옮긴이의 말
5
이 책은 ‘액션 게임의 구조’를 설명하는 책이지만 게임 프로그래밍의 입문서로도 활용할 수 있
을 것입니다. 이런 분들께 이 책을 추천합니다.
●● 액션 게임의 내부 구조를 이해하고 게임을 더 즐기고 싶다.
●● 액션 게임을 만들고 싶다.
●● 학교 과제로 액션 게임을 만들게 되었으나 어디서부터 시작해야 할지 모르겠다.
●● 대시, 점프, 무기, 아이템 등 다양한 장치의 구현 방법을 알고 싶다.
●● 액션 게임을 구성하는 기술 목록을 찾고 있다.
●● 액션 게임에 대한 열띤 토론을 위한 기본서를 가지고 싶다.
●● 예전에 즐겼거나 만든 액션 게임을 떠올리며 추억에 빠져들고 싶다.
●● 그냥 액션 게임이 좋다.
이 책은 순서에 상관없이 원하는 부분만 골라 읽어도 무방합니다. 그림을 중심으로 설명하고
있으니 그림만이라도 만화를 보듯이 편한 마음으로 보시기 바랍니다. 또한 다양한 기법을 간단
하게 정리한 프로그램을 다수 제공하므로 이를 활용하면 액션 게임을 만들 때 많은 도움이 될
것입니다.
게임 기획자와 디자이너, 심지어 게이머에게도 액션 게임의 세계를 더 깊게 즐기도록 해주는
가이드북이 될 것입니다.
지은이_ 마츠우라 켄이치로, 츠카사 유키
지은이의 말
6
CONTENTS
옮긴이의 말 ...........................................................................................................................
4
지은이의 말 ...........................................................................................................................
5
CHAPTER 0 소개
0.1 액션 게임의 기본 요소 ....................................................................................................
14
0.2 액션 게임에서의 움직임 처리 ...........................................................................................
15
0.2.1 프레임이란 ..........................................................................................................
16
0.3 충돌 판정 처리 ..............................................................................................................
17
0.3.1 충돌 판정 처리의 예 ..............................................................................................
17
0.4 태스크 시스템 ...............................................................................................................
19
0.5 액션 게임 제작 순서 .......................................................................................................
21
0.6 게임 플랫폼과 개발 환경 .................................................................................................
22
0.6.1 게임 플랫폼 .........................................................................................................
22
0.6.2 개발 환경 ............................................................................................................
23
0.7 샘플 프로그램 ...............................................................................................................
24
0.8 샘플 프로그램 실행 방법 .................................................................................................
25
0.9 샘플 프로그램 빌드 환경 .................................................................................................
26
0.10 정리 ..........................................................................................................................
26
CHAPTER 1 이동
1.1 레버 대시 .....................................................................................................................
28
1.2 버튼 대시 .....................................................................................................................
32
1.3 레버 2단 대시 ................................................................................................................
37
1.4 연타 대시 .....................................................................................................................
41
1.5 가속 아이템 ..................................................................................................................
44
7
1.6 얼음에서 미끄러지기 ......................................................................................................
47
1.7 헤엄치기 ......................................................................................................................
51
1.8 라인 이동 .....................................................................................................................
55
1.9 화면 끝 워프 .................................................................................................................
58
1.10 이동하면 생명이 줄어드는 액션 ......................................................................................
63
1.11 레버 입력과 반대 방향으로 움직이기 ...............................................................................
66
1.12 루프 ..........................................................................................................................
69
1.13 정리 ..........................................................................................................................
75
CHAPTER 2 점프
2.1 고정 길이 점프 ..............................................................................................................
78
2.2 가변 길이 점프 ..............................................................................................................
85
2.3 2단 점프 ......................................................................................................................
91
2.4 삼각 점프 .....................................................................................................................
97
2.5 뛰어내리기 ................................................................................................................
103
2.6 점프 비행 ..................................................................................................................
117
2.7 점프 각도 조절 .........................................................................................................
122
2.8 플랫폼 어택 ...............................................................................................................
130
2.9 밟기 .........................................................................................................................
138
2.10 스프링보드 ..............................................................................................................
141
2.11 정리 .......................................................................................................................
147
CHAPTER 3 장치
3.1 로프 .........................................................................................................................
150
3.2 사다리 ......................................................................................................................
154
8
3.3 트램펄린 ...................................................................................................................
160
3.4 밟으면 떨어지는 플랫폼 ...............................................................................................
165
3.5 회전문 ......................................................................................................................
171
3.6 문 밀치기 ..................................................................................................................
177
3.7 문을 닫아 가두기 ........................................................................................................
183
3.8 엘리베이터 ................................................................................................................
189
3.9 움직이는 발판 ............................................................................................................
196
3.10 컨베이어 벨트 ..........................................................................................................
202
3.11 상승 기류 ................................................................................................................
206
3.12 워프 게이트 .............................................................................................................
212
3.13 형태가 바뀌는 통로 ...................................................................................................
216
3.14 벽을 파괴하여 통로 만들기 .........................................................................................
222
3.15 정리 .......................................................................................................................
226
CHAPTER 4 지형 이용
4.1 벽이나 천장에 매달리기 ...............................................................................................
228
4.2 바위 떨어뜨리기 .........................................................................................................
237
4.3 물체 밀기 ..................................................................................................................
243
4.4 얼음 밀기 ..................................................................................................................
248
4.5 자동 구덩이 ..............................................................................................................
253
4.6 수동 구덩이 ...............................................................................................................
265
4.7 로프 치기 ..................................................................................................................
276
4.8 발판 만들기 ...............................................................................................................
284
4.9 벽 쓰러뜨리기 ............................................................................................................
290
4.10 지면 떨어뜨리기 .......................................................................................................
299
4.11 정리 .......................................................................................................................
312
CONTENTS
9
CHAPTER 5 특수 행동
5.1 스케이트보드 타기 ......................................................................................................
314
5.2 자동차 ......................................................................................................................
318
5.3 동물 .........................................................................................................................
323
5.4 시소 .........................................................................................................................
327
5.5 시계추 ......................................................................................................................
333
5.6 웅크리기 ...................................................................................................................
340
5.7 구르기 ......................................................................................................................
343
5.8 거대화 ....................................................................................................................
346
5.9 복수 캐릭터 조작 ........................................................................................................
348
5.10 정리 .......................................................................................................................
351
CHAPTER 6 무기
6.1 검 ............................................................................................................................
354
6.2 채찍 .........................................................................................................................
360
6.3 공 ............................................................................................................................
365
6.4 수류탄 ......................................................................................................................
369
6.5 시한폭탄 ...................................................................................................................
373
6.6 폭연 .........................................................................................................................
375
6.7 기관총 ......................................................................................................................
382
6.8 유도 미사일 ...............................................................................................................
385
6.9 부메랑 ......................................................................................................................
391
6.10 원격 조종 무기 .........................................................................................................
395
6.11 방패 .......................................................................................................................
398
6.12 연막 .......................................................................................................................
401
10
6.13 거품 .......................................................................................................................
405
6.14 무기 교체 ................................................................................................................
412
6.15 정리 .......................................................................................................................
417
CHAPTER 7 아이템
7.1 무적 아이템 ...............................................................................................................
420
7.2 주워 던지는 아이템 .....................................................................................................
424
7.3 떨어져 내려오는 아이템 ...............................................................................................
428
7.4 특정 장소를 통과하면 등장하는 아이템 ...........................................................................
432
7.5 특정 장소를 공격하면 등장하는 아이템 ...........................................................................
435
7.6 정리 .........................................................................................................................
441
CHAPTER 8 미션
8.1 모든 적 쓰러뜨리기 .....................................................................................................
444
8.2 모든 아이템 획득하기 ..................................................................................................
445
8.3 아군 돕기 ..................................................................................................................
446
8.4 페인트 칠하기 ............................................................................................................
448
8.5 목적지로 이동하기 ......................................................................................................
449
8.6 대기열 처리 ...............................................................................................................
450
8.7 물건 쳐내기 ...............................................................................................................
452
8.8 정리 .........................................................................................................................
453
CONTENTS
11
CHAPTER 9 공격
9.1 몸으로 부딪히는 공격 ..................................................................................................
456
9.2 점프 공격 ..................................................................................................................
460
9.3 잡기 공격 ..................................................................................................................
464
9.4 정지 공격 ..................................................................................................................
470
9.5 함정 .........................................................................................................................
476
9.6 전 범위 공격 ..............................................................................................................
479
9.7 차지 공격 ..................................................................................................................
482
9.8 들이받기 공격 ............................................................................................................
488
9.9 낙하물 공격 ..............................................................................................................
493
9.10 콤보 .......................................................................................................................
497
9.11 거리에 따른 공격 변화 ..............................................................................................
501
9.12 후방 공격 ...............................................................................................................
507
9.13 레버 흔들기 공격 ......................................................................................................
511
9.14 정리 .......................................................................................................................
516
부록
Appendix A	 데모 프로그램 일람 .......................................................................................
518
Appendix B	 인용 게임 일람 ............................................................................................
528
찾아보기 �������������������������������������������������������������������������������������������������������������������������������������������������
560
130장 - 소개
소개
CHAPTER  
0
대시 점프를 하여 산을 넘고 계곡을 건너 적을 물리치고 목적지에 도달해야 하는 대담하고
섬세한 게임을 액션 게임이라고 할 수 있습니다. 대부분의 액션 게임은 ‘8방향 버튼 + 점프
버튼 + 공격 버튼’ 정도면 조작할 수 있지만 작품에 따라 완전히 다른 게임성을 제공한다는
점이 액션 게임의 매력입니다. 하드웨어가 진화하며 그래픽과 사운드는 크게 향상되었지만
‘달리고, 뛰고, 도망가고, 수집하다’라는 액션 게임의 본질은 예전부터 거의 변하지 않았습
니다. 최근에는 스마트폰이나 휴대용 게임기, 플래시나 HTML5를 활용한 웹 브라우저 게
임이 보급되어 고전 2D 액션 게임이 다시 주목을 받고 있습니다.
14 게임 매니악스 액션 게임 알고리즘
0.1 액션 게임의 기본 요소
먼저 액션 게임이 어떠한 요소로 구성되어 있는지 확인해봅시다.
액션 게임에 필요한 요소는 그리 많지 않습니다. 대부분은 [그림 0-1]과 같은 요소로 구성됩
니다.
그림 0-1 액션 게임의 기본 구성
지형
무기
적
배경
아이템
점수
캐릭터
●● 캐릭터
플레이어가 조작하는 캐릭터입니다. 인간이나 로봇과 같이 사람의 형태를 띠는 경우가 많으나 동물이나 자동
차, 심지어 인형이나 공룡인 경우도 있습니다.
●● 적
캐릭터에게 공격해오는 상대입니다. 대부분 게임에서는 적과 충돌하면 충격을 받기 때문에 회피의 대상입니다.
●● 무기
캐릭터가 적에게 행하거나 적이 캐릭터에게 행하는 공격입니다. 무기로 적을 공격하면 충격을 주게 됩니다.
●● 지형
스테이지를 구성하는 플랫폼이나 벽 등을 말합니다. 게임에 따라 밧줄, 사다리, 컨베이어 벨트 등 다양한 장치
가 등장합니다.
●● 배경
캐릭터나 적의 배후에 표시되는 하늘이나 나무 등을 말합니다. 화면을 화려하게 꾸미기도 하고, 스크롤하여 속
도감을 표현하기도 합니다. 평소에는 캐릭터나 적이 부딪혀도 아무 일도 일어나지 않습니다.
●● 아이템
캐릭터가 주우면 다양한 효과를 얻게 됩니다. 점수를 얻거나 무적이 되는 등 그 종류는 무궁무진합니다.
150장 - 소개
●● 점수
득점입니다. 보통은 적을 물리쳐 아이템을 줍거나 한 스테이지를 완료하면 점수를 얻을 수 있습니다.
규칙은 게임에 따라 다릅니다. 예를 들어 캐릭터와 적이 충돌하면 충격을 받지 않고 오히려 점
수를 얻는 경우도 있습니다. 이렇듯 게임별로 세세한 차이는 있지만 기본적으로는 지금까지 설
명한 요소를 조합하여 액션 게임을 만듭니다.
0.2 액션 게임에서의 움직임 처리
캐릭터의 매끄러운 동작은 사실 작은 움직임을 연속해서 빠르게 보여주는 것입니다(그림
0-2). 예를 들어 화면의 왼쪽 끝에서 오른쪽 끝까지 움직인다면, 처음에는 화면 폭의 1/100만
움직이고 다음에 다시 1/100을 더 움직이는 식으로, 총 100번의 연속된 움직임을 연이어서 만
들어냅니다.
그림 0-2 액션 게임의 진행
캐릭터를조금움직인다.
1/60초의 짧은
주기를 반복한다.
작은 움직임이 쌓여
연속된 동작으로 보인다.
무기를 조금 움직인다.
배경을 조금 움직인다.
적을 조금 움직인다.
지형을 조금 움직인다.
아이템을조금움직인다.
이 작은 움직임은 대단히 짧은 주기로 반복됩니다. 대부분의 게임에서는 이 주기를 화면 갱신
주기와 맞춥니다. 예를 들어 TV나 PC용 모니터의 일반적인 화면 갱신 주기는 1/60초이므로
게임에서도 1/60초 주기로 갱신합니다. 갱신 주기와 게임 주기를 맞추면 애니메이션을 매끄럽
게 표시할 수 있기 때문입니다.
16 게임 매니악스 액션 게임 알고리즘
적, 무기, 지형, 배경, 아이템 등의 움직임도 캐릭터와 마찬가지로 작은 움직임을 반복해서 만
들어냅니다. 액션 게임의 프로그램은 각 캐릭터·적·무기·지형·배경·아이템 등을 조금씩
움직이게 하는 처리를 1주기로 하고 이것을 반복합니다.
이 짧은 주기로 캐릭터 등을 작게 움직이는 처리가 액션 게임에서 다양한 움직임을 만들어낼
수 있는 열쇠입니다. 이 책에서는 이를 ‘움직임 처리’라고 부르겠습니다. 이 책의 각 장은 많은
부분을 움직임 처리에 쓰이는 알고리즘을 설명하는 데 할애하고 소스 코드를 함께 실어두었습
니다.
0.2.1 프레임이란
화면 전체를 일컬어 프레임frame이라 할 때가 있습니다. 이는 TV와 같은 디스플레이에 쓰이는
용어인데 게임에서도 자주 사용됩니다. 화면 전체를 1초 동안 갱신하는 총 횟수를 ‘초당 프레임’
이라고 부릅니다. 1/60초 주기로 화면 전체를 갱신하는 게임은 초당 60프레임이 되겠지요. 액
션 게임을 비롯한 아케이드 게임의 대부분은 초당 60프레임을 지향합니다. TV나 PC용 모니터
와 같은 디스플레이의 일반적인 화면 갱신 주기에 맞춘 것입니다. 예를 들어 캐릭터를 움직일
때는 1프레임별로 조금씩 캐릭터의 좌표나 각도를 변화시킵니다. 초당 60프레임이라면 캐릭터
를 60회 움직여 1초 동안의 움직임을 완성합니다. 게임을 즐길 때나 만들 때에도 프레임이라는
단어는 자주 사용됩니다. 다음과 같은 경우가 되겠지요.
“최신 3D 게임을 샀는데, 30프레임밖에 안 돼서 실망했어.”
“액션 게임은 역시 60프레임은 되어야지!”
“어떻게든 1프레임에 모든 처리를 집어넣을 순 없을까?”
1초 동안 갱신할 수 있는 프레임 수를 ‘프레임 레이트frame rate’라고 부릅니다. 프레임 레이트는
fpsframes per second라는 단위로 표기합니다. 1초에 60프레임을 표시한다면 60fps가 됩니다. 게이
머나 게임 프로그래머 간에는 프레임, 프레임 레이트, fps 같은 언어를 명확하게 구분하지 않
고 60프레임, 초당 60프레임, 프레임 레이트가 60, 60fps와 같이 다양한 방식으로 표현됩니다.
170장 - 소개
0.3 충돌 판정 처리
캐릭터나 적과 같은 물체가 서로 접촉했는지 판단하는 처리를 충돌 판정 처리라고 합니다. 액
션 게임에서는 캐릭터와 다른 물체가 가까워지면 충돌 여부를 확인한 뒤, 충돌했다면 적을 물
리치거나 아이템을 줍는 등의 처리가 이어집니다.
액션 게임을 비롯한 다양한 장르의 게임에서 충돌 판정 처리는 대단히 중요한 요소입니다. 슈
팅 게임에서 탄에 맞았는지, 격투 게임에서 주먹이 명중했는지, 스포츠 게임에서 공을 쳤는지
의 여부를 판단하는 것이 모두 충돌 판정 처리입니다.
단순히 움직이는 것만으로는 게임이 되지 않습니다. 캐릭터를 움직이는 처리에 충돌 판정 처리
와 충격 처리, 점수 획득 처리 등이 함께 어우러져야 비로소 게임다운 게임이 됩니다.
0.3.1 충돌 판정 처리의 예
충돌 판정 처리 방법은 다양합니다. 전통적으로는 [그림 0-3]처럼 사각형을 이용해서 판정하
지만 원 등을 이용하는 경우도 있습니다.
이 책에서는 주로 2D의 충돌 판정 처리를 다루지만 3D라 해도 방식은 비슷합니다. 3D에서는
직육면체나 구를 이용하거나 다각형 간의 충돌 여부를 확인합니다. [그림 0-3]에서는 캐릭터
의 충돌 판정을 (CL, CT) ~ (CR, CB), 적의 충돌 판정을 (EL, ET) ~ (ER, EB)라 하였습
니다. 이때 캐릭터와 적이 접촉하는 조건은 다음과 같습니다.
	 CL < ER  EL < CR  CT < EB  ET < CB
18 게임 매니악스 액션 게임 알고리즘
그림 0-3 충돌 판정 처리
캐릭터와 적이 접촉하는 조건
CL < ER  EL < CR  CT < EB  ET < CB
X축
Y축
캐릭터의 충돌 판정
(CL, CT) ~ (CR, CB)
적의 충돌 판정
(EL, ET) ~ (ER, EB)
캐릭터의 중심 좌표에 대해 충돌 판정이 상하·좌우 대칭일 경우에는 [그림 0-4]와 같은 방법
으로 충돌 판정 처리를 할 수도 있습니다. 캐릭터의 중심 좌표를 (CX, CY), 적의 중심 좌표를
(EX, EY), X축 방향 충돌 판정의 거리를 XDIST, Y축 방향 충돌 판정의 거리를 YDIST라고
합니다. 이때 캐릭터와 적이 접촉하는 조건은 다음과 같습니다.
	 abs(CX - EX) < XDIST  abs(CY - EY) < YDIST
abs는 절댓값을 구하는 함수입니다. 이 식은 캐릭터와 적이 X축 방향과 Y축 방향 각각에서 일
정 거리 내에 있다면 접촉했다고 판단한다는 의미입니다.
그림 0-4 상하·좌우 대칭일 경우의 충돌 판정 처리
캐릭터와 적이 접촉하는 조건
abs(CX - EX) < XDIST  abs(CY - EY) < YDIST
X축
Y축
Y축 방향 충돌 판정 거리
YDIST
X축 방향 충돌 판정 거리
XDIST
캐릭터 중심 좌표
(CX, CY)
적 중심 좌표
(EX, EY)
캐릭터 충돌 판정
(CX - XDIST, CY - YDIST) ~
(CX+ XDIST, CY + YDIST)
190장 - 소개
0.4 태스크 시스템
태스크 시스템이란 게임 프로그램에서 사용하는 장치 중 하나입니다. 장르에 상관없이 다양한
게임에 적용할 수 있는데 특히 액션 게임이나 슈팅 게임에 적합합니다. 게임에 따라서는 태스
크 시스템을 다른 이름으로 부르기도 합니다. 태스크 시스템은 복수의 태스크(일)를 병렬 처
리하기 위한 장치입니다. 태스크 시스템을 사용한 게임 프로그램에서는 게임에 등장하는 각종
요소를 태스크에서 표현합니다. 액션 게임을 예로 들면 캐릭터, 적, 무기 등의 사물 처리를 각
각의 태스크가 담당합니다.
태스크는 일종의 스레드 같은 것입니다. 게임에서는 보통 수많은 사물이 동시에 움직여서 자칫
복잡해질 수 있는데, 태스크 시스템을 사용하면 훨씬 쉽게 처리할 수 있습니다. 또한, 태스크
시스템이 제공하는 태스크 생성과 삭제 기능은 ‘무기 발사 처리’나 ‘쓰러진 적 지우기 처리’ 등에
도 도움이 됩니다. 게다가 메모리 할당과 해제까지 관리해주는 태스크 시스템이라면 메모리 단
편화로 인한 성능 하락 걱정 없이도 태스크를 마음껏 생성하고 삭제할 수 있습니다.
태스크 시스템이 태스크를 실행하는 방식은 게임에서의 물체 움직임과 민첩성에 영향을 줍니
다. 예를 들어 캐릭터와 적이 하나씩 있고 무기가 2개인 상황을 가정해봅시다(그림 0-5). 태
스크 시스템은 캐릭터와 적, 그리고 두 무기에 태스크를 하나씩 할당하므로 이때 필요한 태스
크의 수는 총 4개가 됩니다. 그리고 이 태스크들을 차례로 실행하여 이동이나 애니메이션 등을
처리합니다. 그 밖에 플랫폼 등의 지형을 태스크로 처리하기도 합니다.
그림 0-5 캐릭터와 적이 하나씩, 무기가 2개인 상황
적
무기
무기
캐릭터
이번에는 게임에서 사물을 생성하는 상황에 대해 살펴봅니다.
20 게임 매니악스 액션 게임 알고리즘
●● 캐릭터가 등장한다.
●● 적이 출현한다.
●● 캐릭터가 무기를 발사한다.
●● 아이템을 떨군다.
이때 새로운 캐릭터와 적, 무기, 아이템을 생성하게 됩니다. 태스크 시스템에서는 이러한 사물
의 생성이 곧 태스크의 생성을 뜻합니다(그림 0-6). 사물을 삭제해야 하는 상황 역시 다양합
니다. 예를 들면 다음과 같습니다.
●● 주운 아이템을 버린다.
●● 적에게 명중한 무기를 지운다.
●● 무기에 맞은 적을 지운다.
●● 적에 부딪힌 캐릭터를 지운다.
●● 화면 밖으로 사라진 아이템을 지운다.
●● 화면 밖으로 사라진 무기를 지운다.
●● 화면 밖으로 사라진 적을 지운다.
그림 0-6 사물 생성 = 태스크 생성
적 출현
(적 태스크 생성)
무기 발사
(무기 태스크 생성)
아이템 등장
(아이템 태스크 생성)
캐릭터 등장
(캐릭터 태스크 생성)
이러한 예가 바로 캐릭터, 적, 무기, 아이템의 삭제 처리입니다. 태스크 시스템은 태스크를 삭
제해서 사물을 삭제합니다(그림 0-7). 이 책의 샘플들은 태스크 시스템을 이용하여 작성되었
습니다. 태스크 시스템을 잘 몰라도 내용을 이해하는 데에는 전혀 무리가 없으므로 걱정하지
210장 - 소개
않아도 됩니다. 태스크 시스템에 대한 자세한 내용은 『게임 매니악스 탄막 게임 알고리즘』(한
빛미디어, 2014)의 ‘2장 캐릭터 움직이기’를 참고하세요.
그림 0-7 사물 삭제 = 태스크 삭제
무기에 맞은 적을 지운다.
(적 태스크 삭제)
적에 명중한 무기를 지운다.
(무기 태스크 삭제)
주운 아이템을 지운다.
(아이템 태스크 삭제)
0.5 액션 게임 제작 순서
액션 게임 제작을 취미로 하든 일로 하든 또는 학교 과제로 하든 그 기본 순서는 크게 다르지
않습니다(그림 0-8). 여러 사람이 함께 개발한다면 몇 가지 작업이 추가로 필요합니다.
먼저 게임을 구상해야 합니다. 회사 업무라면 기획서를 쓰거나 예산을 확보하는 일도 필요할
것입니다. 기본적인 구상이 어느 정도 완성되면 그래픽, 음향, 프로그램 작성을 시작합니다. 게
임에 필요한 데이터와 프로그램을 만들면서 추가로 구상을 해나가는 경우도 있을 것입니다.
좋은 게임을 만들려면 반복해서 테스트해야 합니다. 단순히 움직이는 수준에 만족하지 않고,
최대한 반복해서 테스트하고 버그를 잡아 밸런스를 조절해야 합니다.
22 게임 매니악스 액션 게임 알고리즘
그림 0-8 액션 게임을 제작하는 순서
개발 시작
구상/아이디어(기획서작성)
음향 제작
통합
테스트
완성?
예
아니오
디버그 및 밸런스 조절
공개 또는 판매
개발 완료
프로그램 작성그래픽 제작
0.6 게임 플랫폼과 개발 환경
이 절에서는 액션 게임 프로그램을 작성하려면 무엇이 필요한지 살펴보겠습니다.
0.6.1 게임 플랫폼
먼저 게임을 실행할 플랫폼을 선택해야 합니다. 주로 이용되는 플랫폼은 다음과 같습니다.
230장 - 소개
●● PC
게임을 만들 때 가장 손쉽게 사용할 수 있는 것이 PC입니다. 선택할 수 있는 프로그래밍 언어가 다양하며 개
발용 라이브러리도 풍부합니다. 아케이드 액션 게임이 PC용으로 이식되어 낮은 가격에 판매되기도 하지만,
전용 게임기와 비교하면 제품 수가 많지는 않아 보입니다.
●● 스마트폰/태블릿
구글 안드로이드와 애플 iOS 등도 개인이 개발해서 직접 판매까지 할 수 있는 플랫폼입니다. 단말기의 성능이
날이 갈수록 향상되어 휴대용 게임기의 성능을 능가하는 제품도 많습니다.
●● 휴대용 게임기
닌텐도 DS, PSP 같은 게임 기기도 있습니다. 자세한 사항은 제조사마다 다릅니다.
●● 가정용 게임기/아케이드(오락실용) 게임기
게임 회사에 다니고 있다면 이 중에서 하나를 선택하는 경우도 있을 것입니다. 양쪽 모두 같은 사양의 하드웨
어를 대량 공급하는 방식이기 때문에 하드웨어 성능을 한계까지 활용하는 게임을 만들기에 적합한 환경입니
다. PC나 스마트폰과는 차별화된 특징입니다.
0.6.2 개발 환경
취미나 동아리 혹은 학교 과제로 게임을 만든다면 PC를 사용하는 경우가 많을 것입니다. PC
에서 게임을 제작한다면 여러 개발 환경 중에서 입맛에 맞는 것을 선택할 수 있습니다. 여기서
는 PC용 개발 환경과 그 특징을 많이 사용되는 툴 위주로 소개하겠습니다.
●● C/C++와 DirectX
윈도우를 사용할 경우 가장 일반적인 선택입니다. 과거에는 볼랜드와 같은 경쟁 C/C++ 컴파일러가 있었지만,
지금은 MS의 비주얼 스튜디오가 평정하다시피 하여 선택의 폭은 넓지 않습니다. DirectX와의 호환성 측면
에서도 비주얼 스튜디오를 선택하는 것이 유리합니다.
●● C/C++와 OpenGL
DirectX보다 OpenGL을 선호하는 프로그래머도 적지 않습니다. OpenGL은 DirectX에 비교해 표준 사양
이 안정적이고 맥이나 리눅스와 같은 환경에서도 이용할 수 있다는 장점이 있습니다.
●● 자바
자바는 언어 중 1, 2위를 다툴 정도로 많이 사용됩니다. 자바는 C/C++보다 성능 측면에서는 불리하지만 지
금은 하드웨어 성능이 워낙 좋아져 좋은 라이브러리를 사용하면 자바로도 충분히 게임을 만들 수 있습니다.
●● 플래시
웹 브라우저만으로 즐길 수 있도록 플래시로 작성한 게임도 있습니다. 플래시는 ActionScript라는 언어를 사
용하여 게임 등의 창의적이고 인터랙티브한 콘텐츠를 만들 수 있습니다. 어도비가 판매하고 있는 정식 개발 환
24 게임 매니악스 액션 게임 알고리즘
경 외에 무료 개발 환경도 구할 수 있습니다.1
●● 액션 게임 작성 툴
프로그래밍 언어나 라이브러리를 공부하지 않아도 그림을 그리거나 간단한 설정을 하기만 하면 게임을 만들
수 있는 툴도 있습니다. 게임 작성 툴 쯔꾸르 시리즈가 유명합니다.2
개발 환경과 라이브러리는 자신이 원하는 것을 선택하는 것이 가장 좋습니다. 이 책의 샘플 프
로그램들은 C/C++로 작성했지만, 다른 언어를 사용하더라도 기본적인 생각의 구조나 방법은
변하지 않습니다. 이 책의 그림이나 해설을 샘플 프로그램에 첨가한다면 다른 언어로 움직이는
프로그램을 만드는 것도 어렵지 않을 것입니다.
필자가 추천하는 방식은 C/C++와 DirectX의 조합, 또는 C/C++와 OpenGL의 조합입니다.
이들보다 더 쉬운 조합도 많이 있지만 여전히 대부분의 게임이 C/C++로 만들어지고 있다는
점을 고려한다면, C/C++를 배워두는 것만으로도 큰 의미가 있을 것입니다.
특히 게임 개발자를 꿈꾼다면 C/C++를 제대로 배워두기 바랍니다. C/C++는 게임 외의 프로
그래밍에서도 널리 사용되므로 C/C++를 익혀두면 아마도 일거리를 못 찾아 고민하지는 않을
것입니다. 욕심을 더 내서 C/C++와 Java 모두 배워두면 완벽하겠지요.
0.7 샘플 프로그램
이 책에서 소개하는 다양한 알고리즘이 실제로 동작하는 것을 확인할 수 있도록 게임 형태의
샘플을 준비하여 다음 URL에서 내려받을 수 있도록 하셨습니다.
●● http://www.hanbit.co.kr/exam/2206
샘플 프로그램은 실제로 캐릭터를 조작해서 점프하고 아이템을 줍고 적을 무찌를 수 있습니다.
액션 게임에 활용되는 다양한 알고리즘을 소개하는 것이 목적이므로 게임의 틀을 만드는 방법
을 설명하지는 않지만 이동, 배경 처리, 키 조작 등 기본 형태는 갖추고 있습니다. 샘플의 소스
코드는 액션 게임의 기본적인 부분을 작성할 때 좋은 참고 자료가 될 것입니다.
1 역자주_ HTML5의 성장으로 플래시는 HTML5+자바스크립트에게 빠르게 자리를 내주고 있습니다.
2 역자주_ https://mirror.enha.kr/wiki/쯔꾸르
250장 - 소개
다만, 책에 수록된 소스 코드는 각 알고리즘의 핵심만 발췌한 것입니다. 관련 처리나 클래스 정
의는 전체 샘플 코드에서 각 알고리즘에 대응하는 부분을 참고하기 바랍니다.
0.8 샘플 프로그램 실행 방법
내려받은 샘플 프로그램은 소스 파일, 데이터 파일, 실행 파일로 구성되어 있습니다. 샘플을 돌
려보려면 OutputExeDebug 폴더 또는 OutputExeRelease 폴더에 있는 Action.exe
파일을 실행하면 됩니다(실행 시 만약 ‘MSVCP120.dll이 없다’는 오류가 뜨면 ‘Visual Studio
2013용 Visual C++ 재배포 가능 패키지’를 인터넷에서 내려받아 설치해주세요). 각 샘플의
내용은 이 책의 각 장에서 소개하고 있습니다.
샘플 프로그램의 시작 화면에서는 키보드나 조이스틱으로 다음과 같은 조작이 가능합니다.
●● 방향키 또는 레버의 좌우로 스테이지 선택(1 스테이지 단위)
●● 방향키 또는 레버의 상하로 스테이지 선택(10 스테이지 단위)
●● C 키 또는 버튼 2로 스테이지 시작
●● V 키 또는 버튼 3으로 일시 정지
●● Esc 키로 프로그램 종료
샘플 프로그램에는 이 책에서 소개하는 수많은 알고리즘에 대응하는 스테이지가 책과 같은 순
으로 정리되어 있습니다. 원하는 스테이지를 선택하여 시작해보기 바랍니다. 스테이지를 시작
한 후에는 다음과 같은 조작이 가능합니다.
●● 방향키 또는 레버의 상하좌우로 캐릭터 이동
●● Z 키 또는 버튼 0으로 점프 또는 공격(스테이지에 따라 다름)
●● X 키 또는 버튼 1로 무기 선택(스테이지에 따라 다름)
●● C 키 또는 버튼 2로 스테이지 선택 화면으로 돌아가기
●● V 키 또는 버튼 3으로 일시 정지
●● Esc 키로 프로그램 종료
샘플 프로그램을 실행할 때 ‘-w 1024 –h 768’처럼 옵션을 주어 해상도를 지정할 수 있습니
다. 전체 화면으로 실행하려면 ‘-fw 1280 –fh 1024’로 지정하면 됩니다.
26 게임 매니악스 액션 게임 알고리즘
0.9 샘플 프로그램 빌드 환경
이 책의 샘플은 Visual C++와 DirectX를 사용하여 개발했습니다. 샘플 프로그램을 빌드하려
면 먼저 이 두 소프트웨어를 설치해야 합니다. 각 소프트웨어는 마이크로소프트 다운로드 센터
등에서 설치할 수 있습니다.
Visual C++ 2013
Visual C++를 사용하기 위해서는 Visual Studio를 설치해야 합니다. 막강한 기능으로 무장
한 유료 버전도 있지만, 이 책의 샘플은 무료인 Community 버전이면 충분합니다.
DirectX SDK
요즘은 DirectX SDK를 Windows SDK에 통합해서 배포하고 있지만, 이 책의 샘플에서 참
조하는 D3DX는 독립적으로 배포되는 DirectX SDK에만 포함되어 있습니다. 샘플 빌드는 독
립적으로 배포된 마지막 버전인 2010년 6월 버전의 DirectX SDK로 최종 검증하였습니다.
0.10 정리
이 장에서는 액션 게임의 전체적인 윤곽을 짚어보며 게임 프로그래밍의 요점과 필요한 개발 환
경을 정리했습니다. 게임 프로그래밍은 절대 어렵지 않습니다. 환경을 준비하거나 라이브러리
의 성격을 파악하는 등 처음의 몇 가지 어려움만 극복하면 됩니다. 먼저 샘플을 조작해보고 빌
드하고 조금씩 수정하는 것부터 시작하면 재미있고 수월하게 액션 게임 프로그래밍의 세계로
들어설 수 있을 것입니다.
무엇보다 액션 게임 만들기는 마음 편하게 먹고 게임을 즐기는 것부터 시작하면 됩니다.
271장 - 이동
이동
CHAPTER  
1
1장에서 설명하는 ‘이동’은 액션 게임에서의 가장 기본적인 액션입니다. 걷기, 뛰기, 점프하
기부터 헤엄치기와 미끄러지기에 이르기까지 그 종류는 정말 다양합니다.
28 게임 매니악스 액션 게임 알고리즘
1.1 레버 대시
레버1
를 특정 방향으로 조작하여 캐릭터를 가속하는 액션입니다. 대부분의 게임에서는 조이스
틱의 레버(또는 이동 버튼)로 플레이어를 상하좌우로 이동시킬 수 있습니다. 여기에 가속 요
소를 곁들이면 훨씬 멋진 움직임이 만들어집니다.
예를 들어 [그림 1-1]처럼 캐릭터가 정지한 상태에서 레버를 오른쪽으로 입력하면 [그림
1-2]와 같이 캐릭터가 오른쪽으로 움직이기 시작합니다. 입력 상태인 채로 계속 놔두면 움직
임의 속도가 점점 빨라집니다(그림 1-3). 캐릭터가 너무 빨리 이동하면 조정하기 어렵기 때문
에 최대 속도는 제한하는 것이 좋습니다. 레버 조작을 중단하면 캐릭터는 점차 감속합니다(그
림 1-4). 또한 레버를 반대로 조작할 경우 더 빠르게 감속시키면 좋겠지요(그림 1-5). 예를
들어 눈앞에 적이나 장애물이 출현하여 급하게 정지하고 싶을 경우, 레버를 반대 방향으로 입
력하여 캐릭터를 정지할 수 있으면 편리할 것입니다. 이 경우에도 한순간에 속도를 0으로 떨어
뜨리는 것이 아니라 조금씩 시간을 두고 감속하는 것이 핵심입니다. 이렇게 하면 빠른 속도로
이동하면 할수록 급정지가 어려워지기 때문에 현실적인 움직임이 만들어집니다. 또한 빨리 이
동할수록 장애물을 피하기 어려워지기 때문에 조작 난이도가 높아집니다. 단, 급하게 감속할
때 흙먼지를 일으키거나 브레이크 음을 울리는 등의 연출이 있으면 재미가 더해질 것입니다.
그림 1-1 정지 상태의 캐릭터	 그림 1-2 레버를 오른쪽으로 입력하면 오른쪽으로 이동한다.
정지 상태의 캐릭터
	
레버를 오른쪽으로 입력하면
오른쪽으로 이동한다.
1 역자주_ 주로 왼손이나 왼손 엄지로 방향을 조작할 때 쓰는 막대를 말합니다. 스틱(stick)이라고도 부릅니다.
291장 - 이동
그림 1-3 레버를 입력한 채 그대로 있으면 가속한다.
레버를 오른쪽으로 입력한 채로
그대로 있으면 가속한다.
그림 1-4 레버 입력을 멈추면 점차 감속한다.	 그림 1-5 레버를 반대 방향으로 입력하면 빠르게 감속한다.
레버 입력을 멈추면 감속한다.
	
레버를 반대 방향으로 입력하면
급하게 감속한다.
레버 대시를 활용한 게임으로는 슈퍼 마리오 브라더스나 소닉 더 헤지혹 등이 있습니다.
슈퍼 마리오 브라더스는 버튼을 사용한 대시(1.2절)도 지원합니다. 소닉 더 헤지혹은 루
프(1.12절) 등을 포함해 기복이 심한 주변 지형이나 캐릭터가 몸을 돌돌 말아 더욱 빠르게 가
속하는 액션(5.7절) 등을 지원합니다.
슈퍼 마리오 브라더스와 소닉 더 헤지혹은 비슷한 점이 많지만 게임성은 상당히 다릅니
다. 굳이 말하자면 슈퍼 마리오 브라더스는 가속과 점프가 급격하기 때문에 지형 패턴을 확
실하게 외우고, 타이밍을 정확히 맞춰 점프해야 하는 게임입니다. 이에 비해 소닉 더 헤지혹
은 점프한 후의 궤도를 조정하기 때문에 조금 더 편하고 쉽게 즐길 수 있는 게임입니다. 같은
레버 대시를 채택한 게임에서도 가속이나 점프 등을 어떻게 활용하느냐에 따라 전혀 다른 게임
이 되기도 합니다. 레버 대시를 사용한 게임 중 조금 독특한 게임으로는 버닝 러버가 있습니
다. 이것은 종-스크롤 자동차 경주 게임으로 레버를 조작하여 자동차를 가속할 수 있습니다.
30 게임 매니악스 액션 게임 알고리즘
알고리즘
레버 대시를 구현하려면 레버의 조작 상태에 맞게 캐릭터의 이동 속도를 변화시킵니다. 캐릭터
가 오른쪽으로 이동한다고 생각해봅시다. 레버가 오른쪽으로 입력되어 있으면 캐릭터의 속도
를 증가시킵니다(그림 1-6). 캐릭터의 속도를 VX, 가속도를 accel이라 하면 다음과 같이 계
산합니다.
VX += accel
반대로, 레버가 왼쪽으로 입력되어 있으면 다음과 같이 계산하여 속도를 떨어뜨립니다(그림
1-7).
VX -= accel
그림 1-6 레버를 오른쪽으로 입력할 경우	 그림 1-7 레버를 왼쪽으로 입력할 경우
레버를 오른쪽으로 입력하면
속도를 증가시킨다.
VX + = accel
속도(VX) 가속도(accel)
	
레버를 왼쪽으로 입력하면
속도를 감소시킨다.
VX -= accel
마지막으로, 레버에 아무런 조작을 하지 않으면 다음과 같이 속도를 천천히 떨어뜨립니다(그
림 1-8).
VX -= accel*0.5f
여기서는 레버를 왼쪽으로 입력했을 때의 절반의 가속도(0.5f)로 감속시켰지만 감속 정도는
자유롭게 결정하면 됩니다.
311장 - 이동
그림 1-8 레버를 조작하지 않을 경우
레버가 입력되지 않는다면
속도를 천천히 감소시킨다.
VX -= accel * 0.5f
프로그램
[코드 1-1]은 레버 대시 프로그램입니다. 레버를 좌우로 입력하여 가속하고 최대 속도와 가속
도 등을 자유롭게 설정할 수 있습니다.
코드 1-1 레버 대시(CLeverDashMan 클래스)
// 캐릭터 움직임을 처리하는 Move 함수
// 이 Move 함수는 1프레임(1/60초)마다 호출된다.
// 인수의 CInputState는 조이스틱의 레버 입력 상태를 표시한다.
// 레버가 왼쪽으로 입력되어 있으면 is-Left가 true로
// 레버가 오른쪽으로 입력되어 있으면 is-Right가 ture가 된다.
bool CLevelDashMan::Move(const CInputState* is) {
// 최대 속도
float max_speed=0.5f;
// 가속도
float accel=0.01f;
// 레버를 오른쪽으로 입력하면 오른쪽으로 가속한다.
// VX는 X축(좌우) 방향의 속도다.
// 배경이 VX값에 따라 스크롤된다.
if (is-Right) {
VX+ =accel;
} else
// 레버를 왼쪽으로 입력하면 감속한다.
if (is-Left) {
32 게임 매니악스 액션 게임 알고리즘
VX- =accel;
} else
// 어느 쪽으로도 레버를 입력하고 있지 않다면 완만하게 감속한다.
{
VX- =accel*0.5f;
}
// 속도가 0 미만이면 0으로 되돌린다.
if (VX<0) VX=0;
// 속도가 최대 속도를 넘으면 최대 속도로 되돌린다.
if (VX>max_speed) VX=max_speed;
// 속도에 따라서 캐릭터 기울기를 다르게 한다.
// Angle 관련해서는 화면에 그리는 부분부터 참고한다.
Angle=VX/max_speed*0.1f;
// 이 샘플에서는 Move 함수가 False를 리턴하면 해당 객체를 삭제한다.
// 여기서는 캐릭터를 삭제할 일이 없기 때문에 항상 true를 돌려준다.
return true;
}
샘플
LEVER DASH는 레버 대시를 구현한 샘플입니다. 처음에 캐릭터는 정지 상태입니다. 레버를 오른쪽으로
입력하면 캐릭터가 가속하고 왼쪽으로 입력하면 감속합니다. 레버를 입력하지 않을 때에는 완만하게 감속합
니다. 더불어 이 샘플에서는 캐릭터의 기울기 정도로 캐릭터 속도를 표현해보았습니다.
● LEVER DASH → p. 518
1.2 버튼 대시
버튼을 눌러 캐릭터를 가속하는 액션입니다. 움직임은 레버 대시와 유사합니다만 버튼으로 조
작합니다.
예를 들어 [그림 1-9]처럼 캐릭터가 오른쪽으로 움직이고 있을 때, 대시 버튼을 누르면 [그림
1-10]과 같이 캐릭터가 오른쪽으로 빠르게 가속합니다. 이때 최대 속도는 레버를 입력하고
772장 - 점프
점프
CHAPTER  
2
점프는 액션 게임에서 이동 다음으로 기본적인 액션입니다. 주인공이 사람이나 동물인 횡
스크롤 게임은 거의 대부분 캐릭터를 점프시킬 수 있습니다. 이 점프에도 여러 가지 변형이
있습니다.
78 게임 매니악스 액션 게임 알고리즘78
2.1 고정 길이 점프
버튼을 누르면 캐릭터가 점프하는 액션입니다. 게임에 따라서는 레버를 위쪽이나 대각선으로
입력했을 때 점프하는 것도 있습니다. 대부분의 경우 캐릭터는 완만한 포물선을 그리며 점프합
니다.
점프를 사용한 게임에는 점프 중에 버튼을 놓는 시점에 따라 점프의 높이를 조절할 수 있는 것
과 점프의 높이가 고정되어 있는 것이 있습니다. 이 책에서는 전자를 ‘가변 길이 점프’, 후자를
‘고정 길이 점프’라고 하여 각각 해설합니다.
여기서는 먼저 고정 길이 점프에 대해 설명하겠습니다. 정지 상태에 있는 캐릭터가 점프할 경
우를 생각해봅시다(그림 2-1). 버튼을 누르면 캐릭터는 점프하여 수직으로 상승하기 시작합
니다(그림 2-2).
그림 2-1 정지 상태의 캐릭터	 그림 2-2 점프 시작
정지 상태의 캐릭터
	
점프를 하면 캐릭터가
수직 상승하기 시작한다.
캐릭터는 상승하다가 중력의 힘으로 인해 점차 상승 속도가 떨어지기 시작합니다(그림 2-3).
그리고 언젠가는 상승 속도가 0이 됩니다(그림 2-4). 여기가 점프의 정점입니다.
정점에 달한 후에는 상승에서 낙하로 이행합니다(그림 2-5). 낙하 중에는 중력으로 인해 점점
속도가 빨라집니다. 그리고 지면에 착지하면 점프는 종료합니다(그림 2-6).
792장 - 점프
그림 2-3 상승 속도가 느려진다.	 그림 2-4 점프의 정점
중력의 힘으로 상승 속도가
점차 느려지기 시작한다.
	
점프의 정점에서는
상승 속도가 0이 된다.
그림 2-5 낙하	 그림 2-6 점프의 종료
중력에 의해서
낙하하다.
중력에 의해서
낙하 속도가 점차 빨라진다.
	
지면에 착지하면
점프는 종료한다.
다음에는 좌우로 이동하면서 점프하는 경우를 생각해봅시다. 세로 방향의 움직임은 정지하고
있는 캐릭터가 점프했을 때와 같습니다. 여기에 가로 방향의 움직임이 더해지면서 점프의 궤적
은 포물선을 그립니다(그림 2-7).
점프를 사용한 게임은 상당히 많습니다. 예를 들어 동키콩은 굴러오는 나무 통들을 점프로
피하면서 전진해 나가는 게임입니다. 이 게임의 점프는 고정 길이 점프이기 때문에 중간에 버
튼을 놓는다고 해서 점프 높이가 달라지지는 않습니다. 일단 점프를 시작하면 점프가 종료할
때까지는 조작이 불가능합니다.
고정 길이 점프보다 가변 길이 점프가 플레이어가 자유롭게 점프할 수 있어 쾌적해 보이지만
80 게임 매니악스 액션 게임 알고리즘80
반드시 그렇지만은 않습니다. 동키콩의 경우 처음부터 나무 통을 뛰어넘기에 가장 적합한 높
이로 점프하도록 설정되어 있습니다. 따라서 플레이어는 버튼을 언제 놓을지 고민할 필요 없
이, 점프하는 타이밍만 계산하여 버튼을 누르기만 하면 됩니다. 결과적으로 리듬에 맞춰 버튼
을 누르며 장애물을 뛰어넘는 경쾌한 게임성을 갖추게 됩니다.
그림 2-7 좌우로 이동하면서 점프
가로로 이동하면서 점프하면 궤
적이 포물선을 그린다.
알고리즘
고정 길이 점프를 구현하려면 캐릭터의 점프 상태와 평상시 상태를 구별해야 합니다. 평상시
상태에서 캐릭터는 레버에 의해 좌우로 움직일 수 있고 점프 버튼을 누르면 점프 상태로 돌입
합니다. 점프를 시작할 때 캐릭터가 정지 상태에 있다면 수직 점프가 되며, 좌우로 움직이고 있
다면 포물선을 그리는 점프가 됩니다.
캐릭터가 점프를 시작할 때 위쪽으로의 처음 속도를 부여합니다(그림 2-8). 예를 들어 캐릭터
의 속도 VY에 일정한 값 jump_speed를 할당합니다.
VY = jump_speed
점프 중에는 아래로의 가속도를 추가합니다(그림 2-9). 예를 들어 1프레임(1/60초)마다
Y축 속도 VY에 가속도 jump_accel을 추가합니다.
VY += jump_accel
812장 - 점프
아래로의 가속도가 추가됨에 따라 어느 일정한 시점을 기준으로 캐릭터는 상승에서 낙하로 이
행합니다. 이 이행 순간이 점프의 정점입니다(그림 2-10). 정점의 높이는 처음 속도(jump_
speed)와 가속도(jump_accel)에 의해 결정됩니다. 처음 속도가 빠르면 빠를수록 정점은 높
아지며 느리면 느릴수록 낮아집니다. 또한 가속도가 클수록 신속히 떨어지는 점프가 되며, 작
을수록 천천히 움직이는 점프가 됩니다. 예를 들어 처음 속도가 빠르고 가속도가 작으면 완만
하면서 높은 점프가 됩니다.
그림 2-8 처음 속도를 부여한다.	 그림 2-9 아래쪽 방향의 가속도를 추가한다.
점프를 시작하면 위쪽 방향의
처음 속도를 부여한다.
VY=jump_speed
	
점프 중에는 속도에 아래쪽 방향의
가속도를 추가한다.
VY += jump_accel
속도
VY
가속도
jump_accel
그림 2-10 상승에서부터 낙하로 이행한다.
가속도
아래쪽 방향의 가속도가 추가됨에 따라
상승에서 낙하로 이행한다.
처음 속도에 가속도를 더해 나아다가,
속도가 0이 된 지점이 점프의 정점이다.
캐릭터가 착지하면 점프는 종료합니다. 점프 상태에서 평상시 상태로 되돌아갑니다. 점프 상태
에서는 레버를 좌우로 움직이거나 점프를 하는 등의 행동은 불가능합니다. 평상시 상태로 되돌
아가 다시 좌우로 움직이거나 점프를 할 수 있습니다.
82 게임 매니악스 액션 게임 알고리즘82
지면에 착지했는지의 여부를 판정하려면 캐릭터의 Y좌표를 조사하거나 지면과의 충돌 판정
처리를 실시합니다(그림 2-11). 지면의 높이가 정해져 있다면 Y좌표를 조사하는 것이 간단
한 방법입니다. 다양한 높이의 지면이 있는 경우에는 지면과의 충돌 판정 처리를 실시해야 합
니다.
좌우로 이동하면서 점프했을 경우에도 Y축 방향의 속도에 대해서는 수직 점프와 같은 계산법
을 적용합니다(그림 2-12). X축 방향(가로 방향)에 대해서는 점프를 시작하는 시점의 속도
를 유지합니다. 예를 들어 점프 시작 시점에 X축 방향의 속도가 VX라면, 점프 중에도 속도는
VX인 채로 좌우로 이동합니다.
그림 2-11 점프의 종료를 판정한다.
착지 여부를 판정하려면 캐릭터의
Y좌표를 조사하거나 지면과의 충돌
판정 처리를 시행한다.
그림 2-12 좌우로 이동하면서 점프했을 때의 속도
Y축 방향의 속도에는
가속도가 추가된다.
VY += jump_accel
속도
VY
가속도
jump_accel
X축 방향의 속도는 점프 시작
시점의 속도를 유지한다.
VX
1493장 - 장치
장치
CHAPTER  
3
액션 게임의 스테이지에는 다양한 장치가 있습니다. 캐릭터는 수많은 장치가 마련된 스테
이지를 대시나 점프를 구사하며 뚫고 지나갑니다. 매력적인 장치는 게임을 재미있게 할 뿐
만 아니라 그 게임만의 개성을 강렬하게 어필합니다.
150 게임 매니악스 액션 게임 알고리즘150
3.1 로프
캐릭터가 붙잡고 이동할 수 있는 장치입니다. 로프를 잡고 좌우로 이동하거나 낙하 도중에 로
프를 붙잡아 정지하는 등의 액션이 가능합니다.
로프에는 횡방향과 종방향이 있는데 여기서는 횡방향 로프에 대해 설명하도록 하겠습니다. 종
방향 로프는 횡방향 로프나 사다리(3.2절)를 응용하여 만들 수 있습니다. 캐릭터는 로프를 붙
잡을 수 있고(그림 3-1), 로프를 잡고 있을 때는 레버를 좌우로 입력해서 캐릭터를 좌우로 이
동시킬 수 있습니다(그림 3-2).
그림 3-1 로프 잡기	 그림 3-2 로프를 이용하여 좌우로 이동하기
캐릭터
로프 	 로프를 잡고 좌우로 이동
할 수 있다.
레버를 아래로 입력하면 캐릭터는 로프를 놓고 낙하합니다(그림 3-3). 일단 낙하가 시작되면
레버를 아래로 입력하지 않아도 낙하 상태가 지속됩니다.
낙하 중에 레버를 아래로 입력하지 않은 상태에서 로프가 캐릭터의 바로 근처에 있는 경우에는
다시 로프를 잡을 수 있습니다(그림 3-4). 온통 로프로 둘러싸인 스테이지에서는 로프를 잡고
좌우로 이동하거나 로프를 놓고 낙하하며 스테이지를 자유롭게 돌아다닐 수 있습니다.
그림 3-3 로프를 놓고 낙하하기	 그림 3-4 낙하 중에 로프 잡기
레버를 아래로 입력
하면 로프를 놓고
낙하한다.
로프를 놓은 후에는
레버를 입력하지 않아도
낙하를 지속한다.
	
낙하 중에 레버를 아래로
입력하지 않고,
근처에 로프가 있다면 다시
로프를 잡을 수 있다.
1513장 - 장치
로프를 사용한 게임으로는 로드런너가 있습니다. 이 게임의 로프는 횡방향으로 제공됩니다.
로프를 이용해서 좌우로 이동하거나 로프를 붙잡아 낙하를 중지할 수 있습니다. 스테이지에 따
라서는 로프가 마치 미로처럼 펼쳐져 있으며, 상당히 복잡한 로프의 망을 이용하여 금덩어리를
수집하거나 적으로부터 도망치는 등의 액션을 즐길 수 있습니다.
동키콩 주니어도 로프를 이용하고 있습니다. 종방향 로프가 제공되는 이 게임은 사다리(3.2
절)와 유사한 성질의 장치가 사용됩니다. 여기서 재미있는 것은 로프를 하나만 잡았을 때와 동
시에 좌우 두 개를 잡았을 때 캐릭터가 로프를 오르내리는 속도가 다르다는 점입니다. 하나만
잡았을 때는 캐릭터의 충돌 영역이 작아지는 만큼 적에게 타격을 받기 어려워지나 오르내리는
속도는 느려집니다. 따라서 주변에 적이 없을 때는 두 개를 붙잡아 이동하고, 적이 가까워지면
하나를 놓는 독특한 액션을 구현할 수 있습니다.
알고리즘
로프 구현의 핵심은 캐릭터가 로프를 잡고 있는지 판정하는 처리입니다. 이것은 일종의 충돌
판정 처리입니다. 충돌 판정 처리에 대해서는 2장(점프)에서도 자세하게 설명하고 있으니 참
조하기 바랍니다.
로프를 잡으려면 다음 조건을 만족해야 합니다(그림 3-5).
●● 캐릭터와 로프의 X좌표 차이값이 일정 범위에 있다.
●● 캐릭터와 로프의 Y좌표 차이값이 일정 범위에 있다.
●● 레버를 아래로 입력하고 있지 않다.
해당 조건을 모두 만족하면 캐릭터는 로프를 잡게 되어 낙하하지 않습니다. 또한 로프를 잡고
좌우로 이동할 수 있습니다.
조건이 만족되지 않으면 캐릭터는 낙하합니다. 낙하 도중에도 모든 로프에 대하여 이들 조건으
로 판정 처리를 시행하고 로프를 잡게 되면 낙하를 중단합니다.
X좌표나 Y좌표의 차이의 범위는 조금 넓게 잡아두는 것이 좋습니다. 그래야 로프를 잡기 쉬워
집니다. 특히, 낙하하는 캐릭터가 충돌 범위를 지나쳐버리지 않도록 Y좌표의 차이는 캐릭터가
1프레임에 이동하는 거리보다 넓게 잡아두어야 합니다.
152 게임 매니악스 액션 게임 알고리즘152
그림 3-5 로프를 잡기 위한 조건
X좌표의 차이값이 일정 범위에 있다.
abs(rx - x) < max_x
로프의 좌표
(rx, ry)
Y좌표의 차이값이 일정 범위에 있다.
ry - y >= min_y  ry - y < max_y
캐릭터의 좌표
(x, y)
레버를 아래로 입력하고 있지 않다.
로프를 잡으면 캐릭터의 Y좌표를 로프의 Y좌표에 맞춥니다. 잡은 순간 캐릭터의 Y좌표는 경
우에 따라 달라지기 때문에 로프를 정확히 붙잡은 모습을 표현하려면 Y좌표를 보정해야 합
니다.
프로그램
[코드 3-1]은 로프 프로그램입니다. 화면에 펼쳐진 로프를 이용한 좌우 이동과 낙하가 가능합
니다. 캐릭터가 화면의 아래 경계까지 낙하했을 때는 화면의 위 경계에서 다시 등장하도록 하
고 있습니다.
코드 3-1 로프(CRopeMan 클래스)
// 캐릭터의 움직임을 처리하는 Move 함수
bool CRopeMan::Move(const CInputState* is) {
// X축 방향의 이동 속도
float speed=0.2f;
// 캐릭터와 로프의 X좌표 차이값의 최대치
float max_x=0.8f;
// 캐릭터와 로프의 Y좌표 차이값의 최소치
float min_y=0.0f;
// 캐릭터와 로프의 Y좌표 차이값의 최대치
1533장 - 장치
float max_y=0.2f;
// 로프를 잡고 있을 때의 처리
if (VY= =0) {
// 레버 입력에 따라 좌우 속도를 설정한다.
VX=0;
if (is-Left) VX= -speed;
if (is-Right) VX=speed;
// X좌표를 갱신하고 화면에서 벗어나지 않도록 보정한다.
X+ =VX;
if (X<0) X=0;
if (X>MAX_X-1) X=MAX_X-1;
}
// 로프를 잡고 있는지 여부를 판정하여
// 잡고 있지 않을 때는 낙하한다.
VY=speed;
if (!is-Down) {
for (CTaskIter i(Game-MoverList); i.HasNext(); ) {
CMover* mover=(CMover*)i.Next();
// 레버를 밑으로 넣고 있지 않으며
// 캐릭터와 로프의 X좌표와 Y좌표의 차이가
// 일정 범위 이내라면 로프를 잡는다.
// 캐릭터의 Y축 방향의 속도를 0으로 하여
// Y좌표를 로프의 Y좌표로 맞춘다.
if (
mover-Type= =1 
abs(mover-X-X)<max_x 
mover-Y-Y>=min_y  mover-Y-Y<max_y
) {
VY=0;
Y=mover-Y;
break;
}
}
}
// Y좌표 갱신
Y+ =VY;
// 캐릭터가 화면 아래 경계를 벗어나면 화면 위쪽에서 다시 등장시킨다.
if (Y>MAX_Y) Y= -1;
154 게임 매니악스 액션 게임 알고리즘154
// X축 방향 속도에 따라 캐릭터를 기울어지도록 표시한다.
Angle=VX/speed*0.1f;
return true;
}
샘플
ROPE는 로프 액션 샘플입니다. 캐릭터가 로프를 잡고 있는 동안에는 좌우 레버로 캐릭터를 이동시킬 수
있습니다. 레버를 아래로 입력하거나 로프의 끝을 넘어가면 캐릭터는 낙하합니다. 낙하 중에 새로운 로프가
있다면 그 로프를 잡습니다. 레버를 아래로 계속 입력하고 있으면 캐릭터는 언제까지나 낙하를 지속합니다.
● ROPE → p. 520
3.2 사다리
캐릭터가 잡고 이동할 수 있는 장치입니다. 사다리를 잡고 있는 동안에는 자유롭게 위아래로
이동할 수 있습니다. 좌우로 조금씩 이동하거나 사다리 위에 올라서는 것도 가능합니다.
캐릭터는 사다리를 잡을 수 있습니다(그림 3-6). 사다리를 잡고 있을 때는 레버를 위아래로
입력하여 캐릭터를 상하로 이동시킬 수 있습니다(그림 3-7).
또한 사다리 위에 올라서거나(그림 3-8) 사다리를 이용하여 좌우로 이동할 수도 있습니다(그
림 3-9). 대부분의 경우 사다리는 상하로 뻗어 있기 때문에 좌우로 이동할 수 있는 폭은 그다
지 넓지 않습니다. 사다리가 서로 인접해 있을 경우 옆 사다리로 갈아탈 수 있는 게임도 있습
니다.
2274장 - 지형 이용
지형 이용
CHAPTER  
4
액션 게임의 스테이지는 일반적으로 산이나 골짜기 같이 기복이 풍부한 지형으로 구성됩니
다. 바위나 얼음 등의 장애물이 배치되어 있기도 합니다. 캐릭터는 위험한 지형이나 장애물
을 회피하기도 하고, 때로는 이들을 역으로 활용하여 적을 공격하는 등 다양한 액션을 선보
입니다.
228 게임 매니악스 액션 게임 알고리즘228
4.1 벽이나 천장에 매달리기
캐릭터가 벽이나 천장에 매달리는 액션입니다. 벽에 붙어 상하로 이동하거나 천장에 붙어 좌우
로 이동할 수도 있습니다. 또한 벽에서 점프하여 다른 벽이나 천장에 매달릴 수도 있습니다.
먼저, 캐릭터가 벽에 매달리는 상황을 생각해봅시다. 벽에 매달리려면 벽과 가까워져야 합니
다(그림 4-1). 벽 근처에서 벽을 향해 점프하면 매달릴 수 있습니다(그림 4-2). 매달린 상태
에서 점프 버튼을 누르면 캐릭터가 점프하면서 벽에서 떨어집니다. 점프를 잘하면 벽에서 더욱
높은 곳에 있는 플랫폼으로 이동할 수도 있습니다(그림 4-3). 벽과 벽이 서로 가까이 있을 때
는 더욱 재미있는 움직임이 가능해집니다(그림 4-4). 벽에서 벽으로 점프를 반복하여 깊이 파
인 구덩이를 기어오를 수 있습니다.
그림 4-1 캐릭터와 벽	 그림 4-2 벽에 매달린다.
캐릭터
벽
	
벽을 향하여
점프한다.
벽에 매달린다.
2294장 - 지형 이용
그림 4-3 벽에서 떨어진다.	 그림 4-4 구덩이에서 기어오른다.
벽에서 플랫폼으로
날아 이동할 수도 있다.
점프하여 벽에서
떨어진다.
	
벽 사이가 가까우면
차례로 날아 이동할 수
있다.
다음으로 캐릭터가 천장에 매달리는 상황에 대해 살펴봅니다(그림 4-5). 천장을 향하여 점프
하면 천장에 매달릴 수 있습니다. 천장에서 내려올 때는 벽의 경우와 마찬가지로 점프 버튼을
누릅니다(그림 4-6). 캐릭터가 뛰어 내리면서 천장에서 떨어져 나옵니다.
그림 4-5 천장에 매달린다.	 그림 4-6 천장에서 떨어진다.
천장에 매달린다.
천장을 향하여
점프한다.
	
뛰어내려 천장에서
떨어진다.
벽이나 천장에 매달릴 수 있는 게임은 보통 주인공이 ‘닌자’인 경우가 많습니다. 벽이나 천장에
매달려 이동한다고 하는 액션 자체가 마치 닌자처럼 보이기 때문입니다. 예를 들어 닌자 용검
전이나 스트라이더 비룡은 모두 닌자가 주인공인 게임입니다. 벽이나 천장에 매달리거나
그대로 상하좌우로 이동할 수 있고, 다른 벽이나 천장으로 날아 옮겨갈 수도 있습니다.
230 게임 매니악스 액션 게임 알고리즘230
닌자가 아닌 다른 캐릭터를 주인공으로 한 게임 채큰 팝에서도 천장에 매달릴 수 있습니다.
이 게임에서는 캐릭터가 천장에 거꾸로 매달린 채 좌우로 움직일 수 있고, 천장의 기복을 타고
넘어갈 수도 있습니다.
벽이나 천장에 매달리는 게임을 재미있게 만들려면 스테이지의 구성이 중요합니다. 매달리는
액션을 살리기 위해 붙기 쉬운 벽이나 천장을 준비하거나 날아 옮겨가기 쉽도록 벽이나 천장의
간격 설정을 조절합니다. 이러한 게임 스테이지는 액션 게임 중에서도 특이 기복이 풍부한 지
형이라 할 수 있습니다.
알고리즘
벽이나 천장에 매달리는 액션을 구현하려면 캐릭터가 공중에 있는 상태와 캐릭터가 무엇인가
에 매달려 있는 상태를 구분합니다. 여기서는 Jump라는 플래그를 사용해서 캐릭터가 공중에
있을 때, 다시 말해 점프 또는 낙하하고 있을 때는 true로 설정합니다(그림 4-7).
벽이나 천장에 매달려 있거나 플랫폼에 올라서 있을 때는 Jump 플래그를 false로 합니다. 캐
릭터가 벽이나 천장에 매달리는 조건은 다음 2가지입니다(그림 4-8).
●● 캐릭터가 천장에서 일정 범위에 있다.
●● 캐릭터의 속도가 위쪽을 향한다.
그림 4-7 캐릭터 상태를 나타내는 플래그	 그림 4-8 천장에 매달린다.
점프를 하면 플래그를 설정한다.
Jump = true
	
이 범위에 캐릭터가
들어오고, 속도가
위쪽을 향하면 천장에
매달렸다고 판정한다.
Jump = false
캐릭터의 속도
캐릭터의 속도에 관한 조건이 있는 이유는 캐릭터가 천장으로 달려들 때와 천장으로부터 떨어
져 낙하할 때를 구별하여 전자의 경우에만 매달리도록 하기 위해서입니다. 그러려면 캐릭터가
상승 중일 때, 즉 속도가 위쪽을 향하는지의 여부를 조사하면 됩니다.
2314장 - 지형 이용
마찬가지로 벽과 플랫폼에 대해서도 판정 처리를 시행하여 벽에 매달렸는지 또는 플랫폼에 올
라섰는지의 여부를 조사합니다. 캐릭터의 X축 방향의 속도를 VX, Y축 방향의 속도를 VY라고
한다면 천장과 플랫폼에 관한 조건은 [그림 4-9], 벽에 관한 조건은 [그림 4-10]처럼 지정됩
니다. 캐릭터가 벽과 천장, 플랫폼에 가까워지는 방향으로 각각 충돌 판정이 있는 것이 핵심입
니다.
Jump 플래그가 false, 다시 말해 무엇인가에 매달려 있는 상태의 캐릭터는 상하 또는 좌우로
이동할 수 있습니다. 캐릭터가 벽에 접촉하고 있으면 벽에 매달려 있는 상태에서 상하로 이동
할 수 있습니다(그림 4-11). 천장에 접촉하고 있을 때와 플랫폼에 올라서 있을 때는 좌우로
이동할 수 있습니다(그림 4-12).
그림 4-9 천장과 플랫폼의 판정	 그림 4-10 벽의 판정
VY > 0이며 이 범위에
캐릭터가 있으면 플랫폼에
올라섰다고 판정한다.
VY < 0이며 이 범위에 캐릭터가
있으면 천장에 매달렸다고
판정한다.
	
VX < 0이며 이 범위에 캐릭터가
있으면 오른쪽에서부터 벽에
매달렸다고 판정한다.
VX > 0이며 이 범위에 캐릭터가
있으면 왼쪽에서부터 벽에 매달렸다고
판정한다.
그림 4-11 벽에 매달린 채로 이동한다.	 그림 4-12 천장에 매달린 채로 이동한다.
Jump == false이자
벽에 접촉하고 있으면,
벽에 매달린 상태로
이동할 수 있다.
	
Jump == false이자 천장에
접촉하고 있으면, 천장에 매달린
상태로 이동할 수 있다.
232 게임 매니악스 액션 게임 알고리즘232
프로그램
[코드 4-1]은 벽이나 천장에 매달리는 액션을 구현한 프로그램입니다. 벽이나 천장에 매달려
서 이동을 하거나 벽에서 벽으로 또는 벽에서 천장으로 날아 옮겨갈 수 있습니다. 벽과 천장,
플랫폼에 대해서 각각 충돌 판정 처리를 시행하는 것이 핵심입니다.
코드 4-1 벽이나 천장에 매달리기(CHangOnWallMan 클래스)
// 캐릭터 움직임을 처리하는 Move 함수
bool CHangOnWallMan::Move(const CInputState* is) {
// X축 방향의 이동 속도
float speed=0.2f;
// 점프의 처음 속도
float jump_speed= -0.3f;
// 점프 중의 가속도
float jump_accel=0.01f;
// 벽, 천장, 플랫폼과의 충돌 판정을 위한 정수
// X좌표 차이의 최대치, Y좌표 차이의 최소치와 최대치
float max_diff=0.6f;
float min_dist=0.0f;
float max_dist=1.3f;
// 벽, 천장, 플랫폼에 접촉했을 때
// 캐릭터를 벽, 천장, 플랫폼에서 적절한 거리로 되돌리기 위한 정수
float adjust_dist=1.0f;
// 위쪽 천장, 왼쪽의 벽, 오른쪽의 벽, 아래쪽 플랫폼에
// 캐릭터가 접촉하고 있는지 여부를 나타내는 플래그
bool hit_up=false;
bool hit_left=false;
bool hit_right=false;
bool hit_down=false;
// 벽, 천장, 플랫폼에 캐릭터가 접촉했는지의 판정
for (CTaskIter i(Game-MoverList); i.HasNext(); ) {
CMover* mover=(CMover*)i.Next();
if (mover-Type= =1) {
3135장 - 특수 행동
특수 행동
CHAPTER  
5
액션 게임의 캐릭터는 뛰거나 점프만 하는 것이 아닙니다. 기구에 올라서거나 장치에 걸려
드는 등 다양한 특수 행동을 행합니다. 웅크리거나 구르기도 하고 혹은 거대화하는 등 캐릭
터 자신의 모습을 변화시키는 액션도 있습니다.
314 게임 매니악스 액션 게임 알고리즘314
5.1 스케이트보드 타기
캐릭터가 스케이트보드를 타고 이동하는 액션입니다. 스케이트보드에 타면 평소 걸을 때보다
더 빠른 속도로 이동할 수 있습니다.
스케이트보드는 [그림 5-1]과 같이 올라서는 이동수단입니다. 타는 방법은 게임에 따라 다른
데, 예를 들어 스케이트보드에 접촉하여 버튼을 누를 경우 올라탈 수 있습니다(그림 5-2).
그림 5-1 스케이트보드	 그림 5-2 스케이트보드에 올라탄다.
캐릭터
스케이트보드 	
버튼을 누른다.
캐릭터가 스케이트
보드에 접촉하고 있다.
스케이트보드에 타고 있을 때 레버를 조작하면 입력한 방향으로 스케이트보드가 이동합니다
(그림 5-3). 버튼을 누르면 스케이트보드에서 내려옵니다.
그림 5-3 스케이트보드로 이동한다.
걸어갈 때보다 빠른
속도로 이동할 수 있다.
스케이트보드를 이용한 게임 중 하나로 메트로 크로스가 있습니다. 이 게임에서도 스케이트
보드에 타면 평소 뛰어가는 것보다 빠른 속도로 이동할 수 있습니다. 또한 평범하게 뛰고 있을
3155장 - 특수 행동
때는 속도가 느려지는 타입의 플랫폼 위를 통과할 때도 스케이트보드에 타고 있으면 속도가 느
려지지 않습니다. 다만, 스케이트보드에 타고 있는 동안에는 점프를 할 수 없기 때문에 레버 조
작만으로 장애물을 피해야 합니다.
게임 원더보이에도 스케이트보드가 등장합니다. 이 게임에서는 스케이트보드에 타고 있어도
점프할 수 있습니다. 또한 적에 접촉했을 때는 스케이트보드에서 내려오게 되지만 그 이상의
페널티는 없습니다.
알고리즘
스케이트보드를 구현하려면 캐릭터가 스케이트보드에 타고 있는 상태와 타고 있지 않은 상태
를 구별합니다. 이를 위해서는 스케이트보드의 형상에 맞춘 충돌 판정 처리를 준비하여 캐릭터
와의 사이에서 충돌 판정을 시행합니다(그림 5-4).
캐릭터와 스케이트보드가 서로 접촉하고 있을 때 버튼을 누르면 스케이트보드에 타고 있는 상
태로 이행합니다. 스케이트보드에 타고 있는 상태에서 버튼을 누르면 이번에는 다시 타고 있지
않은 상태로 되돌아갑니다.
그리고 스케이트보드에 타고 있을 때는 이동의 속도가 빨라집니다. 점프나 급격한 방향 전환을
하지 못하도록 하면 더욱 재미있을 것입니다.
그림 5-4 스케이트보드의 충돌 판정
이 영역에 캐릭터가 오면 접촉하고
있는 것으로 판정
프로그램
[코드 5-1]은 스케이트보드 프로그램입니다. 여기에 처리 내용을 조금 추가하면 스케이트보
드를 타고 있을 때는 점프를 불가능하게 하거나 속도가 느려지지 않도록 하는 등의 규칙을 구
현할 수도 있습니다.
316 게임 매니악스 액션 게임 알고리즘316
코드 5-1 스케이트보드(CSkateboardMan 클래스)
// 캐릭터의 움직임을 처리하는 Move 함수
bool CSkateboardMan::Move(const CInputState* is) {
// 보행 시의 이동 속도
float speed=0.1f;
// 스케이트보드의 이동 속도
// 보행 시의 속도에 대한 배율
float skate_speed=3;
// 스케이트보드와의 충돌 판정을 위한 정수
// X좌표 차이의 최대치
float max_dist=1.0f;
// 레버 입력에 따라 좌우로 이동한다.
VX=0;
if (is-Left) VX= -speed;
if (is-Right) VX=speed;
// 스케이트보드에 타고 있을 때는 이동 속도를 빠르게 한다.
// Skateboard는 스케이트보드의 포인터로
// 스케이트보드에 타고 있으면 skateboard가 NULL 이외가 된다.
if (Skateboard) VX*=skate_speed;
// X좌표를 갱신하고 캐릭터가 화면에서 벗어나지 않도록 보정한다.
X+ =VX;
if (X<0) X=0;
if (X>MAX_X-1) X=MAX_X-1;
// 버튼을 눌렀을 때의 처리
if (!PrevButton  is-Button[0]) {
// 스케이트보드에 타고 있으면 스케이트보드에서 내린다.
if (Skateboard) {
Skateboard=NULL;
} else
// 아직 스케이트보드에 타고 있지 않으며
// 스케이트보드에 접촉하고 있으면
// 스케이트보드에 탄다.
{
for (CTaskIter i(Game-MoverList); i.HasNext(); ) {
CMover* mover=(CMover*)i.Next();
if (
3175장 - 특수 행동
mover-Type= =1 
abs(X-mover-X)<max_dist
) {
Skateboard=(CSkateboard*)mover;
}
}
}
}
// 스케이트보드에 타고 있으면,
// 스케이트보드가 캐릭터와 일체화하여 움직이도록
// 양쪽의 X좌표를 일치시킨다.
// 또한 케릭터가 스케이트보드에 타고 있는 것처럼 보이도록
// 캐릭터의 Y좌표를 조절한다.
if (Skateboard) {
Skateboard-X=X;
Y=Skateboard-Y+0.05f;
} else
// 스케이트보드에 타고 있지 않을 때는
// 캐릭터가 플랫폼 위에 서도록 Y좌표를 조절한다.
{
Y=MAX_Y-2;
}
// 버튼을 누른 순간을 판정하려면
// 현재의 버튼 상태를 보존해둔다.
PrevButton=is-Button[0];
// X축 방향의 속도에 따라 캐릭터를 기울어지도록 표시한다.
// 스케이트보드에 타고 있을 때는 기울이지 않는다.
Angle=Skateboard?0:VX/speed*0.05f;
return true;
}
샘플
SKATEBOARD는 스케이트보드의 샘플입니다. 레버 입력으로 캐릭터를 좌우로 이동시킬 수 있습니다.
스케이트보드에 접촉하고 있는 상태에서 버튼을 누르면 스케이트보드에 올라설 수 있습니다. 스케이트보드
에 타고 있는 동안에는 평상시보다 빨리 이동할 수 있습니다.
● SKATEBOARD → p. 523
318 게임 매니악스 액션 게임 알고리즘318
5.2 자동차
움직이고 있는 자동차의 지붕 위로 뛰어오르는 액션입니다. 캐릭터가 제대로 뛰어오르면 자동
차에 탄 상태로 이동할 수 있습니다.
자동차는 [그림 5-5]와 같이 지면을 달립니다. 자동차에 올라서려면 자동차 근처에서 캐릭터
를 점프시킵니다(그림 5-6).
그림 5-5 자동차	 그림 5-6 자동차에 타려면 점프한다.
자동차캐릭터
	
점프한다.
자동차 지붕에 제대로 착지하면 자동차에 탈 수 있습니다(그림 5-7). 캐릭터가 올라서도 자동
차는 이전과 같은 속도로 계속 달립니다. 올라선 상태의 캐릭터 역시 자동차에 실려 같은 속도
로 전진하며 운반됩니다(그림 5-8).
그림 5-7 자동차 위로 뛰어오른다.	 그림 5-8 자동차와 함께 전진한다.
자동차 위로
뛰어오른다.
자동차는 이전과 같은
속도로 계속해서 달린다.
	
자동차에 실려 같은
속도로 전진한다.
3536장 - 무기
무기
CHAPTER  
6
액션 게임에서 적을 공격하는 방법이 펀치나 킥만 존재하는 것은 아닙니다. 게임에 따라서
는 다양한 무기를 사용하여 공격할 수 있습니다. 검이나 채찍 등의 무기를 이용한 근접 공
격이 있는가 하면, 수류탄이나 기관총 등을 이용하는 원격 공격도 있습니다. 그 밖에도 유
도 미사일이나 부메랑과 같이 특수한 움직임을 보여주는 무기도 있습니다.
354 게임 매니악스 액션 게임 알고리즘354
6.1 검
검을 휘둘러서 적을 베는 공격입니다. 검의 길이는 게임에 따라 다르지만 캐릭터와 비교적 가
까운 곳에 있는 적을 공격한다는 점에서는 유사합니다.
버튼을 누르면 검을 휘두를 수 있습니다(그림 6-1). 검을 휘두를 때 적을 제대로 맞춘다면 데
미지를 줄 수 있습니다(그림 6-2).
검을 휘두르는 모습을 표현하는 방법은 게임에 따라 다릅니다. 심플하게 검을 앞으로 내밀기만
하는 게임이 있는가 하면 검의 이미지를 회전시키거나 애니메이션으로 표시하는 등의 처리를
통해 검을 휘두르는 분위기를 표현하는 게임도 있습니다.
검을 사용한 게임에는 드루아가의 탑이 있습니다. 이 게임에서는 버튼을 계속 누르고 있으면
캐릭터가 전방을 향해 검을 내밉니다. 검이 나와 있는 동안에 적을 푹 찌르듯 캐릭터를 이동시
키면 적에게 데미지를 입힐 수 있습니다.
원평토마전에서도 검을 사용하고 있습니다. 이 게임은 다양한 모드로 제공되는데, 캐릭터를
크게 표시하는 모드에서는 검의 이미지를 회전 표시하여 검을 휘두르는 모습을 표현합니다. 레
버와의 조합에 따라 위쪽 베기나 아래쪽 베기 등 여러 가지 방법으로 공격할 수 있습니다.
골든 액스에서도 검이나 도끼를 휘두를 수 있습니다. 서로 모양은 다르지만 사용법은 검이나
도끼 모두 동일합니다. 이 게임에서는 검을 휘두르는 모습을 애니메이션으로 표현하고 있습니
다. 점프 공격, 하이점프 공격, 배후 공격 등 공격의 변형variation이 많아 서로 다른 검의 사용법
을 즐길 수 있습니다.
라스탄 사가도 검을 이용한 게임입니다. 기본 무기는 검이지만 아이템을 주우면 도끼 등도
사용할 수 있습니다. 단순히 베는 행동 이외에도 레버의 조합에 따라 위에서 찍어내릴 수도 있
고 아래쪽에서 찌를 수도 있습니다.
3556장 - 무기
그림 6-1 검을 휘두른다.	 그림 6-2 적을 벤다.
버튼을 누른다.
검을 휘두른다. 	 적을 벤다.
알고리즘
검을 구현할 때의 핵심은 검을 휘두르는 모습을 어떻게 표현하는가에 있습니다. 예를 들어 검
의 이미지를 회전 표시하면 비교적 간단하게 분위기를 연출할 수 있습니다. 이미지를 표시하는
위치를 조절하여 캐릭터가 검을 손에 쥐고 있는 분위기를 만들면 좋겠습니다.
또 하나의 핵심은 적을 벨 때의 처리입니다. 검과 적의 충돌 판정을 시행하고, 검이 적에 접촉
하면 적에게 데미지를 부여합니다. 충돌 판정은 검의 움직임 처리에서 시행하는 방법과 적의
이동 처리에서 시행하는 방법이 있으며 어느 쪽을 사용해도 무방합니다.
그림 6-3 검의 처리
검을 휘두르기 시작했을
때부터의 경과 시간에 따라
위치나 각도를 변화시킨다.
검에 닿으면 데미지를
받는다.
356 게임 매니악스 액션 게임 알고리즘356
프로그램
[코드 6-1]은 검을 이용한 공격을 구현한 프로그램입니다. 이 샘플에서는 검의 이미지를 회전
시켜 검을 휘두르는 모습을 표현합니다. 검의 이동처리나 표시처리는 캐릭터의 처리 과정에서
시행할 수도 있지만 이 프로그램에서는 검과 캐릭터를 서로 별개의 객체로 처리했습니다.
또한 검과 적의 충돌 판정은 적의 이동처리에서 시행합니다. 적이 검에 닿으면 데미지를 받습
니다. 이 적의 객체는 6장의 다른 샘플에서도 이용합니다.
코드 6-1 검(CWeaponEnemy 클래스, CSwordMan 클래스, CSword 클래스)
// 적의 움직임을 처리하는 Move 함수
// 이 적은 '검' 프로그램 외에 다른 무기의 샘플에서도 사용한다.
bool CWeaponEnemy::Move(const CInputState* is) {
// 공중에 있을 때 가속도
float accel=0.02f;
// 당했을 때 회전 속도
float vangle=0.05f;
// 무기와의 충돌 판정을 위한 정수
// X좌표 차이의 최대치
float max_dist=0.5f;
// 당했을 때의 속도
float knockout_vx=0.4f;
float knockout_vy= -0.5f;
// 상태에 따라 분기한다.
switch (State) {
// 평상시 상태
case 0:
// X좌표의 갱신
X+ =VX;
// 화면의 왼쪽 경계로 나가면 위치를 초기화하여 재등장시킨다.
if (X<-1) Init();
// 무기와 충돌 판정
3576장 - 무기
// 무기와 접촉하면 속도를 설정하고, 당한 상태로 이행한다.
for (CTaskIter i(Game-MoverList); i.HasNext(); ) {
CMover* mover=(CMover*)i.Next();
if (
mover-Type= =1 
abs(X-mover-X)<max_dist*mover-W 
abs(Y-mover-Y)<max_dist*mover-H
) {
// 튕겨 날려진 모습을 표현하기 위해
// 속도를 설정한다.
VX=knockout_vx;
VY=knockout_vy;
// 당한 상태로 이행한다.
State=1;
// 적에 부딪히면 사라지는 무기일 경우에는
// 무기를 삭제한다.
if (RemoveWeapon) i.Remove();
break;
}
}
break;
// 당한 상태
case 1:
// X좌표의 갱신
X+ =VX;
// Y축 방향의 속도를 갱신한다.
VY+ =accel;
// Y축 방향의 갱신
Y+ =VY;
// 당하고 있는 모습을 표시하기 위해 이미지를 회전시킨다.
Angle+ =vangle;
// 화면의 오른쪽 경계로 나가면 위치를 초기화하여 재등장시킨다.
if (X>MAX_X) Init();
break;
}
358 게임 매니악스 액션 게임 알고리즘358
return true;
}
// 캐릭터의 움직임을 처리하는 Move 함수
bool CSwordMan::Move(const CInputState* is) {
// 이동 속도
float speed=0.2f;
// 검을 꺼내지 않을 때의 처리
// Sword는 검을 꺼내고 있는지를 나타낸다.
if (!Sword) {
// 레버 입력에 따라 좌우로 이동한다.
// 공격의 방향을 정하기 위해
// 캐릭터가 이동한 방향을 보존해둔다.
// VX와 VY는 캐릭터의 속도를 나타내는 변수
// DirX와 DirY는 캐릭터의 이동 방향을 나타내는 변수
VX=0;
if (is-Left) {
DirX= -1;
VX= -speed;
}
if (is-Right) {
DirX=1;
VX=speed;
}
// X좌표를 갱신하고 캐릭터가 화면에서 벗어나지 않도록 보정한다.
X+ =VX;
if (X<0) X=0;
if (X>MAX_X-1) X=MAX_X-1;
// 버튼을 누르면 검을 꺼낸다.
// 이 샘플에서는 검의 객체를 작성한다.
if (is-Button[0]) {
new CSword(this);
Sword=true;
}
}
// X축 방향의 속도에 따라 캐릭터를 기울어지도록 표시한다.
Angle=VX/speed*0.1f;
4197장 - 아이템
아이템
CHAPTER  
7
액션 게임에는 다양한 아이템이 등장합니다. 그 중에는 주웠을 때 오히려 데미지를 입는 아
이템도 있지만 대부분의 아이템은 어떤 식으로든 메리트를 제공합니다. 득점으로 연결되는
아이템이 대부분이며 무적 상태가 되는 아이템이나 주워 던질 수 있는 아이템 등도 있습니
다. 또한 아이템의 등장 방법에도 몇 가지 패턴이 있습니다.
420 게임 매니악스 액션 게임 알고리즘420
7.1 무적 아이템
해당 아이템을 주운 캐릭터는 주기적으로 무적 상태를 유지합니다. 무적 상태인 동안에는 적을
몸으로 직접 공격하여 데미지를 입힐 수 있습니다.
아이템은 캐릭터가 접촉하면 주울 수 있습니다(그림 7-1). 아이템을 주운 캐릭터는 일정 시간
무적 상태를 유지합니다(그림 7-2). 여기서는 캐릭터를 거대화하여 무적 상태를 표현했습니
다. 무적 상태에서는 적에게 접촉해도 데미지를 입지 않습니다. 반대로 캐릭터에게 접촉한 적
에게는 데미지를 입힐 수 있습니다.
무적 아이템을 사용한 게임에는 팩맨이 있습니다. 이 게임에서는 특정 아이템을 먹은 캐릭터
가 일정 시간 무적 상태를 유지합니다. 무적 상태에서는 적에게 몸으로 부딪혀 적을 먹어치울
수 있습니다.
채큰 팝에도 무적 아이템이 있습니다. 이 게임에서는 적을 폭탄으로 쓰러뜨리게 되는데 적을
퇴치했을 때 무적 아이템이 나오는 경우가 있습니다. 이것을 주우면 일정 시간 캐릭터는 무적
상태가 되어 몸으로 적을 쓰러뜨릴 수 있습니다.
그림 7-1 아이템을 줍는다.	 그림 7-2 무적 상태
아이템을 줍는다.
	
일정 시간 거대화해진다.
적과 접촉해도 데미지를 입지 않는다.
접촉한 적은
데미지를 입는다.
알고리즘
아이템을 얻어 무적이 되는 액션을 구현하려면 캐릭터의 상태를 관리해야 합니다(그림 7-3).
4217장 - 아이템
평소 상태의 캐릭터가 아이템을 획득하면 무적 상태로 이행합니다. 무적 상태에서 일정 시간이
경과하면 평소 상태로 되돌아갑니다.
그림 7-3 아이템으로 무적이 되는 처리
아이템 획득
일정 시간이 경과
평소 상태
무적 상태
프로그램
[코드 7-1]은 무적 아이템 프로그램입니다. 이 샘플에서는 캐릭터를 크게 표시하여 무적 상태
를 표현했습니다. 그 외에 캐릭터를 깜빡거리게 하거나 캐릭터 주위에 효과를 내는 등의 방법
으로 무적 상태를 표현할 수도 있습니다.
코드 7-1 무적이 되는 아이템(CItem 클래스, CInvincibleItemMan 클래스)
// 아이템의 움직임을 처리하는 Move 함수
bool CItem::Move(const CInputState* is) {
// 각도의 갱신
// 아이템을 좌우로 진동시킨다.
Angle=sin(Time*0.1f)*0.1f;
// 시간의 갱신
Time+ +;
return true;
}
// 캐릭터의 움직임을 처리하는 Move 함수
422 게임 매니악스 액션 게임 알고리즘422
bool CInvincibleItemMan::Move(const CInputState* is) {
// 이동 속도
float speed=0.2f;
// 아이템과의 충돌 판정을 위한 정수
// X좌표 차이의 최대치
float max_dist=0.6f;
// 무적 시간(프레임 수)
int invincible_time=180;
// 레버 입력에 따라 좌우로 이동한다.
VX=0;
if (is-Left) VX= -speed;
if (is-Right) VX=speed;
// X좌표를 갱신하고 화면에서 벗어나지 않도록 보정한다.
X+ =VX;
if (X<0) X=0;
if (X>MAX_X-1) X=MAX_X-1;
// 평소 상태의 처리
// InvincibleTime은 무적 상태의 잔여 시간을 나타낸다.
// 잔여 시간이 0일 때는 평소 상태가 된다.
if (InvincibleTime= =0) {
// 아이템에 접촉하면 아이템을 줍는다.
// 주운 아이템은 좌표를 초기화하여 다시 등장시킨다.
// 또한 무적 시간을 설정한다.
for (CTaskIter i(Game-MoverList); i.HasNext(); ) {
CMover* mover=(CMover*)i.Next();
if (
mover-Type= =2 
abs(X-mover-X)<max_dist 
abs(Y-mover-Y)<max_dist
) {
((CItem*)mover)-Init();
InvincibleTime=invincible_time;
}
}
// 크기와 Y좌표의 설정
W=H=1;
4237장 - 아이템
Y=MAX_Y-2;
// 충돌 판정의 종류를 설정한다.
Type=0;
} else
// 무적 상태의 처리
{
// 무적 시간을 줄인다.
InvincibleTime- -;
// 크기와 Y좌표의 설정
// 무적의 분위기를 나타내기 위해
// 캐릭터를 크게 표시한다.
W=H=2;
Y=MAX_Y-2.5f;
// 충돌 판정의 종류를 설정한다.
// 접촉한 적을 쓰러뜨릴 수 있도록 한다.
Type=1;
}
// X축 방향의 속도에 따라 캐릭터를 기울어지도록 표시한다.
Angle=VX/speed*0.1f;
return true;
}
샘플
INVINCIBLE ITEM은 무적 아이템의 샘플입니다. 레버로 캐릭터를 좌우로 움직이고 아이템을 줍습니다.
아이템을 주우면 캐릭터는 일정 시간 무적 상태가 되어(거대화되어), 몸으로 적을 쓰러뜨릴 수 있습니다.
● INVINCIBLE ITEM → p. 525
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기
『게임 매니악스 액션 게임 알고리즘』 - 미리보기

Mais conteúdo relacionado

Mais procurados

이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014devCAT Studio, NEXON
 
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術Unity Technologies Japan K.K.
 
Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템Youngtaek Oh
 
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기Chris Ohk
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremSeungmo Koo
 
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulElastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulSeungYong Oh
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだTetsuya Kaneuchi
 
게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치Seungjae Lee
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~YEONG-CHEON YOU
 
アプリをエミュレートするアプリの登場とその危険性 / How multi-account app works
アプリをエミュレートするアプリの登場とその危険性 / How multi-account app worksアプリをエミュレートするアプリの登場とその危険性 / How multi-account app works
アプリをエミュレートするアプリの登場とその危険性 / How multi-account app worksTakaki Hoshikawa
 
システムダウンのひみつ
システムダウンのひみつシステムダウンのひみつ
システムダウンのひみつYoshitaka Kawashima
 
delayed_jobの自動再起動
delayed_jobの自動再起動delayed_jobの自動再起動
delayed_jobの自動再起動firewood
 
게임을 위한 최적의 AWS DB 서비스 선정 퀘스트 깨기::최유정::AWS Summit Seoul 2018
게임을 위한 최적의 AWS DB 서비스 선정 퀘스트 깨기::최유정::AWS Summit Seoul 2018 게임을 위한 최적의 AWS DB 서비스 선정 퀘스트 깨기::최유정::AWS Summit Seoul 2018
게임을 위한 최적의 AWS DB 서비스 선정 퀘스트 깨기::최유정::AWS Summit Seoul 2018 Amazon Web Services Korea
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
 
[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가
[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가
[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가Hwanhee Kim
 
Deno で始めるフロントエンド
Deno で始めるフロントエンドDeno で始めるフロントエンド
Deno で始めるフロントエンド虎の穴 開発室
 
PINTOS Operating system homework 2
PINTOS Operating system homework 2PINTOS Operating system homework 2
PINTOS Operating system homework 2Gichan Lee
 
게임 서버 성능 분석하기
게임 서버 성능 분석하기게임 서버 성능 분석하기
게임 서버 성능 분석하기iFunFactory Inc.
 
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiリアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiYuta Okamoto
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 

Mais procurados (20)

이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
이승재, 사례로 배우는 디스어셈블리 디버깅, NDC2014
 
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
【Unite 2017 Tokyo】「黒騎士と白の魔王」にみるC#で統一したサーバー/クライアント開発と現実的なUniRx使いこなし術
 
Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템Python과 Git으로 만드는 모바일 게임 패치 시스템
Python과 Git으로 만드는 모바일 게임 패치 시스템
 
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
선린인터넷고등학교 2021 알고리즘 컨퍼런스 - Rust로 알고리즘 문제 풀어보기
 
Multiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theoremMultiplayer Game Sync Techniques through CAP theorem
Multiplayer Game Sync Techniques through CAP theorem
 
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulElastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだ
 
게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치게임 애셋 스트리밍 패치
게임 애셋 스트리밍 패치
 
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
프로그래밍 언어의 F1머신 C++을 타고 Windows 10 UWP 앱 개발의 세계로~
 
アプリをエミュレートするアプリの登場とその危険性 / How multi-account app works
アプリをエミュレートするアプリの登場とその危険性 / How multi-account app worksアプリをエミュレートするアプリの登場とその危険性 / How multi-account app works
アプリをエミュレートするアプリの登場とその危険性 / How multi-account app works
 
システムダウンのひみつ
システムダウンのひみつシステムダウンのひみつ
システムダウンのひみつ
 
delayed_jobの自動再起動
delayed_jobの自動再起動delayed_jobの自動再起動
delayed_jobの自動再起動
 
게임을 위한 최적의 AWS DB 서비스 선정 퀘스트 깨기::최유정::AWS Summit Seoul 2018
게임을 위한 최적의 AWS DB 서비스 선정 퀘스트 깨기::최유정::AWS Summit Seoul 2018 게임을 위한 최적의 AWS DB 서비스 선정 퀘스트 깨기::최유정::AWS Summit Seoul 2018
게임을 위한 최적의 AWS DB 서비스 선정 퀘스트 깨기::최유정::AWS Summit Seoul 2018
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가
[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가
[NDC2016] 신경망은컨텐츠자동생성의꿈을꾸는가
 
Deno で始めるフロントエンド
Deno で始めるフロントエンドDeno で始めるフロントエンド
Deno で始めるフロントエンド
 
PINTOS Operating system homework 2
PINTOS Operating system homework 2PINTOS Operating system homework 2
PINTOS Operating system homework 2
 
게임 서버 성능 분석하기
게임 서버 성능 분석하기게임 서버 성능 분석하기
게임 서버 성능 분석하기
 
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumiリアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
リアクティブ・アーキテクチャ ~大規模サービスにおける必要性と課題〜 #devsumi
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 

Semelhante a 『게임 매니악스 액션 게임 알고리즘』 - 미리보기

『게임을 움직이는 기술과 발상』 - 미리보기
『게임을 움직이는 기술과 발상』 - 미리보기『게임을 움직이는 기술과 발상』 - 미리보기
『게임을 움직이는 기술과 발상』 - 미리보기복연 이
 
[매거진 홍보물] 게임 어플리케이션 홍보물 The mobile 12년7월호
[매거진 홍보물] 게임 어플리케이션 홍보물 The mobile 12년7월호[매거진 홍보물] 게임 어플리케이션 홍보물 The mobile 12년7월호
[매거진 홍보물] 게임 어플리케이션 홍보물 The mobile 12년7월호Lee Sung Hoon
 
게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013
게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013
게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013영욱 오
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019devCAT Studio, NEXON
 
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011devCAT Studio, NEXON
 
Duroom_SaraNagi_BusinessPlan
Duroom_SaraNagi_BusinessPlanDuroom_SaraNagi_BusinessPlan
Duroom_SaraNagi_BusinessPlan진영 최
 
원소스멀티유즈모바일게임 컨셉기획서
원소스멀티유즈모바일게임 컨셉기획서원소스멀티유즈모바일게임 컨셉기획서
원소스멀티유즈모바일게임 컨셉기획서s.s kim
 
[스타후르츠] 스타트업 스토리 , 그리고 네트워크게임 서비스에 대한 고찰
[스타후르츠] 스타트업 스토리 , 그리고 네트워크게임 서비스에 대한 고찰 [스타후르츠] 스타트업 스토리 , 그리고 네트워크게임 서비스에 대한 고찰
[스타후르츠] 스타트업 스토리 , 그리고 네트워크게임 서비스에 대한 고찰 GAMENEXT Works
 
모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기Sunnyrider
 
내가 원하는 인터넷 서비스
내가 원하는 인터넷 서비스내가 원하는 인터넷 서비스
내가 원하는 인터넷 서비스yous1217
 
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로SeongkukYun
 
스토리텔링을 위한 프레젠테이션 디자인_교육 과정 소개
스토리텔링을 위한 프레젠테이션 디자인_교육 과정 소개스토리텔링을 위한 프레젠테이션 디자인_교육 과정 소개
스토리텔링을 위한 프레젠테이션 디자인_교육 과정 소개Ian Choi
 
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇKieun Jang
 
한국게임의역사
한국게임의역사한국게임의역사
한국게임의역사영욱 오
 
[스마트스터디-윤성국]NDC17 최소 300억은 버는 글로벌 게임 기획
[스마트스터디-윤성국]NDC17 최소 300억은 버는 글로벌 게임 기획[스마트스터디-윤성국]NDC17 최소 300억은 버는 글로벌 게임 기획
[스마트스터디-윤성국]NDC17 최소 300억은 버는 글로벌 게임 기획smartstudy_official
 
글로벌 게임 잼 행사 소개
글로벌 게임 잼 행사 소개글로벌 게임 잼 행사 소개
글로벌 게임 잼 행사 소개Paul Jung
 
[GAMENEXT] 아이디어박스 게임즈 창업 후 1년
[GAMENEXT] 아이디어박스 게임즈 창업 후 1년 [GAMENEXT] 아이디어박스 게임즈 창업 후 1년
[GAMENEXT] 아이디어박스 게임즈 창업 후 1년 GAMENEXT Works
 
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀Young Keun Choe
 
NDC17 글로벌에 통하는 '엣지' 만들기 - 이블팩토리
NDC17 글로벌에 통하는 '엣지' 만들기 - 이블팩토리NDC17 글로벌에 통하는 '엣지' 만들기 - 이블팩토리
NDC17 글로벌에 통하는 '엣지' 만들기 - 이블팩토리Jaeho Hwang
 

Semelhante a 『게임 매니악스 액션 게임 알고리즘』 - 미리보기 (20)

『게임을 움직이는 기술과 발상』 - 미리보기
『게임을 움직이는 기술과 발상』 - 미리보기『게임을 움직이는 기술과 발상』 - 미리보기
『게임을 움직이는 기술과 발상』 - 미리보기
 
[매거진 홍보물] 게임 어플리케이션 홍보물 The mobile 12년7월호
[매거진 홍보물] 게임 어플리케이션 홍보물 The mobile 12년7월호[매거진 홍보물] 게임 어플리케이션 홍보물 The mobile 12년7월호
[매거진 홍보물] 게임 어플리케이션 홍보물 The mobile 12년7월호
 
게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013
게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013
게임 프로그래머로 살아남기 at 지스타 컨퍼런스 2013
 
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
김동건, 할머니가 들려주신 마비노기 개발 전설, NDC2019
 
게임강연정리
게임강연정리게임강연정리
게임강연정리
 
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
 
Duroom_SaraNagi_BusinessPlan
Duroom_SaraNagi_BusinessPlanDuroom_SaraNagi_BusinessPlan
Duroom_SaraNagi_BusinessPlan
 
원소스멀티유즈모바일게임 컨셉기획서
원소스멀티유즈모바일게임 컨셉기획서원소스멀티유즈모바일게임 컨셉기획서
원소스멀티유즈모바일게임 컨셉기획서
 
[스타후르츠] 스타트업 스토리 , 그리고 네트워크게임 서비스에 대한 고찰
[스타후르츠] 스타트업 스토리 , 그리고 네트워크게임 서비스에 대한 고찰 [스타후르츠] 스타트업 스토리 , 그리고 네트워크게임 서비스에 대한 고찰
[스타후르츠] 스타트업 스토리 , 그리고 네트워크게임 서비스에 대한 고찰
 
모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기모바일 게임기획 따라하며 배우기
모바일 게임기획 따라하며 배우기
 
내가 원하는 인터넷 서비스
내가 원하는 인터넷 서비스내가 원하는 인터넷 서비스
내가 원하는 인터넷 서비스
 
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로
최소 300억은 버는 글로벌 게임 기획 : 몬스터슈퍼리그 사례를 중심으로
 
스토리텔링을 위한 프레젠테이션 디자인_교육 과정 소개
스토리텔링을 위한 프레젠테이션 디자인_교육 과정 소개스토리텔링을 위한 프레젠테이션 디자인_교육 과정 소개
스토리텔링을 위한 프레젠테이션 디자인_교육 과정 소개
 
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
 
한국게임의역사
한국게임의역사한국게임의역사
한국게임의역사
 
[스마트스터디-윤성국]NDC17 최소 300억은 버는 글로벌 게임 기획
[스마트스터디-윤성국]NDC17 최소 300억은 버는 글로벌 게임 기획[스마트스터디-윤성국]NDC17 최소 300억은 버는 글로벌 게임 기획
[스마트스터디-윤성국]NDC17 최소 300억은 버는 글로벌 게임 기획
 
글로벌 게임 잼 행사 소개
글로벌 게임 잼 행사 소개글로벌 게임 잼 행사 소개
글로벌 게임 잼 행사 소개
 
[GAMENEXT] 아이디어박스 게임즈 창업 후 1년
[GAMENEXT] 아이디어박스 게임즈 창업 후 1년 [GAMENEXT] 아이디어박스 게임즈 창업 후 1년
[GAMENEXT] 아이디어박스 게임즈 창업 후 1년
 
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀
NDC14 - 엄마와 누나가 게임을 즐기는 법 : [에브리타운 for kakao] 서비스 포스트 모텀
 
NDC17 글로벌에 통하는 '엣지' 만들기 - 이블팩토리
NDC17 글로벌에 통하는 '엣지' 만들기 - 이블팩토리NDC17 글로벌에 통하는 '엣지' 만들기 - 이블팩토리
NDC17 글로벌에 통하는 '엣지' 만들기 - 이블팩토리
 

Mais de 복연 이

​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기복연 이
 
​『골빈해커의 3분 딥러닝』 맛보기
​『골빈해커의 3분 딥러닝』 맛보기​『골빈해커의 3분 딥러닝』 맛보기
​『골빈해커의 3분 딥러닝』 맛보기복연 이
 
​『함수형 반응형 프로그래밍』 맛보기
​『함수형 반응형 프로그래밍』 맛보기​『함수형 반응형 프로그래밍』 맛보기
​『함수형 반응형 프로그래밍』 맛보기복연 이
 
『파이썬 라이브러리를 활용한 머신러닝』 맛보기
『파이썬 라이브러리를 활용한 머신러닝』 맛보기『파이썬 라이브러리를 활용한 머신러닝』 맛보기
『파이썬 라이브러리를 활용한 머신러닝』 맛보기복연 이
 
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기복연 이
 
『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기복연 이
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법복연 이
 
『아마존 웹 서비스 인 액션』 맛보기
『아마존 웹 서비스 인 액션』 맛보기『아마존 웹 서비스 인 액션』 맛보기
『아마존 웹 서비스 인 액션』 맛보기복연 이
 
『밑바닥부터 시작하는 딥러닝』 - 미리보기
『밑바닥부터 시작하는 딥러닝』 - 미리보기『밑바닥부터 시작하는 딥러닝』 - 미리보기
『밑바닥부터 시작하는 딥러닝』 - 미리보기복연 이
 
『행복한 프로그래밍(개정판)』 - 맛보기
『행복한 프로그래밍(개정판)』 - 맛보기『행복한 프로그래밍(개정판)』 - 맛보기
『행복한 프로그래밍(개정판)』 - 맛보기복연 이
 
『오픈스택 인 액션』 - 맛보기
『오픈스택 인 액션』 - 맛보기『오픈스택 인 액션』 - 맛보기
『오픈스택 인 액션』 - 맛보기복연 이
 
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기복연 이
 
『고성능 파이썬』 - 맛보기
『고성능 파이썬』 - 맛보기『고성능 파이썬』 - 맛보기
『고성능 파이썬』 - 맛보기복연 이
 
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기복연 이
 
『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기복연 이
 
『데이터 분석을 통한 네트워크 보안』 - 맛보기
『데이터 분석을 통한 네트워크 보안』 - 맛보기『데이터 분석을 통한 네트워크 보안』 - 맛보기
『데이터 분석을 통한 네트워크 보안』 - 맛보기복연 이
 
『클라우드 시스템을 관리하는 기술』 - 맛보기
『클라우드 시스템을 관리하는 기술』 - 맛보기『클라우드 시스템을 관리하는 기술』 - 맛보기
『클라우드 시스템을 관리하는 기술』 - 맛보기복연 이
 
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기복연 이
 
『누워서 읽는 알고리즘』 - 미리보기
『누워서 읽는 알고리즘』 - 미리보기『누워서 읽는 알고리즘』 - 미리보기
『누워서 읽는 알고리즘』 - 미리보기복연 이
 
『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기복연 이
 

Mais de 복연 이 (20)

​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
​『9가지 사례로 익히는 고급 스파크 분석(2판) 』 맛보기
 
​『골빈해커의 3분 딥러닝』 맛보기
​『골빈해커의 3분 딥러닝』 맛보기​『골빈해커의 3분 딥러닝』 맛보기
​『골빈해커의 3분 딥러닝』 맛보기
 
​『함수형 반응형 프로그래밍』 맛보기
​『함수형 반응형 프로그래밍』 맛보기​『함수형 반응형 프로그래밍』 맛보기
​『함수형 반응형 프로그래밍』 맛보기
 
『파이썬 라이브러리를 활용한 머신러닝』 맛보기
『파이썬 라이브러리를 활용한 머신러닝』 맛보기『파이썬 라이브러리를 활용한 머신러닝』 맛보기
『파이썬 라이브러리를 활용한 머신러닝』 맛보기
 
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
『DirectX 12를 이용한 3D 게임 프로그래밍 입문』 - 맛보기
 
『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기『이펙티브 디버깅』 맛보기
『이펙티브 디버깅』 맛보기
 
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
『이펙티브 디버깅』 - 디버깅 지옥에서 탈출하는 66가지 전략과 기법
 
『아마존 웹 서비스 인 액션』 맛보기
『아마존 웹 서비스 인 액션』 맛보기『아마존 웹 서비스 인 액션』 맛보기
『아마존 웹 서비스 인 액션』 맛보기
 
『밑바닥부터 시작하는 딥러닝』 - 미리보기
『밑바닥부터 시작하는 딥러닝』 - 미리보기『밑바닥부터 시작하는 딥러닝』 - 미리보기
『밑바닥부터 시작하는 딥러닝』 - 미리보기
 
『행복한 프로그래밍(개정판)』 - 맛보기
『행복한 프로그래밍(개정판)』 - 맛보기『행복한 프로그래밍(개정판)』 - 맛보기
『행복한 프로그래밍(개정판)』 - 맛보기
 
『오픈스택 인 액션』 - 맛보기
『오픈스택 인 액션』 - 맛보기『오픈스택 인 액션』 - 맛보기
『오픈스택 인 액션』 - 맛보기
 
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
『빠르게 훑어보는 구글 클라우드 플랫폼』 - 맛보기
 
『고성능 파이썬』 - 맛보기
『고성능 파이썬』 - 맛보기『고성능 파이썬』 - 맛보기
『고성능 파이썬』 - 맛보기
 
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
『9가지 사례로 익히는 고급 스파크 분석』 - 맛보기
 
『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기『Effective Unit Testing』 - 맛보기
『Effective Unit Testing』 - 맛보기
 
『데이터 분석을 통한 네트워크 보안』 - 맛보기
『데이터 분석을 통한 네트워크 보안』 - 맛보기『데이터 분석을 통한 네트워크 보안』 - 맛보기
『데이터 분석을 통한 네트워크 보안』 - 맛보기
 
『클라우드 시스템을 관리하는 기술』 - 맛보기
『클라우드 시스템을 관리하는 기술』 - 맛보기『클라우드 시스템을 관리하는 기술』 - 맛보기
『클라우드 시스템을 관리하는 기술』 - 맛보기
 
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
『크리스 크로퍼드의 인터랙티브 스토리텔링』 맛보기
 
『누워서 읽는 알고리즘』 - 미리보기
『누워서 읽는 알고리즘』 - 미리보기『누워서 읽는 알고리즘』 - 미리보기
『누워서 읽는 알고리즘』 - 미리보기
 
『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기『Modern PHP』 - 미리보기
『Modern PHP』 - 미리보기
 

『게임 매니악스 액션 게임 알고리즘』 - 미리보기

  • 1.
  • 2. www.hanbit.co.kr 이것이 프로그래밍이다! 이것이 안드로이드다 진정한 안드로이드 개발자로 이끌어줍니다. SDK 5.0 롤리팝 호환! 책만 보고, 동영상 강좌로도 만족하지 못했다면 Daum 카페 '슈퍼드로이드'에서 만나요 cafe.daum.net/superdroid 박성근 저 | 1,164쪽 | 45,000원 이것이 C언어다 세상에 없던 새로운 C언어 입문서 탄생! 삼성, LG에서 펼쳐졌던 전설의 명강의를 풀타임 동영상 강좌로! 이보다 더 확실한 방법은 없다, 칠판강의 전체 동영상 강좌 유투브 전격 공개! http://goo.gl/tJK3Tu 서현우 저 | 708쪽 | 25,000원 이것이 자바다 가장 중요한 프로그래밍 언어를 하나 배워야 한다면, 결론은 자바다! 중급 개발자로 나아가기 위한 람다식, JavaFX, NIO 수록 자바의 모든 것을 알려주는 인터넷 강의 궁금한 것은 카페에서! cafe.naver.com/thisisjava 신용권 저 | 1,224쪽 | 30,000원 저자직강동영상 제공!
  • 3. 모던 웹을 위한 JavaScript + jQuery 입문 www.hanbit.co.kr 지금은 모던 웹 시대! HTML5 분야 부동의 1위 도서 HTML5 표준안 확정에 맞춘 완전 개정판의 귀환! HTML5 권고안과 최신 웹 브라우저 환경 대응 윤인성 저 | 624쪽 | 30,000원 모던 웹 디자인을 위한 HTML5 + CSS3 입문 자바스크립트에서 제이쿼리, 제이쿼리 모바일까지 한 권으로 끝낸다! 시대의 흐름에 맞춰 다시 쓴 자바스크립트 교과서 윤인성 저 | 980쪽 | 32,000원 페이스북, 월마트, 링크드인은 왜 Node.js를 선택했는가? 이 물음에 대한 답은 Node.js가 보여주는 빠른 처리 능력 때문이다. 윤인성 저 | 484쪽 | 25,000원 모던 웹을 위한 Node.js 프로그래밍 필요한 것만 배워 바로 현장에서 쓰는 HTML5 순서대로 읽으며 실습할 수 있는 HTML5 자습서 김상형 저 | 700쪽 | 32,000원 HTML5 + CSS3 정복
  • 4.
  • 5. 게임 매니악스 액션 게임 알고리즘 : 페르시아의 왕자, 슈퍼 마리오, 소닉, 젤다의 전설을 구현하는 기술 초판발행 2015년 7월 1일 지은이 마츠우라 켄이치로, 츠카사 유키 / 옮긴이 Wisdom Teeth / 펴낸이 김태헌 펴낸곳 한빛미디어 (주) / 주소 서울시 마포구 양화로 7길 83 한빛미디어(주) IT출판부 전화 02 – 325 – 5544 / 팩스 02 – 336 – 7124 등록 1999년 6월 24일 제10 – 1779호 / ISBN 978 – 89 –6848 –206-9 93000 총괄 배용석 / 책임편집 최현우 / 기획 이복연 / 편집 백지선 디자인 표지•내지 강은영, 조판 이경숙 영업 김형진, 김진불, 조유미 / 마케팅 박상용, 서은옥 / 제작 박성우 이 책에 대한 의견이나 오탈자 및 잘못된 내용에 대한 수정 정보는 한빛미디어(주)의 홈페이지나 아래 이메일로 알려주십시오. 잘못된 책은 구입하신 서점에서 교환해 드립니다. 책값은 뒤표지에 표시되어 있습니다. 한빛미디어 홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr ACTION GAME ALGORITHM MANIACS Copyright © 2007 Kenichiro Matsuura, Yuki Tsukasa All rights reserved. Original Japanese edition published by SB Creative Corp. Korean translation rights © 2015 by Hanbit Media Inc. Korean translation rights arranged with SB Creative Corp., Tokyo through Botong Agency, Seoul, Korea 이 책의 한국어판 저작권은 보통에이전시를 통한 저작권자와의 독점 계약으로 한빛미디어가 소유합니다. 신 저작권법에 의하여 한국 내에서 보호를 받는 저작물이므로 무단 전재와 무단 복제를 금합니다. 지금 하지 않으면 할 수 없는 일이 있습니다. 책으로 펴내고 싶은 아이디어나 원고를 메일 ( writer@hanbit.co.kr ) 로 보내주세요. 한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다.
  • 6.
  • 7. 4 현실에서 할 수 없거나 해보기 어려운 경험이 게임에서는 가능합니다. 길을 가다 몬스터를 잡 거나 건물과 건물 사이를 뛰어다닐 수 있습니다. 그리고 노력한 만큼 보상도 해주죠. 그래서 우 리는 게임에 열광하고, 좋아하는 것을 넘어 나만의 게임을 상상해보고, 또 직접 만들게 되나 봅 니다. 이 책은 지금까지 보았던 멋지고 화려한 게임 액션이 어떻게 만들어졌는지 다양한 예제를 통해 소개하고 있습니다. 수많은 게임 장르 중에서 액션 게임을 선택하신 여러분께 큰 도움이 되었 으면 합니다. 한국 게임 산업의 현황이나 발전 방향에 대해 물으신다면 딱히 드릴 말씀은 없습니다. 그러나 한국 게임 개발자들은 어떤 사람들이냐고 물으시면 그 역사와 환경에 비해 감히 세계 최고라고 말씀드립니다. 주변에서 늘 함께하는 선후배 게임 개발자들을 보며 매일 드는 생각입니다. 그런 분들을 위해, 그리고 원서의 명성과 『게임 매니악스』 시리즈에 누가 되지 않아야 한다는 마음으로 원고를 여러 번 살펴보았습니다. 그래도 어딘가 부족함이 보이겠지만, 이 책을 펼쳐 보시는 현역 게임 개발자 그리고 앞으로 게임 개발자가 되실 여러분께 멋진 참고서가 되어줄 것이라 자신합니다. 끝으로 이 책이 나오기까지 함께 해주신 많은 분들과 한빛미디어 이복연 과장님, 박지영 대리 님, 김진불 차장님께 진심으로 감사드립니다. 2015년 여름 옮긴이_ Wisdom Teeth 옮긴이의 말
  • 8. 5 이 책은 ‘액션 게임의 구조’를 설명하는 책이지만 게임 프로그래밍의 입문서로도 활용할 수 있 을 것입니다. 이런 분들께 이 책을 추천합니다. ●● 액션 게임의 내부 구조를 이해하고 게임을 더 즐기고 싶다. ●● 액션 게임을 만들고 싶다. ●● 학교 과제로 액션 게임을 만들게 되었으나 어디서부터 시작해야 할지 모르겠다. ●● 대시, 점프, 무기, 아이템 등 다양한 장치의 구현 방법을 알고 싶다. ●● 액션 게임을 구성하는 기술 목록을 찾고 있다. ●● 액션 게임에 대한 열띤 토론을 위한 기본서를 가지고 싶다. ●● 예전에 즐겼거나 만든 액션 게임을 떠올리며 추억에 빠져들고 싶다. ●● 그냥 액션 게임이 좋다. 이 책은 순서에 상관없이 원하는 부분만 골라 읽어도 무방합니다. 그림을 중심으로 설명하고 있으니 그림만이라도 만화를 보듯이 편한 마음으로 보시기 바랍니다. 또한 다양한 기법을 간단 하게 정리한 프로그램을 다수 제공하므로 이를 활용하면 액션 게임을 만들 때 많은 도움이 될 것입니다. 게임 기획자와 디자이너, 심지어 게이머에게도 액션 게임의 세계를 더 깊게 즐기도록 해주는 가이드북이 될 것입니다. 지은이_ 마츠우라 켄이치로, 츠카사 유키 지은이의 말
  • 9. 6 CONTENTS 옮긴이의 말 ........................................................................................................................... 4 지은이의 말 ........................................................................................................................... 5 CHAPTER 0 소개 0.1 액션 게임의 기본 요소 .................................................................................................... 14 0.2 액션 게임에서의 움직임 처리 ........................................................................................... 15 0.2.1 프레임이란 .......................................................................................................... 16 0.3 충돌 판정 처리 .............................................................................................................. 17 0.3.1 충돌 판정 처리의 예 .............................................................................................. 17 0.4 태스크 시스템 ............................................................................................................... 19 0.5 액션 게임 제작 순서 ....................................................................................................... 21 0.6 게임 플랫폼과 개발 환경 ................................................................................................. 22 0.6.1 게임 플랫폼 ......................................................................................................... 22 0.6.2 개발 환경 ............................................................................................................ 23 0.7 샘플 프로그램 ............................................................................................................... 24 0.8 샘플 프로그램 실행 방법 ................................................................................................. 25 0.9 샘플 프로그램 빌드 환경 ................................................................................................. 26 0.10 정리 .......................................................................................................................... 26 CHAPTER 1 이동 1.1 레버 대시 ..................................................................................................................... 28 1.2 버튼 대시 ..................................................................................................................... 32 1.3 레버 2단 대시 ................................................................................................................ 37 1.4 연타 대시 ..................................................................................................................... 41 1.5 가속 아이템 .................................................................................................................. 44
  • 10. 7 1.6 얼음에서 미끄러지기 ...................................................................................................... 47 1.7 헤엄치기 ...................................................................................................................... 51 1.8 라인 이동 ..................................................................................................................... 55 1.9 화면 끝 워프 ................................................................................................................. 58 1.10 이동하면 생명이 줄어드는 액션 ...................................................................................... 63 1.11 레버 입력과 반대 방향으로 움직이기 ............................................................................... 66 1.12 루프 .......................................................................................................................... 69 1.13 정리 .......................................................................................................................... 75 CHAPTER 2 점프 2.1 고정 길이 점프 .............................................................................................................. 78 2.2 가변 길이 점프 .............................................................................................................. 85 2.3 2단 점프 ...................................................................................................................... 91 2.4 삼각 점프 ..................................................................................................................... 97 2.5 뛰어내리기 ................................................................................................................ 103 2.6 점프 비행 .................................................................................................................. 117 2.7 점프 각도 조절 ......................................................................................................... 122 2.8 플랫폼 어택 ............................................................................................................... 130 2.9 밟기 ......................................................................................................................... 138 2.10 스프링보드 .............................................................................................................. 141 2.11 정리 ....................................................................................................................... 147 CHAPTER 3 장치 3.1 로프 ......................................................................................................................... 150 3.2 사다리 ...................................................................................................................... 154
  • 11. 8 3.3 트램펄린 ................................................................................................................... 160 3.4 밟으면 떨어지는 플랫폼 ............................................................................................... 165 3.5 회전문 ...................................................................................................................... 171 3.6 문 밀치기 .................................................................................................................. 177 3.7 문을 닫아 가두기 ........................................................................................................ 183 3.8 엘리베이터 ................................................................................................................ 189 3.9 움직이는 발판 ............................................................................................................ 196 3.10 컨베이어 벨트 .......................................................................................................... 202 3.11 상승 기류 ................................................................................................................ 206 3.12 워프 게이트 ............................................................................................................. 212 3.13 형태가 바뀌는 통로 ................................................................................................... 216 3.14 벽을 파괴하여 통로 만들기 ......................................................................................... 222 3.15 정리 ....................................................................................................................... 226 CHAPTER 4 지형 이용 4.1 벽이나 천장에 매달리기 ............................................................................................... 228 4.2 바위 떨어뜨리기 ......................................................................................................... 237 4.3 물체 밀기 .................................................................................................................. 243 4.4 얼음 밀기 .................................................................................................................. 248 4.5 자동 구덩이 .............................................................................................................. 253 4.6 수동 구덩이 ............................................................................................................... 265 4.7 로프 치기 .................................................................................................................. 276 4.8 발판 만들기 ............................................................................................................... 284 4.9 벽 쓰러뜨리기 ............................................................................................................ 290 4.10 지면 떨어뜨리기 ....................................................................................................... 299 4.11 정리 ....................................................................................................................... 312 CONTENTS
  • 12. 9 CHAPTER 5 특수 행동 5.1 스케이트보드 타기 ...................................................................................................... 314 5.2 자동차 ...................................................................................................................... 318 5.3 동물 ......................................................................................................................... 323 5.4 시소 ......................................................................................................................... 327 5.5 시계추 ...................................................................................................................... 333 5.6 웅크리기 ................................................................................................................... 340 5.7 구르기 ...................................................................................................................... 343 5.8 거대화 .................................................................................................................... 346 5.9 복수 캐릭터 조작 ........................................................................................................ 348 5.10 정리 ....................................................................................................................... 351 CHAPTER 6 무기 6.1 검 ............................................................................................................................ 354 6.2 채찍 ......................................................................................................................... 360 6.3 공 ............................................................................................................................ 365 6.4 수류탄 ...................................................................................................................... 369 6.5 시한폭탄 ................................................................................................................... 373 6.6 폭연 ......................................................................................................................... 375 6.7 기관총 ...................................................................................................................... 382 6.8 유도 미사일 ............................................................................................................... 385 6.9 부메랑 ...................................................................................................................... 391 6.10 원격 조종 무기 ......................................................................................................... 395 6.11 방패 ....................................................................................................................... 398 6.12 연막 ....................................................................................................................... 401
  • 13. 10 6.13 거품 ....................................................................................................................... 405 6.14 무기 교체 ................................................................................................................ 412 6.15 정리 ....................................................................................................................... 417 CHAPTER 7 아이템 7.1 무적 아이템 ............................................................................................................... 420 7.2 주워 던지는 아이템 ..................................................................................................... 424 7.3 떨어져 내려오는 아이템 ............................................................................................... 428 7.4 특정 장소를 통과하면 등장하는 아이템 ........................................................................... 432 7.5 특정 장소를 공격하면 등장하는 아이템 ........................................................................... 435 7.6 정리 ......................................................................................................................... 441 CHAPTER 8 미션 8.1 모든 적 쓰러뜨리기 ..................................................................................................... 444 8.2 모든 아이템 획득하기 .................................................................................................. 445 8.3 아군 돕기 .................................................................................................................. 446 8.4 페인트 칠하기 ............................................................................................................ 448 8.5 목적지로 이동하기 ...................................................................................................... 449 8.6 대기열 처리 ............................................................................................................... 450 8.7 물건 쳐내기 ............................................................................................................... 452 8.8 정리 ......................................................................................................................... 453 CONTENTS
  • 14. 11 CHAPTER 9 공격 9.1 몸으로 부딪히는 공격 .................................................................................................. 456 9.2 점프 공격 .................................................................................................................. 460 9.3 잡기 공격 .................................................................................................................. 464 9.4 정지 공격 .................................................................................................................. 470 9.5 함정 ......................................................................................................................... 476 9.6 전 범위 공격 .............................................................................................................. 479 9.7 차지 공격 .................................................................................................................. 482 9.8 들이받기 공격 ............................................................................................................ 488 9.9 낙하물 공격 .............................................................................................................. 493 9.10 콤보 ....................................................................................................................... 497 9.11 거리에 따른 공격 변화 .............................................................................................. 501 9.12 후방 공격 ............................................................................................................... 507 9.13 레버 흔들기 공격 ...................................................................................................... 511 9.14 정리 ....................................................................................................................... 516 부록 Appendix A 데모 프로그램 일람 ....................................................................................... 518 Appendix B 인용 게임 일람 ............................................................................................ 528 찾아보기 ������������������������������������������������������������������������������������������������������������������������������������������������� 560
  • 15.
  • 16. 130장 - 소개 소개 CHAPTER   0 대시 점프를 하여 산을 넘고 계곡을 건너 적을 물리치고 목적지에 도달해야 하는 대담하고 섬세한 게임을 액션 게임이라고 할 수 있습니다. 대부분의 액션 게임은 ‘8방향 버튼 + 점프 버튼 + 공격 버튼’ 정도면 조작할 수 있지만 작품에 따라 완전히 다른 게임성을 제공한다는 점이 액션 게임의 매력입니다. 하드웨어가 진화하며 그래픽과 사운드는 크게 향상되었지만 ‘달리고, 뛰고, 도망가고, 수집하다’라는 액션 게임의 본질은 예전부터 거의 변하지 않았습 니다. 최근에는 스마트폰이나 휴대용 게임기, 플래시나 HTML5를 활용한 웹 브라우저 게 임이 보급되어 고전 2D 액션 게임이 다시 주목을 받고 있습니다.
  • 17. 14 게임 매니악스 액션 게임 알고리즘 0.1 액션 게임의 기본 요소 먼저 액션 게임이 어떠한 요소로 구성되어 있는지 확인해봅시다. 액션 게임에 필요한 요소는 그리 많지 않습니다. 대부분은 [그림 0-1]과 같은 요소로 구성됩 니다. 그림 0-1 액션 게임의 기본 구성 지형 무기 적 배경 아이템 점수 캐릭터 ●● 캐릭터 플레이어가 조작하는 캐릭터입니다. 인간이나 로봇과 같이 사람의 형태를 띠는 경우가 많으나 동물이나 자동 차, 심지어 인형이나 공룡인 경우도 있습니다. ●● 적 캐릭터에게 공격해오는 상대입니다. 대부분 게임에서는 적과 충돌하면 충격을 받기 때문에 회피의 대상입니다. ●● 무기 캐릭터가 적에게 행하거나 적이 캐릭터에게 행하는 공격입니다. 무기로 적을 공격하면 충격을 주게 됩니다. ●● 지형 스테이지를 구성하는 플랫폼이나 벽 등을 말합니다. 게임에 따라 밧줄, 사다리, 컨베이어 벨트 등 다양한 장치 가 등장합니다. ●● 배경 캐릭터나 적의 배후에 표시되는 하늘이나 나무 등을 말합니다. 화면을 화려하게 꾸미기도 하고, 스크롤하여 속 도감을 표현하기도 합니다. 평소에는 캐릭터나 적이 부딪혀도 아무 일도 일어나지 않습니다. ●● 아이템 캐릭터가 주우면 다양한 효과를 얻게 됩니다. 점수를 얻거나 무적이 되는 등 그 종류는 무궁무진합니다.
  • 18. 150장 - 소개 ●● 점수 득점입니다. 보통은 적을 물리쳐 아이템을 줍거나 한 스테이지를 완료하면 점수를 얻을 수 있습니다. 규칙은 게임에 따라 다릅니다. 예를 들어 캐릭터와 적이 충돌하면 충격을 받지 않고 오히려 점 수를 얻는 경우도 있습니다. 이렇듯 게임별로 세세한 차이는 있지만 기본적으로는 지금까지 설 명한 요소를 조합하여 액션 게임을 만듭니다. 0.2 액션 게임에서의 움직임 처리 캐릭터의 매끄러운 동작은 사실 작은 움직임을 연속해서 빠르게 보여주는 것입니다(그림 0-2). 예를 들어 화면의 왼쪽 끝에서 오른쪽 끝까지 움직인다면, 처음에는 화면 폭의 1/100만 움직이고 다음에 다시 1/100을 더 움직이는 식으로, 총 100번의 연속된 움직임을 연이어서 만 들어냅니다. 그림 0-2 액션 게임의 진행 캐릭터를조금움직인다. 1/60초의 짧은 주기를 반복한다. 작은 움직임이 쌓여 연속된 동작으로 보인다. 무기를 조금 움직인다. 배경을 조금 움직인다. 적을 조금 움직인다. 지형을 조금 움직인다. 아이템을조금움직인다. 이 작은 움직임은 대단히 짧은 주기로 반복됩니다. 대부분의 게임에서는 이 주기를 화면 갱신 주기와 맞춥니다. 예를 들어 TV나 PC용 모니터의 일반적인 화면 갱신 주기는 1/60초이므로 게임에서도 1/60초 주기로 갱신합니다. 갱신 주기와 게임 주기를 맞추면 애니메이션을 매끄럽 게 표시할 수 있기 때문입니다.
  • 19. 16 게임 매니악스 액션 게임 알고리즘 적, 무기, 지형, 배경, 아이템 등의 움직임도 캐릭터와 마찬가지로 작은 움직임을 반복해서 만 들어냅니다. 액션 게임의 프로그램은 각 캐릭터·적·무기·지형·배경·아이템 등을 조금씩 움직이게 하는 처리를 1주기로 하고 이것을 반복합니다. 이 짧은 주기로 캐릭터 등을 작게 움직이는 처리가 액션 게임에서 다양한 움직임을 만들어낼 수 있는 열쇠입니다. 이 책에서는 이를 ‘움직임 처리’라고 부르겠습니다. 이 책의 각 장은 많은 부분을 움직임 처리에 쓰이는 알고리즘을 설명하는 데 할애하고 소스 코드를 함께 실어두었습 니다. 0.2.1 프레임이란 화면 전체를 일컬어 프레임frame이라 할 때가 있습니다. 이는 TV와 같은 디스플레이에 쓰이는 용어인데 게임에서도 자주 사용됩니다. 화면 전체를 1초 동안 갱신하는 총 횟수를 ‘초당 프레임’ 이라고 부릅니다. 1/60초 주기로 화면 전체를 갱신하는 게임은 초당 60프레임이 되겠지요. 액 션 게임을 비롯한 아케이드 게임의 대부분은 초당 60프레임을 지향합니다. TV나 PC용 모니터 와 같은 디스플레이의 일반적인 화면 갱신 주기에 맞춘 것입니다. 예를 들어 캐릭터를 움직일 때는 1프레임별로 조금씩 캐릭터의 좌표나 각도를 변화시킵니다. 초당 60프레임이라면 캐릭터 를 60회 움직여 1초 동안의 움직임을 완성합니다. 게임을 즐길 때나 만들 때에도 프레임이라는 단어는 자주 사용됩니다. 다음과 같은 경우가 되겠지요. “최신 3D 게임을 샀는데, 30프레임밖에 안 돼서 실망했어.” “액션 게임은 역시 60프레임은 되어야지!” “어떻게든 1프레임에 모든 처리를 집어넣을 순 없을까?” 1초 동안 갱신할 수 있는 프레임 수를 ‘프레임 레이트frame rate’라고 부릅니다. 프레임 레이트는 fpsframes per second라는 단위로 표기합니다. 1초에 60프레임을 표시한다면 60fps가 됩니다. 게이 머나 게임 프로그래머 간에는 프레임, 프레임 레이트, fps 같은 언어를 명확하게 구분하지 않 고 60프레임, 초당 60프레임, 프레임 레이트가 60, 60fps와 같이 다양한 방식으로 표현됩니다.
  • 20. 170장 - 소개 0.3 충돌 판정 처리 캐릭터나 적과 같은 물체가 서로 접촉했는지 판단하는 처리를 충돌 판정 처리라고 합니다. 액 션 게임에서는 캐릭터와 다른 물체가 가까워지면 충돌 여부를 확인한 뒤, 충돌했다면 적을 물 리치거나 아이템을 줍는 등의 처리가 이어집니다. 액션 게임을 비롯한 다양한 장르의 게임에서 충돌 판정 처리는 대단히 중요한 요소입니다. 슈 팅 게임에서 탄에 맞았는지, 격투 게임에서 주먹이 명중했는지, 스포츠 게임에서 공을 쳤는지 의 여부를 판단하는 것이 모두 충돌 판정 처리입니다. 단순히 움직이는 것만으로는 게임이 되지 않습니다. 캐릭터를 움직이는 처리에 충돌 판정 처리 와 충격 처리, 점수 획득 처리 등이 함께 어우러져야 비로소 게임다운 게임이 됩니다. 0.3.1 충돌 판정 처리의 예 충돌 판정 처리 방법은 다양합니다. 전통적으로는 [그림 0-3]처럼 사각형을 이용해서 판정하 지만 원 등을 이용하는 경우도 있습니다. 이 책에서는 주로 2D의 충돌 판정 처리를 다루지만 3D라 해도 방식은 비슷합니다. 3D에서는 직육면체나 구를 이용하거나 다각형 간의 충돌 여부를 확인합니다. [그림 0-3]에서는 캐릭터 의 충돌 판정을 (CL, CT) ~ (CR, CB), 적의 충돌 판정을 (EL, ET) ~ (ER, EB)라 하였습 니다. 이때 캐릭터와 적이 접촉하는 조건은 다음과 같습니다. CL < ER EL < CR CT < EB ET < CB
  • 21. 18 게임 매니악스 액션 게임 알고리즘 그림 0-3 충돌 판정 처리 캐릭터와 적이 접촉하는 조건 CL < ER EL < CR CT < EB ET < CB X축 Y축 캐릭터의 충돌 판정 (CL, CT) ~ (CR, CB) 적의 충돌 판정 (EL, ET) ~ (ER, EB) 캐릭터의 중심 좌표에 대해 충돌 판정이 상하·좌우 대칭일 경우에는 [그림 0-4]와 같은 방법 으로 충돌 판정 처리를 할 수도 있습니다. 캐릭터의 중심 좌표를 (CX, CY), 적의 중심 좌표를 (EX, EY), X축 방향 충돌 판정의 거리를 XDIST, Y축 방향 충돌 판정의 거리를 YDIST라고 합니다. 이때 캐릭터와 적이 접촉하는 조건은 다음과 같습니다. abs(CX - EX) < XDIST abs(CY - EY) < YDIST abs는 절댓값을 구하는 함수입니다. 이 식은 캐릭터와 적이 X축 방향과 Y축 방향 각각에서 일 정 거리 내에 있다면 접촉했다고 판단한다는 의미입니다. 그림 0-4 상하·좌우 대칭일 경우의 충돌 판정 처리 캐릭터와 적이 접촉하는 조건 abs(CX - EX) < XDIST abs(CY - EY) < YDIST X축 Y축 Y축 방향 충돌 판정 거리 YDIST X축 방향 충돌 판정 거리 XDIST 캐릭터 중심 좌표 (CX, CY) 적 중심 좌표 (EX, EY) 캐릭터 충돌 판정 (CX - XDIST, CY - YDIST) ~ (CX+ XDIST, CY + YDIST)
  • 22. 190장 - 소개 0.4 태스크 시스템 태스크 시스템이란 게임 프로그램에서 사용하는 장치 중 하나입니다. 장르에 상관없이 다양한 게임에 적용할 수 있는데 특히 액션 게임이나 슈팅 게임에 적합합니다. 게임에 따라서는 태스 크 시스템을 다른 이름으로 부르기도 합니다. 태스크 시스템은 복수의 태스크(일)를 병렬 처 리하기 위한 장치입니다. 태스크 시스템을 사용한 게임 프로그램에서는 게임에 등장하는 각종 요소를 태스크에서 표현합니다. 액션 게임을 예로 들면 캐릭터, 적, 무기 등의 사물 처리를 각 각의 태스크가 담당합니다. 태스크는 일종의 스레드 같은 것입니다. 게임에서는 보통 수많은 사물이 동시에 움직여서 자칫 복잡해질 수 있는데, 태스크 시스템을 사용하면 훨씬 쉽게 처리할 수 있습니다. 또한, 태스크 시스템이 제공하는 태스크 생성과 삭제 기능은 ‘무기 발사 처리’나 ‘쓰러진 적 지우기 처리’ 등에 도 도움이 됩니다. 게다가 메모리 할당과 해제까지 관리해주는 태스크 시스템이라면 메모리 단 편화로 인한 성능 하락 걱정 없이도 태스크를 마음껏 생성하고 삭제할 수 있습니다. 태스크 시스템이 태스크를 실행하는 방식은 게임에서의 물체 움직임과 민첩성에 영향을 줍니 다. 예를 들어 캐릭터와 적이 하나씩 있고 무기가 2개인 상황을 가정해봅시다(그림 0-5). 태 스크 시스템은 캐릭터와 적, 그리고 두 무기에 태스크를 하나씩 할당하므로 이때 필요한 태스 크의 수는 총 4개가 됩니다. 그리고 이 태스크들을 차례로 실행하여 이동이나 애니메이션 등을 처리합니다. 그 밖에 플랫폼 등의 지형을 태스크로 처리하기도 합니다. 그림 0-5 캐릭터와 적이 하나씩, 무기가 2개인 상황 적 무기 무기 캐릭터 이번에는 게임에서 사물을 생성하는 상황에 대해 살펴봅니다.
  • 23. 20 게임 매니악스 액션 게임 알고리즘 ●● 캐릭터가 등장한다. ●● 적이 출현한다. ●● 캐릭터가 무기를 발사한다. ●● 아이템을 떨군다. 이때 새로운 캐릭터와 적, 무기, 아이템을 생성하게 됩니다. 태스크 시스템에서는 이러한 사물 의 생성이 곧 태스크의 생성을 뜻합니다(그림 0-6). 사물을 삭제해야 하는 상황 역시 다양합 니다. 예를 들면 다음과 같습니다. ●● 주운 아이템을 버린다. ●● 적에게 명중한 무기를 지운다. ●● 무기에 맞은 적을 지운다. ●● 적에 부딪힌 캐릭터를 지운다. ●● 화면 밖으로 사라진 아이템을 지운다. ●● 화면 밖으로 사라진 무기를 지운다. ●● 화면 밖으로 사라진 적을 지운다. 그림 0-6 사물 생성 = 태스크 생성 적 출현 (적 태스크 생성) 무기 발사 (무기 태스크 생성) 아이템 등장 (아이템 태스크 생성) 캐릭터 등장 (캐릭터 태스크 생성) 이러한 예가 바로 캐릭터, 적, 무기, 아이템의 삭제 처리입니다. 태스크 시스템은 태스크를 삭 제해서 사물을 삭제합니다(그림 0-7). 이 책의 샘플들은 태스크 시스템을 이용하여 작성되었 습니다. 태스크 시스템을 잘 몰라도 내용을 이해하는 데에는 전혀 무리가 없으므로 걱정하지
  • 24. 210장 - 소개 않아도 됩니다. 태스크 시스템에 대한 자세한 내용은 『게임 매니악스 탄막 게임 알고리즘』(한 빛미디어, 2014)의 ‘2장 캐릭터 움직이기’를 참고하세요. 그림 0-7 사물 삭제 = 태스크 삭제 무기에 맞은 적을 지운다. (적 태스크 삭제) 적에 명중한 무기를 지운다. (무기 태스크 삭제) 주운 아이템을 지운다. (아이템 태스크 삭제) 0.5 액션 게임 제작 순서 액션 게임 제작을 취미로 하든 일로 하든 또는 학교 과제로 하든 그 기본 순서는 크게 다르지 않습니다(그림 0-8). 여러 사람이 함께 개발한다면 몇 가지 작업이 추가로 필요합니다. 먼저 게임을 구상해야 합니다. 회사 업무라면 기획서를 쓰거나 예산을 확보하는 일도 필요할 것입니다. 기본적인 구상이 어느 정도 완성되면 그래픽, 음향, 프로그램 작성을 시작합니다. 게 임에 필요한 데이터와 프로그램을 만들면서 추가로 구상을 해나가는 경우도 있을 것입니다. 좋은 게임을 만들려면 반복해서 테스트해야 합니다. 단순히 움직이는 수준에 만족하지 않고, 최대한 반복해서 테스트하고 버그를 잡아 밸런스를 조절해야 합니다.
  • 25. 22 게임 매니악스 액션 게임 알고리즘 그림 0-8 액션 게임을 제작하는 순서 개발 시작 구상/아이디어(기획서작성) 음향 제작 통합 테스트 완성? 예 아니오 디버그 및 밸런스 조절 공개 또는 판매 개발 완료 프로그램 작성그래픽 제작 0.6 게임 플랫폼과 개발 환경 이 절에서는 액션 게임 프로그램을 작성하려면 무엇이 필요한지 살펴보겠습니다. 0.6.1 게임 플랫폼 먼저 게임을 실행할 플랫폼을 선택해야 합니다. 주로 이용되는 플랫폼은 다음과 같습니다.
  • 26. 230장 - 소개 ●● PC 게임을 만들 때 가장 손쉽게 사용할 수 있는 것이 PC입니다. 선택할 수 있는 프로그래밍 언어가 다양하며 개 발용 라이브러리도 풍부합니다. 아케이드 액션 게임이 PC용으로 이식되어 낮은 가격에 판매되기도 하지만, 전용 게임기와 비교하면 제품 수가 많지는 않아 보입니다. ●● 스마트폰/태블릿 구글 안드로이드와 애플 iOS 등도 개인이 개발해서 직접 판매까지 할 수 있는 플랫폼입니다. 단말기의 성능이 날이 갈수록 향상되어 휴대용 게임기의 성능을 능가하는 제품도 많습니다. ●● 휴대용 게임기 닌텐도 DS, PSP 같은 게임 기기도 있습니다. 자세한 사항은 제조사마다 다릅니다. ●● 가정용 게임기/아케이드(오락실용) 게임기 게임 회사에 다니고 있다면 이 중에서 하나를 선택하는 경우도 있을 것입니다. 양쪽 모두 같은 사양의 하드웨 어를 대량 공급하는 방식이기 때문에 하드웨어 성능을 한계까지 활용하는 게임을 만들기에 적합한 환경입니 다. PC나 스마트폰과는 차별화된 특징입니다. 0.6.2 개발 환경 취미나 동아리 혹은 학교 과제로 게임을 만든다면 PC를 사용하는 경우가 많을 것입니다. PC 에서 게임을 제작한다면 여러 개발 환경 중에서 입맛에 맞는 것을 선택할 수 있습니다. 여기서 는 PC용 개발 환경과 그 특징을 많이 사용되는 툴 위주로 소개하겠습니다. ●● C/C++와 DirectX 윈도우를 사용할 경우 가장 일반적인 선택입니다. 과거에는 볼랜드와 같은 경쟁 C/C++ 컴파일러가 있었지만, 지금은 MS의 비주얼 스튜디오가 평정하다시피 하여 선택의 폭은 넓지 않습니다. DirectX와의 호환성 측면 에서도 비주얼 스튜디오를 선택하는 것이 유리합니다. ●● C/C++와 OpenGL DirectX보다 OpenGL을 선호하는 프로그래머도 적지 않습니다. OpenGL은 DirectX에 비교해 표준 사양 이 안정적이고 맥이나 리눅스와 같은 환경에서도 이용할 수 있다는 장점이 있습니다. ●● 자바 자바는 언어 중 1, 2위를 다툴 정도로 많이 사용됩니다. 자바는 C/C++보다 성능 측면에서는 불리하지만 지 금은 하드웨어 성능이 워낙 좋아져 좋은 라이브러리를 사용하면 자바로도 충분히 게임을 만들 수 있습니다. ●● 플래시 웹 브라우저만으로 즐길 수 있도록 플래시로 작성한 게임도 있습니다. 플래시는 ActionScript라는 언어를 사 용하여 게임 등의 창의적이고 인터랙티브한 콘텐츠를 만들 수 있습니다. 어도비가 판매하고 있는 정식 개발 환
  • 27. 24 게임 매니악스 액션 게임 알고리즘 경 외에 무료 개발 환경도 구할 수 있습니다.1 ●● 액션 게임 작성 툴 프로그래밍 언어나 라이브러리를 공부하지 않아도 그림을 그리거나 간단한 설정을 하기만 하면 게임을 만들 수 있는 툴도 있습니다. 게임 작성 툴 쯔꾸르 시리즈가 유명합니다.2 개발 환경과 라이브러리는 자신이 원하는 것을 선택하는 것이 가장 좋습니다. 이 책의 샘플 프 로그램들은 C/C++로 작성했지만, 다른 언어를 사용하더라도 기본적인 생각의 구조나 방법은 변하지 않습니다. 이 책의 그림이나 해설을 샘플 프로그램에 첨가한다면 다른 언어로 움직이는 프로그램을 만드는 것도 어렵지 않을 것입니다. 필자가 추천하는 방식은 C/C++와 DirectX의 조합, 또는 C/C++와 OpenGL의 조합입니다. 이들보다 더 쉬운 조합도 많이 있지만 여전히 대부분의 게임이 C/C++로 만들어지고 있다는 점을 고려한다면, C/C++를 배워두는 것만으로도 큰 의미가 있을 것입니다. 특히 게임 개발자를 꿈꾼다면 C/C++를 제대로 배워두기 바랍니다. C/C++는 게임 외의 프로 그래밍에서도 널리 사용되므로 C/C++를 익혀두면 아마도 일거리를 못 찾아 고민하지는 않을 것입니다. 욕심을 더 내서 C/C++와 Java 모두 배워두면 완벽하겠지요. 0.7 샘플 프로그램 이 책에서 소개하는 다양한 알고리즘이 실제로 동작하는 것을 확인할 수 있도록 게임 형태의 샘플을 준비하여 다음 URL에서 내려받을 수 있도록 하셨습니다. ●● http://www.hanbit.co.kr/exam/2206 샘플 프로그램은 실제로 캐릭터를 조작해서 점프하고 아이템을 줍고 적을 무찌를 수 있습니다. 액션 게임에 활용되는 다양한 알고리즘을 소개하는 것이 목적이므로 게임의 틀을 만드는 방법 을 설명하지는 않지만 이동, 배경 처리, 키 조작 등 기본 형태는 갖추고 있습니다. 샘플의 소스 코드는 액션 게임의 기본적인 부분을 작성할 때 좋은 참고 자료가 될 것입니다. 1 역자주_ HTML5의 성장으로 플래시는 HTML5+자바스크립트에게 빠르게 자리를 내주고 있습니다. 2 역자주_ https://mirror.enha.kr/wiki/쯔꾸르
  • 28. 250장 - 소개 다만, 책에 수록된 소스 코드는 각 알고리즘의 핵심만 발췌한 것입니다. 관련 처리나 클래스 정 의는 전체 샘플 코드에서 각 알고리즘에 대응하는 부분을 참고하기 바랍니다. 0.8 샘플 프로그램 실행 방법 내려받은 샘플 프로그램은 소스 파일, 데이터 파일, 실행 파일로 구성되어 있습니다. 샘플을 돌 려보려면 OutputExeDebug 폴더 또는 OutputExeRelease 폴더에 있는 Action.exe 파일을 실행하면 됩니다(실행 시 만약 ‘MSVCP120.dll이 없다’는 오류가 뜨면 ‘Visual Studio 2013용 Visual C++ 재배포 가능 패키지’를 인터넷에서 내려받아 설치해주세요). 각 샘플의 내용은 이 책의 각 장에서 소개하고 있습니다. 샘플 프로그램의 시작 화면에서는 키보드나 조이스틱으로 다음과 같은 조작이 가능합니다. ●● 방향키 또는 레버의 좌우로 스테이지 선택(1 스테이지 단위) ●● 방향키 또는 레버의 상하로 스테이지 선택(10 스테이지 단위) ●● C 키 또는 버튼 2로 스테이지 시작 ●● V 키 또는 버튼 3으로 일시 정지 ●● Esc 키로 프로그램 종료 샘플 프로그램에는 이 책에서 소개하는 수많은 알고리즘에 대응하는 스테이지가 책과 같은 순 으로 정리되어 있습니다. 원하는 스테이지를 선택하여 시작해보기 바랍니다. 스테이지를 시작 한 후에는 다음과 같은 조작이 가능합니다. ●● 방향키 또는 레버의 상하좌우로 캐릭터 이동 ●● Z 키 또는 버튼 0으로 점프 또는 공격(스테이지에 따라 다름) ●● X 키 또는 버튼 1로 무기 선택(스테이지에 따라 다름) ●● C 키 또는 버튼 2로 스테이지 선택 화면으로 돌아가기 ●● V 키 또는 버튼 3으로 일시 정지 ●● Esc 키로 프로그램 종료 샘플 프로그램을 실행할 때 ‘-w 1024 –h 768’처럼 옵션을 주어 해상도를 지정할 수 있습니 다. 전체 화면으로 실행하려면 ‘-fw 1280 –fh 1024’로 지정하면 됩니다.
  • 29. 26 게임 매니악스 액션 게임 알고리즘 0.9 샘플 프로그램 빌드 환경 이 책의 샘플은 Visual C++와 DirectX를 사용하여 개발했습니다. 샘플 프로그램을 빌드하려 면 먼저 이 두 소프트웨어를 설치해야 합니다. 각 소프트웨어는 마이크로소프트 다운로드 센터 등에서 설치할 수 있습니다. Visual C++ 2013 Visual C++를 사용하기 위해서는 Visual Studio를 설치해야 합니다. 막강한 기능으로 무장 한 유료 버전도 있지만, 이 책의 샘플은 무료인 Community 버전이면 충분합니다. DirectX SDK 요즘은 DirectX SDK를 Windows SDK에 통합해서 배포하고 있지만, 이 책의 샘플에서 참 조하는 D3DX는 독립적으로 배포되는 DirectX SDK에만 포함되어 있습니다. 샘플 빌드는 독 립적으로 배포된 마지막 버전인 2010년 6월 버전의 DirectX SDK로 최종 검증하였습니다. 0.10 정리 이 장에서는 액션 게임의 전체적인 윤곽을 짚어보며 게임 프로그래밍의 요점과 필요한 개발 환 경을 정리했습니다. 게임 프로그래밍은 절대 어렵지 않습니다. 환경을 준비하거나 라이브러리 의 성격을 파악하는 등 처음의 몇 가지 어려움만 극복하면 됩니다. 먼저 샘플을 조작해보고 빌 드하고 조금씩 수정하는 것부터 시작하면 재미있고 수월하게 액션 게임 프로그래밍의 세계로 들어설 수 있을 것입니다. 무엇보다 액션 게임 만들기는 마음 편하게 먹고 게임을 즐기는 것부터 시작하면 됩니다.
  • 30. 271장 - 이동 이동 CHAPTER   1 1장에서 설명하는 ‘이동’은 액션 게임에서의 가장 기본적인 액션입니다. 걷기, 뛰기, 점프하 기부터 헤엄치기와 미끄러지기에 이르기까지 그 종류는 정말 다양합니다.
  • 31. 28 게임 매니악스 액션 게임 알고리즘 1.1 레버 대시 레버1 를 특정 방향으로 조작하여 캐릭터를 가속하는 액션입니다. 대부분의 게임에서는 조이스 틱의 레버(또는 이동 버튼)로 플레이어를 상하좌우로 이동시킬 수 있습니다. 여기에 가속 요 소를 곁들이면 훨씬 멋진 움직임이 만들어집니다. 예를 들어 [그림 1-1]처럼 캐릭터가 정지한 상태에서 레버를 오른쪽으로 입력하면 [그림 1-2]와 같이 캐릭터가 오른쪽으로 움직이기 시작합니다. 입력 상태인 채로 계속 놔두면 움직 임의 속도가 점점 빨라집니다(그림 1-3). 캐릭터가 너무 빨리 이동하면 조정하기 어렵기 때문 에 최대 속도는 제한하는 것이 좋습니다. 레버 조작을 중단하면 캐릭터는 점차 감속합니다(그 림 1-4). 또한 레버를 반대로 조작할 경우 더 빠르게 감속시키면 좋겠지요(그림 1-5). 예를 들어 눈앞에 적이나 장애물이 출현하여 급하게 정지하고 싶을 경우, 레버를 반대 방향으로 입 력하여 캐릭터를 정지할 수 있으면 편리할 것입니다. 이 경우에도 한순간에 속도를 0으로 떨어 뜨리는 것이 아니라 조금씩 시간을 두고 감속하는 것이 핵심입니다. 이렇게 하면 빠른 속도로 이동하면 할수록 급정지가 어려워지기 때문에 현실적인 움직임이 만들어집니다. 또한 빨리 이 동할수록 장애물을 피하기 어려워지기 때문에 조작 난이도가 높아집니다. 단, 급하게 감속할 때 흙먼지를 일으키거나 브레이크 음을 울리는 등의 연출이 있으면 재미가 더해질 것입니다. 그림 1-1 정지 상태의 캐릭터 그림 1-2 레버를 오른쪽으로 입력하면 오른쪽으로 이동한다. 정지 상태의 캐릭터 레버를 오른쪽으로 입력하면 오른쪽으로 이동한다. 1 역자주_ 주로 왼손이나 왼손 엄지로 방향을 조작할 때 쓰는 막대를 말합니다. 스틱(stick)이라고도 부릅니다.
  • 32. 291장 - 이동 그림 1-3 레버를 입력한 채 그대로 있으면 가속한다. 레버를 오른쪽으로 입력한 채로 그대로 있으면 가속한다. 그림 1-4 레버 입력을 멈추면 점차 감속한다. 그림 1-5 레버를 반대 방향으로 입력하면 빠르게 감속한다. 레버 입력을 멈추면 감속한다. 레버를 반대 방향으로 입력하면 급하게 감속한다. 레버 대시를 활용한 게임으로는 슈퍼 마리오 브라더스나 소닉 더 헤지혹 등이 있습니다. 슈퍼 마리오 브라더스는 버튼을 사용한 대시(1.2절)도 지원합니다. 소닉 더 헤지혹은 루 프(1.12절) 등을 포함해 기복이 심한 주변 지형이나 캐릭터가 몸을 돌돌 말아 더욱 빠르게 가 속하는 액션(5.7절) 등을 지원합니다. 슈퍼 마리오 브라더스와 소닉 더 헤지혹은 비슷한 점이 많지만 게임성은 상당히 다릅니 다. 굳이 말하자면 슈퍼 마리오 브라더스는 가속과 점프가 급격하기 때문에 지형 패턴을 확 실하게 외우고, 타이밍을 정확히 맞춰 점프해야 하는 게임입니다. 이에 비해 소닉 더 헤지혹 은 점프한 후의 궤도를 조정하기 때문에 조금 더 편하고 쉽게 즐길 수 있는 게임입니다. 같은 레버 대시를 채택한 게임에서도 가속이나 점프 등을 어떻게 활용하느냐에 따라 전혀 다른 게임 이 되기도 합니다. 레버 대시를 사용한 게임 중 조금 독특한 게임으로는 버닝 러버가 있습니 다. 이것은 종-스크롤 자동차 경주 게임으로 레버를 조작하여 자동차를 가속할 수 있습니다.
  • 33. 30 게임 매니악스 액션 게임 알고리즘 알고리즘 레버 대시를 구현하려면 레버의 조작 상태에 맞게 캐릭터의 이동 속도를 변화시킵니다. 캐릭터 가 오른쪽으로 이동한다고 생각해봅시다. 레버가 오른쪽으로 입력되어 있으면 캐릭터의 속도 를 증가시킵니다(그림 1-6). 캐릭터의 속도를 VX, 가속도를 accel이라 하면 다음과 같이 계 산합니다. VX += accel 반대로, 레버가 왼쪽으로 입력되어 있으면 다음과 같이 계산하여 속도를 떨어뜨립니다(그림 1-7). VX -= accel 그림 1-6 레버를 오른쪽으로 입력할 경우 그림 1-7 레버를 왼쪽으로 입력할 경우 레버를 오른쪽으로 입력하면 속도를 증가시킨다. VX + = accel 속도(VX) 가속도(accel) 레버를 왼쪽으로 입력하면 속도를 감소시킨다. VX -= accel 마지막으로, 레버에 아무런 조작을 하지 않으면 다음과 같이 속도를 천천히 떨어뜨립니다(그 림 1-8). VX -= accel*0.5f 여기서는 레버를 왼쪽으로 입력했을 때의 절반의 가속도(0.5f)로 감속시켰지만 감속 정도는 자유롭게 결정하면 됩니다.
  • 34. 311장 - 이동 그림 1-8 레버를 조작하지 않을 경우 레버가 입력되지 않는다면 속도를 천천히 감소시킨다. VX -= accel * 0.5f 프로그램 [코드 1-1]은 레버 대시 프로그램입니다. 레버를 좌우로 입력하여 가속하고 최대 속도와 가속 도 등을 자유롭게 설정할 수 있습니다. 코드 1-1 레버 대시(CLeverDashMan 클래스) // 캐릭터 움직임을 처리하는 Move 함수 // 이 Move 함수는 1프레임(1/60초)마다 호출된다. // 인수의 CInputState는 조이스틱의 레버 입력 상태를 표시한다. // 레버가 왼쪽으로 입력되어 있으면 is-Left가 true로 // 레버가 오른쪽으로 입력되어 있으면 is-Right가 ture가 된다. bool CLevelDashMan::Move(const CInputState* is) { // 최대 속도 float max_speed=0.5f; // 가속도 float accel=0.01f; // 레버를 오른쪽으로 입력하면 오른쪽으로 가속한다. // VX는 X축(좌우) 방향의 속도다. // 배경이 VX값에 따라 스크롤된다. if (is-Right) { VX+ =accel; } else // 레버를 왼쪽으로 입력하면 감속한다. if (is-Left) {
  • 35. 32 게임 매니악스 액션 게임 알고리즘 VX- =accel; } else // 어느 쪽으로도 레버를 입력하고 있지 않다면 완만하게 감속한다. { VX- =accel*0.5f; } // 속도가 0 미만이면 0으로 되돌린다. if (VX<0) VX=0; // 속도가 최대 속도를 넘으면 최대 속도로 되돌린다. if (VX>max_speed) VX=max_speed; // 속도에 따라서 캐릭터 기울기를 다르게 한다. // Angle 관련해서는 화면에 그리는 부분부터 참고한다. Angle=VX/max_speed*0.1f; // 이 샘플에서는 Move 함수가 False를 리턴하면 해당 객체를 삭제한다. // 여기서는 캐릭터를 삭제할 일이 없기 때문에 항상 true를 돌려준다. return true; } 샘플 LEVER DASH는 레버 대시를 구현한 샘플입니다. 처음에 캐릭터는 정지 상태입니다. 레버를 오른쪽으로 입력하면 캐릭터가 가속하고 왼쪽으로 입력하면 감속합니다. 레버를 입력하지 않을 때에는 완만하게 감속합 니다. 더불어 이 샘플에서는 캐릭터의 기울기 정도로 캐릭터 속도를 표현해보았습니다. ● LEVER DASH → p. 518 1.2 버튼 대시 버튼을 눌러 캐릭터를 가속하는 액션입니다. 움직임은 레버 대시와 유사합니다만 버튼으로 조 작합니다. 예를 들어 [그림 1-9]처럼 캐릭터가 오른쪽으로 움직이고 있을 때, 대시 버튼을 누르면 [그림 1-10]과 같이 캐릭터가 오른쪽으로 빠르게 가속합니다. 이때 최대 속도는 레버를 입력하고
  • 36. 772장 - 점프 점프 CHAPTER   2 점프는 액션 게임에서 이동 다음으로 기본적인 액션입니다. 주인공이 사람이나 동물인 횡 스크롤 게임은 거의 대부분 캐릭터를 점프시킬 수 있습니다. 이 점프에도 여러 가지 변형이 있습니다.
  • 37. 78 게임 매니악스 액션 게임 알고리즘78 2.1 고정 길이 점프 버튼을 누르면 캐릭터가 점프하는 액션입니다. 게임에 따라서는 레버를 위쪽이나 대각선으로 입력했을 때 점프하는 것도 있습니다. 대부분의 경우 캐릭터는 완만한 포물선을 그리며 점프합 니다. 점프를 사용한 게임에는 점프 중에 버튼을 놓는 시점에 따라 점프의 높이를 조절할 수 있는 것 과 점프의 높이가 고정되어 있는 것이 있습니다. 이 책에서는 전자를 ‘가변 길이 점프’, 후자를 ‘고정 길이 점프’라고 하여 각각 해설합니다. 여기서는 먼저 고정 길이 점프에 대해 설명하겠습니다. 정지 상태에 있는 캐릭터가 점프할 경 우를 생각해봅시다(그림 2-1). 버튼을 누르면 캐릭터는 점프하여 수직으로 상승하기 시작합 니다(그림 2-2). 그림 2-1 정지 상태의 캐릭터 그림 2-2 점프 시작 정지 상태의 캐릭터 점프를 하면 캐릭터가 수직 상승하기 시작한다. 캐릭터는 상승하다가 중력의 힘으로 인해 점차 상승 속도가 떨어지기 시작합니다(그림 2-3). 그리고 언젠가는 상승 속도가 0이 됩니다(그림 2-4). 여기가 점프의 정점입니다. 정점에 달한 후에는 상승에서 낙하로 이행합니다(그림 2-5). 낙하 중에는 중력으로 인해 점점 속도가 빨라집니다. 그리고 지면에 착지하면 점프는 종료합니다(그림 2-6).
  • 38. 792장 - 점프 그림 2-3 상승 속도가 느려진다. 그림 2-4 점프의 정점 중력의 힘으로 상승 속도가 점차 느려지기 시작한다. 점프의 정점에서는 상승 속도가 0이 된다. 그림 2-5 낙하 그림 2-6 점프의 종료 중력에 의해서 낙하하다. 중력에 의해서 낙하 속도가 점차 빨라진다. 지면에 착지하면 점프는 종료한다. 다음에는 좌우로 이동하면서 점프하는 경우를 생각해봅시다. 세로 방향의 움직임은 정지하고 있는 캐릭터가 점프했을 때와 같습니다. 여기에 가로 방향의 움직임이 더해지면서 점프의 궤적 은 포물선을 그립니다(그림 2-7). 점프를 사용한 게임은 상당히 많습니다. 예를 들어 동키콩은 굴러오는 나무 통들을 점프로 피하면서 전진해 나가는 게임입니다. 이 게임의 점프는 고정 길이 점프이기 때문에 중간에 버 튼을 놓는다고 해서 점프 높이가 달라지지는 않습니다. 일단 점프를 시작하면 점프가 종료할 때까지는 조작이 불가능합니다. 고정 길이 점프보다 가변 길이 점프가 플레이어가 자유롭게 점프할 수 있어 쾌적해 보이지만
  • 39. 80 게임 매니악스 액션 게임 알고리즘80 반드시 그렇지만은 않습니다. 동키콩의 경우 처음부터 나무 통을 뛰어넘기에 가장 적합한 높 이로 점프하도록 설정되어 있습니다. 따라서 플레이어는 버튼을 언제 놓을지 고민할 필요 없 이, 점프하는 타이밍만 계산하여 버튼을 누르기만 하면 됩니다. 결과적으로 리듬에 맞춰 버튼 을 누르며 장애물을 뛰어넘는 경쾌한 게임성을 갖추게 됩니다. 그림 2-7 좌우로 이동하면서 점프 가로로 이동하면서 점프하면 궤 적이 포물선을 그린다. 알고리즘 고정 길이 점프를 구현하려면 캐릭터의 점프 상태와 평상시 상태를 구별해야 합니다. 평상시 상태에서 캐릭터는 레버에 의해 좌우로 움직일 수 있고 점프 버튼을 누르면 점프 상태로 돌입 합니다. 점프를 시작할 때 캐릭터가 정지 상태에 있다면 수직 점프가 되며, 좌우로 움직이고 있 다면 포물선을 그리는 점프가 됩니다. 캐릭터가 점프를 시작할 때 위쪽으로의 처음 속도를 부여합니다(그림 2-8). 예를 들어 캐릭터 의 속도 VY에 일정한 값 jump_speed를 할당합니다. VY = jump_speed 점프 중에는 아래로의 가속도를 추가합니다(그림 2-9). 예를 들어 1프레임(1/60초)마다 Y축 속도 VY에 가속도 jump_accel을 추가합니다. VY += jump_accel
  • 40. 812장 - 점프 아래로의 가속도가 추가됨에 따라 어느 일정한 시점을 기준으로 캐릭터는 상승에서 낙하로 이 행합니다. 이 이행 순간이 점프의 정점입니다(그림 2-10). 정점의 높이는 처음 속도(jump_ speed)와 가속도(jump_accel)에 의해 결정됩니다. 처음 속도가 빠르면 빠를수록 정점은 높 아지며 느리면 느릴수록 낮아집니다. 또한 가속도가 클수록 신속히 떨어지는 점프가 되며, 작 을수록 천천히 움직이는 점프가 됩니다. 예를 들어 처음 속도가 빠르고 가속도가 작으면 완만 하면서 높은 점프가 됩니다. 그림 2-8 처음 속도를 부여한다. 그림 2-9 아래쪽 방향의 가속도를 추가한다. 점프를 시작하면 위쪽 방향의 처음 속도를 부여한다. VY=jump_speed 점프 중에는 속도에 아래쪽 방향의 가속도를 추가한다. VY += jump_accel 속도 VY 가속도 jump_accel 그림 2-10 상승에서부터 낙하로 이행한다. 가속도 아래쪽 방향의 가속도가 추가됨에 따라 상승에서 낙하로 이행한다. 처음 속도에 가속도를 더해 나아다가, 속도가 0이 된 지점이 점프의 정점이다. 캐릭터가 착지하면 점프는 종료합니다. 점프 상태에서 평상시 상태로 되돌아갑니다. 점프 상태 에서는 레버를 좌우로 움직이거나 점프를 하는 등의 행동은 불가능합니다. 평상시 상태로 되돌 아가 다시 좌우로 움직이거나 점프를 할 수 있습니다.
  • 41. 82 게임 매니악스 액션 게임 알고리즘82 지면에 착지했는지의 여부를 판정하려면 캐릭터의 Y좌표를 조사하거나 지면과의 충돌 판정 처리를 실시합니다(그림 2-11). 지면의 높이가 정해져 있다면 Y좌표를 조사하는 것이 간단 한 방법입니다. 다양한 높이의 지면이 있는 경우에는 지면과의 충돌 판정 처리를 실시해야 합 니다. 좌우로 이동하면서 점프했을 경우에도 Y축 방향의 속도에 대해서는 수직 점프와 같은 계산법 을 적용합니다(그림 2-12). X축 방향(가로 방향)에 대해서는 점프를 시작하는 시점의 속도 를 유지합니다. 예를 들어 점프 시작 시점에 X축 방향의 속도가 VX라면, 점프 중에도 속도는 VX인 채로 좌우로 이동합니다. 그림 2-11 점프의 종료를 판정한다. 착지 여부를 판정하려면 캐릭터의 Y좌표를 조사하거나 지면과의 충돌 판정 처리를 시행한다. 그림 2-12 좌우로 이동하면서 점프했을 때의 속도 Y축 방향의 속도에는 가속도가 추가된다. VY += jump_accel 속도 VY 가속도 jump_accel X축 방향의 속도는 점프 시작 시점의 속도를 유지한다. VX
  • 42. 1493장 - 장치 장치 CHAPTER   3 액션 게임의 스테이지에는 다양한 장치가 있습니다. 캐릭터는 수많은 장치가 마련된 스테 이지를 대시나 점프를 구사하며 뚫고 지나갑니다. 매력적인 장치는 게임을 재미있게 할 뿐 만 아니라 그 게임만의 개성을 강렬하게 어필합니다.
  • 43. 150 게임 매니악스 액션 게임 알고리즘150 3.1 로프 캐릭터가 붙잡고 이동할 수 있는 장치입니다. 로프를 잡고 좌우로 이동하거나 낙하 도중에 로 프를 붙잡아 정지하는 등의 액션이 가능합니다. 로프에는 횡방향과 종방향이 있는데 여기서는 횡방향 로프에 대해 설명하도록 하겠습니다. 종 방향 로프는 횡방향 로프나 사다리(3.2절)를 응용하여 만들 수 있습니다. 캐릭터는 로프를 붙 잡을 수 있고(그림 3-1), 로프를 잡고 있을 때는 레버를 좌우로 입력해서 캐릭터를 좌우로 이 동시킬 수 있습니다(그림 3-2). 그림 3-1 로프 잡기 그림 3-2 로프를 이용하여 좌우로 이동하기 캐릭터 로프 로프를 잡고 좌우로 이동 할 수 있다. 레버를 아래로 입력하면 캐릭터는 로프를 놓고 낙하합니다(그림 3-3). 일단 낙하가 시작되면 레버를 아래로 입력하지 않아도 낙하 상태가 지속됩니다. 낙하 중에 레버를 아래로 입력하지 않은 상태에서 로프가 캐릭터의 바로 근처에 있는 경우에는 다시 로프를 잡을 수 있습니다(그림 3-4). 온통 로프로 둘러싸인 스테이지에서는 로프를 잡고 좌우로 이동하거나 로프를 놓고 낙하하며 스테이지를 자유롭게 돌아다닐 수 있습니다. 그림 3-3 로프를 놓고 낙하하기 그림 3-4 낙하 중에 로프 잡기 레버를 아래로 입력 하면 로프를 놓고 낙하한다. 로프를 놓은 후에는 레버를 입력하지 않아도 낙하를 지속한다. 낙하 중에 레버를 아래로 입력하지 않고, 근처에 로프가 있다면 다시 로프를 잡을 수 있다.
  • 44. 1513장 - 장치 로프를 사용한 게임으로는 로드런너가 있습니다. 이 게임의 로프는 횡방향으로 제공됩니다. 로프를 이용해서 좌우로 이동하거나 로프를 붙잡아 낙하를 중지할 수 있습니다. 스테이지에 따 라서는 로프가 마치 미로처럼 펼쳐져 있으며, 상당히 복잡한 로프의 망을 이용하여 금덩어리를 수집하거나 적으로부터 도망치는 등의 액션을 즐길 수 있습니다. 동키콩 주니어도 로프를 이용하고 있습니다. 종방향 로프가 제공되는 이 게임은 사다리(3.2 절)와 유사한 성질의 장치가 사용됩니다. 여기서 재미있는 것은 로프를 하나만 잡았을 때와 동 시에 좌우 두 개를 잡았을 때 캐릭터가 로프를 오르내리는 속도가 다르다는 점입니다. 하나만 잡았을 때는 캐릭터의 충돌 영역이 작아지는 만큼 적에게 타격을 받기 어려워지나 오르내리는 속도는 느려집니다. 따라서 주변에 적이 없을 때는 두 개를 붙잡아 이동하고, 적이 가까워지면 하나를 놓는 독특한 액션을 구현할 수 있습니다. 알고리즘 로프 구현의 핵심은 캐릭터가 로프를 잡고 있는지 판정하는 처리입니다. 이것은 일종의 충돌 판정 처리입니다. 충돌 판정 처리에 대해서는 2장(점프)에서도 자세하게 설명하고 있으니 참 조하기 바랍니다. 로프를 잡으려면 다음 조건을 만족해야 합니다(그림 3-5). ●● 캐릭터와 로프의 X좌표 차이값이 일정 범위에 있다. ●● 캐릭터와 로프의 Y좌표 차이값이 일정 범위에 있다. ●● 레버를 아래로 입력하고 있지 않다. 해당 조건을 모두 만족하면 캐릭터는 로프를 잡게 되어 낙하하지 않습니다. 또한 로프를 잡고 좌우로 이동할 수 있습니다. 조건이 만족되지 않으면 캐릭터는 낙하합니다. 낙하 도중에도 모든 로프에 대하여 이들 조건으 로 판정 처리를 시행하고 로프를 잡게 되면 낙하를 중단합니다. X좌표나 Y좌표의 차이의 범위는 조금 넓게 잡아두는 것이 좋습니다. 그래야 로프를 잡기 쉬워 집니다. 특히, 낙하하는 캐릭터가 충돌 범위를 지나쳐버리지 않도록 Y좌표의 차이는 캐릭터가 1프레임에 이동하는 거리보다 넓게 잡아두어야 합니다.
  • 45. 152 게임 매니악스 액션 게임 알고리즘152 그림 3-5 로프를 잡기 위한 조건 X좌표의 차이값이 일정 범위에 있다. abs(rx - x) < max_x 로프의 좌표 (rx, ry) Y좌표의 차이값이 일정 범위에 있다. ry - y >= min_y ry - y < max_y 캐릭터의 좌표 (x, y) 레버를 아래로 입력하고 있지 않다. 로프를 잡으면 캐릭터의 Y좌표를 로프의 Y좌표에 맞춥니다. 잡은 순간 캐릭터의 Y좌표는 경 우에 따라 달라지기 때문에 로프를 정확히 붙잡은 모습을 표현하려면 Y좌표를 보정해야 합 니다. 프로그램 [코드 3-1]은 로프 프로그램입니다. 화면에 펼쳐진 로프를 이용한 좌우 이동과 낙하가 가능합 니다. 캐릭터가 화면의 아래 경계까지 낙하했을 때는 화면의 위 경계에서 다시 등장하도록 하 고 있습니다. 코드 3-1 로프(CRopeMan 클래스) // 캐릭터의 움직임을 처리하는 Move 함수 bool CRopeMan::Move(const CInputState* is) { // X축 방향의 이동 속도 float speed=0.2f; // 캐릭터와 로프의 X좌표 차이값의 최대치 float max_x=0.8f; // 캐릭터와 로프의 Y좌표 차이값의 최소치 float min_y=0.0f; // 캐릭터와 로프의 Y좌표 차이값의 최대치
  • 46. 1533장 - 장치 float max_y=0.2f; // 로프를 잡고 있을 때의 처리 if (VY= =0) { // 레버 입력에 따라 좌우 속도를 설정한다. VX=0; if (is-Left) VX= -speed; if (is-Right) VX=speed; // X좌표를 갱신하고 화면에서 벗어나지 않도록 보정한다. X+ =VX; if (X<0) X=0; if (X>MAX_X-1) X=MAX_X-1; } // 로프를 잡고 있는지 여부를 판정하여 // 잡고 있지 않을 때는 낙하한다. VY=speed; if (!is-Down) { for (CTaskIter i(Game-MoverList); i.HasNext(); ) { CMover* mover=(CMover*)i.Next(); // 레버를 밑으로 넣고 있지 않으며 // 캐릭터와 로프의 X좌표와 Y좌표의 차이가 // 일정 범위 이내라면 로프를 잡는다. // 캐릭터의 Y축 방향의 속도를 0으로 하여 // Y좌표를 로프의 Y좌표로 맞춘다. if ( mover-Type= =1 abs(mover-X-X)<max_x mover-Y-Y>=min_y mover-Y-Y<max_y ) { VY=0; Y=mover-Y; break; } } } // Y좌표 갱신 Y+ =VY; // 캐릭터가 화면 아래 경계를 벗어나면 화면 위쪽에서 다시 등장시킨다. if (Y>MAX_Y) Y= -1;
  • 47. 154 게임 매니악스 액션 게임 알고리즘154 // X축 방향 속도에 따라 캐릭터를 기울어지도록 표시한다. Angle=VX/speed*0.1f; return true; } 샘플 ROPE는 로프 액션 샘플입니다. 캐릭터가 로프를 잡고 있는 동안에는 좌우 레버로 캐릭터를 이동시킬 수 있습니다. 레버를 아래로 입력하거나 로프의 끝을 넘어가면 캐릭터는 낙하합니다. 낙하 중에 새로운 로프가 있다면 그 로프를 잡습니다. 레버를 아래로 계속 입력하고 있으면 캐릭터는 언제까지나 낙하를 지속합니다. ● ROPE → p. 520 3.2 사다리 캐릭터가 잡고 이동할 수 있는 장치입니다. 사다리를 잡고 있는 동안에는 자유롭게 위아래로 이동할 수 있습니다. 좌우로 조금씩 이동하거나 사다리 위에 올라서는 것도 가능합니다. 캐릭터는 사다리를 잡을 수 있습니다(그림 3-6). 사다리를 잡고 있을 때는 레버를 위아래로 입력하여 캐릭터를 상하로 이동시킬 수 있습니다(그림 3-7). 또한 사다리 위에 올라서거나(그림 3-8) 사다리를 이용하여 좌우로 이동할 수도 있습니다(그 림 3-9). 대부분의 경우 사다리는 상하로 뻗어 있기 때문에 좌우로 이동할 수 있는 폭은 그다 지 넓지 않습니다. 사다리가 서로 인접해 있을 경우 옆 사다리로 갈아탈 수 있는 게임도 있습 니다.
  • 48. 2274장 - 지형 이용 지형 이용 CHAPTER   4 액션 게임의 스테이지는 일반적으로 산이나 골짜기 같이 기복이 풍부한 지형으로 구성됩니 다. 바위나 얼음 등의 장애물이 배치되어 있기도 합니다. 캐릭터는 위험한 지형이나 장애물 을 회피하기도 하고, 때로는 이들을 역으로 활용하여 적을 공격하는 등 다양한 액션을 선보 입니다.
  • 49. 228 게임 매니악스 액션 게임 알고리즘228 4.1 벽이나 천장에 매달리기 캐릭터가 벽이나 천장에 매달리는 액션입니다. 벽에 붙어 상하로 이동하거나 천장에 붙어 좌우 로 이동할 수도 있습니다. 또한 벽에서 점프하여 다른 벽이나 천장에 매달릴 수도 있습니다. 먼저, 캐릭터가 벽에 매달리는 상황을 생각해봅시다. 벽에 매달리려면 벽과 가까워져야 합니 다(그림 4-1). 벽 근처에서 벽을 향해 점프하면 매달릴 수 있습니다(그림 4-2). 매달린 상태 에서 점프 버튼을 누르면 캐릭터가 점프하면서 벽에서 떨어집니다. 점프를 잘하면 벽에서 더욱 높은 곳에 있는 플랫폼으로 이동할 수도 있습니다(그림 4-3). 벽과 벽이 서로 가까이 있을 때 는 더욱 재미있는 움직임이 가능해집니다(그림 4-4). 벽에서 벽으로 점프를 반복하여 깊이 파 인 구덩이를 기어오를 수 있습니다. 그림 4-1 캐릭터와 벽 그림 4-2 벽에 매달린다. 캐릭터 벽 벽을 향하여 점프한다. 벽에 매달린다.
  • 50. 2294장 - 지형 이용 그림 4-3 벽에서 떨어진다. 그림 4-4 구덩이에서 기어오른다. 벽에서 플랫폼으로 날아 이동할 수도 있다. 점프하여 벽에서 떨어진다. 벽 사이가 가까우면 차례로 날아 이동할 수 있다. 다음으로 캐릭터가 천장에 매달리는 상황에 대해 살펴봅니다(그림 4-5). 천장을 향하여 점프 하면 천장에 매달릴 수 있습니다. 천장에서 내려올 때는 벽의 경우와 마찬가지로 점프 버튼을 누릅니다(그림 4-6). 캐릭터가 뛰어 내리면서 천장에서 떨어져 나옵니다. 그림 4-5 천장에 매달린다. 그림 4-6 천장에서 떨어진다. 천장에 매달린다. 천장을 향하여 점프한다. 뛰어내려 천장에서 떨어진다. 벽이나 천장에 매달릴 수 있는 게임은 보통 주인공이 ‘닌자’인 경우가 많습니다. 벽이나 천장에 매달려 이동한다고 하는 액션 자체가 마치 닌자처럼 보이기 때문입니다. 예를 들어 닌자 용검 전이나 스트라이더 비룡은 모두 닌자가 주인공인 게임입니다. 벽이나 천장에 매달리거나 그대로 상하좌우로 이동할 수 있고, 다른 벽이나 천장으로 날아 옮겨갈 수도 있습니다.
  • 51. 230 게임 매니악스 액션 게임 알고리즘230 닌자가 아닌 다른 캐릭터를 주인공으로 한 게임 채큰 팝에서도 천장에 매달릴 수 있습니다. 이 게임에서는 캐릭터가 천장에 거꾸로 매달린 채 좌우로 움직일 수 있고, 천장의 기복을 타고 넘어갈 수도 있습니다. 벽이나 천장에 매달리는 게임을 재미있게 만들려면 스테이지의 구성이 중요합니다. 매달리는 액션을 살리기 위해 붙기 쉬운 벽이나 천장을 준비하거나 날아 옮겨가기 쉽도록 벽이나 천장의 간격 설정을 조절합니다. 이러한 게임 스테이지는 액션 게임 중에서도 특이 기복이 풍부한 지 형이라 할 수 있습니다. 알고리즘 벽이나 천장에 매달리는 액션을 구현하려면 캐릭터가 공중에 있는 상태와 캐릭터가 무엇인가 에 매달려 있는 상태를 구분합니다. 여기서는 Jump라는 플래그를 사용해서 캐릭터가 공중에 있을 때, 다시 말해 점프 또는 낙하하고 있을 때는 true로 설정합니다(그림 4-7). 벽이나 천장에 매달려 있거나 플랫폼에 올라서 있을 때는 Jump 플래그를 false로 합니다. 캐 릭터가 벽이나 천장에 매달리는 조건은 다음 2가지입니다(그림 4-8). ●● 캐릭터가 천장에서 일정 범위에 있다. ●● 캐릭터의 속도가 위쪽을 향한다. 그림 4-7 캐릭터 상태를 나타내는 플래그 그림 4-8 천장에 매달린다. 점프를 하면 플래그를 설정한다. Jump = true 이 범위에 캐릭터가 들어오고, 속도가 위쪽을 향하면 천장에 매달렸다고 판정한다. Jump = false 캐릭터의 속도 캐릭터의 속도에 관한 조건이 있는 이유는 캐릭터가 천장으로 달려들 때와 천장으로부터 떨어 져 낙하할 때를 구별하여 전자의 경우에만 매달리도록 하기 위해서입니다. 그러려면 캐릭터가 상승 중일 때, 즉 속도가 위쪽을 향하는지의 여부를 조사하면 됩니다.
  • 52. 2314장 - 지형 이용 마찬가지로 벽과 플랫폼에 대해서도 판정 처리를 시행하여 벽에 매달렸는지 또는 플랫폼에 올 라섰는지의 여부를 조사합니다. 캐릭터의 X축 방향의 속도를 VX, Y축 방향의 속도를 VY라고 한다면 천장과 플랫폼에 관한 조건은 [그림 4-9], 벽에 관한 조건은 [그림 4-10]처럼 지정됩 니다. 캐릭터가 벽과 천장, 플랫폼에 가까워지는 방향으로 각각 충돌 판정이 있는 것이 핵심입 니다. Jump 플래그가 false, 다시 말해 무엇인가에 매달려 있는 상태의 캐릭터는 상하 또는 좌우로 이동할 수 있습니다. 캐릭터가 벽에 접촉하고 있으면 벽에 매달려 있는 상태에서 상하로 이동 할 수 있습니다(그림 4-11). 천장에 접촉하고 있을 때와 플랫폼에 올라서 있을 때는 좌우로 이동할 수 있습니다(그림 4-12). 그림 4-9 천장과 플랫폼의 판정 그림 4-10 벽의 판정 VY > 0이며 이 범위에 캐릭터가 있으면 플랫폼에 올라섰다고 판정한다. VY < 0이며 이 범위에 캐릭터가 있으면 천장에 매달렸다고 판정한다. VX < 0이며 이 범위에 캐릭터가 있으면 오른쪽에서부터 벽에 매달렸다고 판정한다. VX > 0이며 이 범위에 캐릭터가 있으면 왼쪽에서부터 벽에 매달렸다고 판정한다. 그림 4-11 벽에 매달린 채로 이동한다. 그림 4-12 천장에 매달린 채로 이동한다. Jump == false이자 벽에 접촉하고 있으면, 벽에 매달린 상태로 이동할 수 있다. Jump == false이자 천장에 접촉하고 있으면, 천장에 매달린 상태로 이동할 수 있다.
  • 53. 232 게임 매니악스 액션 게임 알고리즘232 프로그램 [코드 4-1]은 벽이나 천장에 매달리는 액션을 구현한 프로그램입니다. 벽이나 천장에 매달려 서 이동을 하거나 벽에서 벽으로 또는 벽에서 천장으로 날아 옮겨갈 수 있습니다. 벽과 천장, 플랫폼에 대해서 각각 충돌 판정 처리를 시행하는 것이 핵심입니다. 코드 4-1 벽이나 천장에 매달리기(CHangOnWallMan 클래스) // 캐릭터 움직임을 처리하는 Move 함수 bool CHangOnWallMan::Move(const CInputState* is) { // X축 방향의 이동 속도 float speed=0.2f; // 점프의 처음 속도 float jump_speed= -0.3f; // 점프 중의 가속도 float jump_accel=0.01f; // 벽, 천장, 플랫폼과의 충돌 판정을 위한 정수 // X좌표 차이의 최대치, Y좌표 차이의 최소치와 최대치 float max_diff=0.6f; float min_dist=0.0f; float max_dist=1.3f; // 벽, 천장, 플랫폼에 접촉했을 때 // 캐릭터를 벽, 천장, 플랫폼에서 적절한 거리로 되돌리기 위한 정수 float adjust_dist=1.0f; // 위쪽 천장, 왼쪽의 벽, 오른쪽의 벽, 아래쪽 플랫폼에 // 캐릭터가 접촉하고 있는지 여부를 나타내는 플래그 bool hit_up=false; bool hit_left=false; bool hit_right=false; bool hit_down=false; // 벽, 천장, 플랫폼에 캐릭터가 접촉했는지의 판정 for (CTaskIter i(Game-MoverList); i.HasNext(); ) { CMover* mover=(CMover*)i.Next(); if (mover-Type= =1) {
  • 54. 3135장 - 특수 행동 특수 행동 CHAPTER   5 액션 게임의 캐릭터는 뛰거나 점프만 하는 것이 아닙니다. 기구에 올라서거나 장치에 걸려 드는 등 다양한 특수 행동을 행합니다. 웅크리거나 구르기도 하고 혹은 거대화하는 등 캐릭 터 자신의 모습을 변화시키는 액션도 있습니다.
  • 55. 314 게임 매니악스 액션 게임 알고리즘314 5.1 스케이트보드 타기 캐릭터가 스케이트보드를 타고 이동하는 액션입니다. 스케이트보드에 타면 평소 걸을 때보다 더 빠른 속도로 이동할 수 있습니다. 스케이트보드는 [그림 5-1]과 같이 올라서는 이동수단입니다. 타는 방법은 게임에 따라 다른 데, 예를 들어 스케이트보드에 접촉하여 버튼을 누를 경우 올라탈 수 있습니다(그림 5-2). 그림 5-1 스케이트보드 그림 5-2 스케이트보드에 올라탄다. 캐릭터 스케이트보드 버튼을 누른다. 캐릭터가 스케이트 보드에 접촉하고 있다. 스케이트보드에 타고 있을 때 레버를 조작하면 입력한 방향으로 스케이트보드가 이동합니다 (그림 5-3). 버튼을 누르면 스케이트보드에서 내려옵니다. 그림 5-3 스케이트보드로 이동한다. 걸어갈 때보다 빠른 속도로 이동할 수 있다. 스케이트보드를 이용한 게임 중 하나로 메트로 크로스가 있습니다. 이 게임에서도 스케이트 보드에 타면 평소 뛰어가는 것보다 빠른 속도로 이동할 수 있습니다. 또한 평범하게 뛰고 있을
  • 56. 3155장 - 특수 행동 때는 속도가 느려지는 타입의 플랫폼 위를 통과할 때도 스케이트보드에 타고 있으면 속도가 느 려지지 않습니다. 다만, 스케이트보드에 타고 있는 동안에는 점프를 할 수 없기 때문에 레버 조 작만으로 장애물을 피해야 합니다. 게임 원더보이에도 스케이트보드가 등장합니다. 이 게임에서는 스케이트보드에 타고 있어도 점프할 수 있습니다. 또한 적에 접촉했을 때는 스케이트보드에서 내려오게 되지만 그 이상의 페널티는 없습니다. 알고리즘 스케이트보드를 구현하려면 캐릭터가 스케이트보드에 타고 있는 상태와 타고 있지 않은 상태 를 구별합니다. 이를 위해서는 스케이트보드의 형상에 맞춘 충돌 판정 처리를 준비하여 캐릭터 와의 사이에서 충돌 판정을 시행합니다(그림 5-4). 캐릭터와 스케이트보드가 서로 접촉하고 있을 때 버튼을 누르면 스케이트보드에 타고 있는 상 태로 이행합니다. 스케이트보드에 타고 있는 상태에서 버튼을 누르면 이번에는 다시 타고 있지 않은 상태로 되돌아갑니다. 그리고 스케이트보드에 타고 있을 때는 이동의 속도가 빨라집니다. 점프나 급격한 방향 전환을 하지 못하도록 하면 더욱 재미있을 것입니다. 그림 5-4 스케이트보드의 충돌 판정 이 영역에 캐릭터가 오면 접촉하고 있는 것으로 판정 프로그램 [코드 5-1]은 스케이트보드 프로그램입니다. 여기에 처리 내용을 조금 추가하면 스케이트보 드를 타고 있을 때는 점프를 불가능하게 하거나 속도가 느려지지 않도록 하는 등의 규칙을 구 현할 수도 있습니다.
  • 57. 316 게임 매니악스 액션 게임 알고리즘316 코드 5-1 스케이트보드(CSkateboardMan 클래스) // 캐릭터의 움직임을 처리하는 Move 함수 bool CSkateboardMan::Move(const CInputState* is) { // 보행 시의 이동 속도 float speed=0.1f; // 스케이트보드의 이동 속도 // 보행 시의 속도에 대한 배율 float skate_speed=3; // 스케이트보드와의 충돌 판정을 위한 정수 // X좌표 차이의 최대치 float max_dist=1.0f; // 레버 입력에 따라 좌우로 이동한다. VX=0; if (is-Left) VX= -speed; if (is-Right) VX=speed; // 스케이트보드에 타고 있을 때는 이동 속도를 빠르게 한다. // Skateboard는 스케이트보드의 포인터로 // 스케이트보드에 타고 있으면 skateboard가 NULL 이외가 된다. if (Skateboard) VX*=skate_speed; // X좌표를 갱신하고 캐릭터가 화면에서 벗어나지 않도록 보정한다. X+ =VX; if (X<0) X=0; if (X>MAX_X-1) X=MAX_X-1; // 버튼을 눌렀을 때의 처리 if (!PrevButton is-Button[0]) { // 스케이트보드에 타고 있으면 스케이트보드에서 내린다. if (Skateboard) { Skateboard=NULL; } else // 아직 스케이트보드에 타고 있지 않으며 // 스케이트보드에 접촉하고 있으면 // 스케이트보드에 탄다. { for (CTaskIter i(Game-MoverList); i.HasNext(); ) { CMover* mover=(CMover*)i.Next(); if (
  • 58. 3175장 - 특수 행동 mover-Type= =1 abs(X-mover-X)<max_dist ) { Skateboard=(CSkateboard*)mover; } } } } // 스케이트보드에 타고 있으면, // 스케이트보드가 캐릭터와 일체화하여 움직이도록 // 양쪽의 X좌표를 일치시킨다. // 또한 케릭터가 스케이트보드에 타고 있는 것처럼 보이도록 // 캐릭터의 Y좌표를 조절한다. if (Skateboard) { Skateboard-X=X; Y=Skateboard-Y+0.05f; } else // 스케이트보드에 타고 있지 않을 때는 // 캐릭터가 플랫폼 위에 서도록 Y좌표를 조절한다. { Y=MAX_Y-2; } // 버튼을 누른 순간을 판정하려면 // 현재의 버튼 상태를 보존해둔다. PrevButton=is-Button[0]; // X축 방향의 속도에 따라 캐릭터를 기울어지도록 표시한다. // 스케이트보드에 타고 있을 때는 기울이지 않는다. Angle=Skateboard?0:VX/speed*0.05f; return true; } 샘플 SKATEBOARD는 스케이트보드의 샘플입니다. 레버 입력으로 캐릭터를 좌우로 이동시킬 수 있습니다. 스케이트보드에 접촉하고 있는 상태에서 버튼을 누르면 스케이트보드에 올라설 수 있습니다. 스케이트보드 에 타고 있는 동안에는 평상시보다 빨리 이동할 수 있습니다. ● SKATEBOARD → p. 523
  • 59. 318 게임 매니악스 액션 게임 알고리즘318 5.2 자동차 움직이고 있는 자동차의 지붕 위로 뛰어오르는 액션입니다. 캐릭터가 제대로 뛰어오르면 자동 차에 탄 상태로 이동할 수 있습니다. 자동차는 [그림 5-5]와 같이 지면을 달립니다. 자동차에 올라서려면 자동차 근처에서 캐릭터 를 점프시킵니다(그림 5-6). 그림 5-5 자동차 그림 5-6 자동차에 타려면 점프한다. 자동차캐릭터 점프한다. 자동차 지붕에 제대로 착지하면 자동차에 탈 수 있습니다(그림 5-7). 캐릭터가 올라서도 자동 차는 이전과 같은 속도로 계속 달립니다. 올라선 상태의 캐릭터 역시 자동차에 실려 같은 속도 로 전진하며 운반됩니다(그림 5-8). 그림 5-7 자동차 위로 뛰어오른다. 그림 5-8 자동차와 함께 전진한다. 자동차 위로 뛰어오른다. 자동차는 이전과 같은 속도로 계속해서 달린다. 자동차에 실려 같은 속도로 전진한다.
  • 60. 3536장 - 무기 무기 CHAPTER   6 액션 게임에서 적을 공격하는 방법이 펀치나 킥만 존재하는 것은 아닙니다. 게임에 따라서 는 다양한 무기를 사용하여 공격할 수 있습니다. 검이나 채찍 등의 무기를 이용한 근접 공 격이 있는가 하면, 수류탄이나 기관총 등을 이용하는 원격 공격도 있습니다. 그 밖에도 유 도 미사일이나 부메랑과 같이 특수한 움직임을 보여주는 무기도 있습니다.
  • 61. 354 게임 매니악스 액션 게임 알고리즘354 6.1 검 검을 휘둘러서 적을 베는 공격입니다. 검의 길이는 게임에 따라 다르지만 캐릭터와 비교적 가 까운 곳에 있는 적을 공격한다는 점에서는 유사합니다. 버튼을 누르면 검을 휘두를 수 있습니다(그림 6-1). 검을 휘두를 때 적을 제대로 맞춘다면 데 미지를 줄 수 있습니다(그림 6-2). 검을 휘두르는 모습을 표현하는 방법은 게임에 따라 다릅니다. 심플하게 검을 앞으로 내밀기만 하는 게임이 있는가 하면 검의 이미지를 회전시키거나 애니메이션으로 표시하는 등의 처리를 통해 검을 휘두르는 분위기를 표현하는 게임도 있습니다. 검을 사용한 게임에는 드루아가의 탑이 있습니다. 이 게임에서는 버튼을 계속 누르고 있으면 캐릭터가 전방을 향해 검을 내밉니다. 검이 나와 있는 동안에 적을 푹 찌르듯 캐릭터를 이동시 키면 적에게 데미지를 입힐 수 있습니다. 원평토마전에서도 검을 사용하고 있습니다. 이 게임은 다양한 모드로 제공되는데, 캐릭터를 크게 표시하는 모드에서는 검의 이미지를 회전 표시하여 검을 휘두르는 모습을 표현합니다. 레 버와의 조합에 따라 위쪽 베기나 아래쪽 베기 등 여러 가지 방법으로 공격할 수 있습니다. 골든 액스에서도 검이나 도끼를 휘두를 수 있습니다. 서로 모양은 다르지만 사용법은 검이나 도끼 모두 동일합니다. 이 게임에서는 검을 휘두르는 모습을 애니메이션으로 표현하고 있습니 다. 점프 공격, 하이점프 공격, 배후 공격 등 공격의 변형variation이 많아 서로 다른 검의 사용법 을 즐길 수 있습니다. 라스탄 사가도 검을 이용한 게임입니다. 기본 무기는 검이지만 아이템을 주우면 도끼 등도 사용할 수 있습니다. 단순히 베는 행동 이외에도 레버의 조합에 따라 위에서 찍어내릴 수도 있 고 아래쪽에서 찌를 수도 있습니다.
  • 62. 3556장 - 무기 그림 6-1 검을 휘두른다. 그림 6-2 적을 벤다. 버튼을 누른다. 검을 휘두른다. 적을 벤다. 알고리즘 검을 구현할 때의 핵심은 검을 휘두르는 모습을 어떻게 표현하는가에 있습니다. 예를 들어 검 의 이미지를 회전 표시하면 비교적 간단하게 분위기를 연출할 수 있습니다. 이미지를 표시하는 위치를 조절하여 캐릭터가 검을 손에 쥐고 있는 분위기를 만들면 좋겠습니다. 또 하나의 핵심은 적을 벨 때의 처리입니다. 검과 적의 충돌 판정을 시행하고, 검이 적에 접촉 하면 적에게 데미지를 부여합니다. 충돌 판정은 검의 움직임 처리에서 시행하는 방법과 적의 이동 처리에서 시행하는 방법이 있으며 어느 쪽을 사용해도 무방합니다. 그림 6-3 검의 처리 검을 휘두르기 시작했을 때부터의 경과 시간에 따라 위치나 각도를 변화시킨다. 검에 닿으면 데미지를 받는다.
  • 63. 356 게임 매니악스 액션 게임 알고리즘356 프로그램 [코드 6-1]은 검을 이용한 공격을 구현한 프로그램입니다. 이 샘플에서는 검의 이미지를 회전 시켜 검을 휘두르는 모습을 표현합니다. 검의 이동처리나 표시처리는 캐릭터의 처리 과정에서 시행할 수도 있지만 이 프로그램에서는 검과 캐릭터를 서로 별개의 객체로 처리했습니다. 또한 검과 적의 충돌 판정은 적의 이동처리에서 시행합니다. 적이 검에 닿으면 데미지를 받습 니다. 이 적의 객체는 6장의 다른 샘플에서도 이용합니다. 코드 6-1 검(CWeaponEnemy 클래스, CSwordMan 클래스, CSword 클래스) // 적의 움직임을 처리하는 Move 함수 // 이 적은 '검' 프로그램 외에 다른 무기의 샘플에서도 사용한다. bool CWeaponEnemy::Move(const CInputState* is) { // 공중에 있을 때 가속도 float accel=0.02f; // 당했을 때 회전 속도 float vangle=0.05f; // 무기와의 충돌 판정을 위한 정수 // X좌표 차이의 최대치 float max_dist=0.5f; // 당했을 때의 속도 float knockout_vx=0.4f; float knockout_vy= -0.5f; // 상태에 따라 분기한다. switch (State) { // 평상시 상태 case 0: // X좌표의 갱신 X+ =VX; // 화면의 왼쪽 경계로 나가면 위치를 초기화하여 재등장시킨다. if (X<-1) Init(); // 무기와 충돌 판정
  • 64. 3576장 - 무기 // 무기와 접촉하면 속도를 설정하고, 당한 상태로 이행한다. for (CTaskIter i(Game-MoverList); i.HasNext(); ) { CMover* mover=(CMover*)i.Next(); if ( mover-Type= =1 abs(X-mover-X)<max_dist*mover-W abs(Y-mover-Y)<max_dist*mover-H ) { // 튕겨 날려진 모습을 표현하기 위해 // 속도를 설정한다. VX=knockout_vx; VY=knockout_vy; // 당한 상태로 이행한다. State=1; // 적에 부딪히면 사라지는 무기일 경우에는 // 무기를 삭제한다. if (RemoveWeapon) i.Remove(); break; } } break; // 당한 상태 case 1: // X좌표의 갱신 X+ =VX; // Y축 방향의 속도를 갱신한다. VY+ =accel; // Y축 방향의 갱신 Y+ =VY; // 당하고 있는 모습을 표시하기 위해 이미지를 회전시킨다. Angle+ =vangle; // 화면의 오른쪽 경계로 나가면 위치를 초기화하여 재등장시킨다. if (X>MAX_X) Init(); break; }
  • 65. 358 게임 매니악스 액션 게임 알고리즘358 return true; } // 캐릭터의 움직임을 처리하는 Move 함수 bool CSwordMan::Move(const CInputState* is) { // 이동 속도 float speed=0.2f; // 검을 꺼내지 않을 때의 처리 // Sword는 검을 꺼내고 있는지를 나타낸다. if (!Sword) { // 레버 입력에 따라 좌우로 이동한다. // 공격의 방향을 정하기 위해 // 캐릭터가 이동한 방향을 보존해둔다. // VX와 VY는 캐릭터의 속도를 나타내는 변수 // DirX와 DirY는 캐릭터의 이동 방향을 나타내는 변수 VX=0; if (is-Left) { DirX= -1; VX= -speed; } if (is-Right) { DirX=1; VX=speed; } // X좌표를 갱신하고 캐릭터가 화면에서 벗어나지 않도록 보정한다. X+ =VX; if (X<0) X=0; if (X>MAX_X-1) X=MAX_X-1; // 버튼을 누르면 검을 꺼낸다. // 이 샘플에서는 검의 객체를 작성한다. if (is-Button[0]) { new CSword(this); Sword=true; } } // X축 방향의 속도에 따라 캐릭터를 기울어지도록 표시한다. Angle=VX/speed*0.1f;
  • 66. 4197장 - 아이템 아이템 CHAPTER   7 액션 게임에는 다양한 아이템이 등장합니다. 그 중에는 주웠을 때 오히려 데미지를 입는 아 이템도 있지만 대부분의 아이템은 어떤 식으로든 메리트를 제공합니다. 득점으로 연결되는 아이템이 대부분이며 무적 상태가 되는 아이템이나 주워 던질 수 있는 아이템 등도 있습니 다. 또한 아이템의 등장 방법에도 몇 가지 패턴이 있습니다.
  • 67. 420 게임 매니악스 액션 게임 알고리즘420 7.1 무적 아이템 해당 아이템을 주운 캐릭터는 주기적으로 무적 상태를 유지합니다. 무적 상태인 동안에는 적을 몸으로 직접 공격하여 데미지를 입힐 수 있습니다. 아이템은 캐릭터가 접촉하면 주울 수 있습니다(그림 7-1). 아이템을 주운 캐릭터는 일정 시간 무적 상태를 유지합니다(그림 7-2). 여기서는 캐릭터를 거대화하여 무적 상태를 표현했습니 다. 무적 상태에서는 적에게 접촉해도 데미지를 입지 않습니다. 반대로 캐릭터에게 접촉한 적 에게는 데미지를 입힐 수 있습니다. 무적 아이템을 사용한 게임에는 팩맨이 있습니다. 이 게임에서는 특정 아이템을 먹은 캐릭터 가 일정 시간 무적 상태를 유지합니다. 무적 상태에서는 적에게 몸으로 부딪혀 적을 먹어치울 수 있습니다. 채큰 팝에도 무적 아이템이 있습니다. 이 게임에서는 적을 폭탄으로 쓰러뜨리게 되는데 적을 퇴치했을 때 무적 아이템이 나오는 경우가 있습니다. 이것을 주우면 일정 시간 캐릭터는 무적 상태가 되어 몸으로 적을 쓰러뜨릴 수 있습니다. 그림 7-1 아이템을 줍는다. 그림 7-2 무적 상태 아이템을 줍는다. 일정 시간 거대화해진다. 적과 접촉해도 데미지를 입지 않는다. 접촉한 적은 데미지를 입는다. 알고리즘 아이템을 얻어 무적이 되는 액션을 구현하려면 캐릭터의 상태를 관리해야 합니다(그림 7-3).
  • 68. 4217장 - 아이템 평소 상태의 캐릭터가 아이템을 획득하면 무적 상태로 이행합니다. 무적 상태에서 일정 시간이 경과하면 평소 상태로 되돌아갑니다. 그림 7-3 아이템으로 무적이 되는 처리 아이템 획득 일정 시간이 경과 평소 상태 무적 상태 프로그램 [코드 7-1]은 무적 아이템 프로그램입니다. 이 샘플에서는 캐릭터를 크게 표시하여 무적 상태 를 표현했습니다. 그 외에 캐릭터를 깜빡거리게 하거나 캐릭터 주위에 효과를 내는 등의 방법 으로 무적 상태를 표현할 수도 있습니다. 코드 7-1 무적이 되는 아이템(CItem 클래스, CInvincibleItemMan 클래스) // 아이템의 움직임을 처리하는 Move 함수 bool CItem::Move(const CInputState* is) { // 각도의 갱신 // 아이템을 좌우로 진동시킨다. Angle=sin(Time*0.1f)*0.1f; // 시간의 갱신 Time+ +; return true; } // 캐릭터의 움직임을 처리하는 Move 함수
  • 69. 422 게임 매니악스 액션 게임 알고리즘422 bool CInvincibleItemMan::Move(const CInputState* is) { // 이동 속도 float speed=0.2f; // 아이템과의 충돌 판정을 위한 정수 // X좌표 차이의 최대치 float max_dist=0.6f; // 무적 시간(프레임 수) int invincible_time=180; // 레버 입력에 따라 좌우로 이동한다. VX=0; if (is-Left) VX= -speed; if (is-Right) VX=speed; // X좌표를 갱신하고 화면에서 벗어나지 않도록 보정한다. X+ =VX; if (X<0) X=0; if (X>MAX_X-1) X=MAX_X-1; // 평소 상태의 처리 // InvincibleTime은 무적 상태의 잔여 시간을 나타낸다. // 잔여 시간이 0일 때는 평소 상태가 된다. if (InvincibleTime= =0) { // 아이템에 접촉하면 아이템을 줍는다. // 주운 아이템은 좌표를 초기화하여 다시 등장시킨다. // 또한 무적 시간을 설정한다. for (CTaskIter i(Game-MoverList); i.HasNext(); ) { CMover* mover=(CMover*)i.Next(); if ( mover-Type= =2 abs(X-mover-X)<max_dist abs(Y-mover-Y)<max_dist ) { ((CItem*)mover)-Init(); InvincibleTime=invincible_time; } } // 크기와 Y좌표의 설정 W=H=1;
  • 70. 4237장 - 아이템 Y=MAX_Y-2; // 충돌 판정의 종류를 설정한다. Type=0; } else // 무적 상태의 처리 { // 무적 시간을 줄인다. InvincibleTime- -; // 크기와 Y좌표의 설정 // 무적의 분위기를 나타내기 위해 // 캐릭터를 크게 표시한다. W=H=2; Y=MAX_Y-2.5f; // 충돌 판정의 종류를 설정한다. // 접촉한 적을 쓰러뜨릴 수 있도록 한다. Type=1; } // X축 방향의 속도에 따라 캐릭터를 기울어지도록 표시한다. Angle=VX/speed*0.1f; return true; } 샘플 INVINCIBLE ITEM은 무적 아이템의 샘플입니다. 레버로 캐릭터를 좌우로 움직이고 아이템을 줍습니다. 아이템을 주우면 캐릭터는 일정 시간 무적 상태가 되어(거대화되어), 몸으로 적을 쓰러뜨릴 수 있습니다. ● INVINCIBLE ITEM → p. 525