w w w. h a n b i t . c o . k r
이것이 프로그래밍이다! 저자 직강 동영상 제공!
이것이 안드로이드다
이것이 C언어다
이것이 자바다
진정한 안드로이드 개발자로 이끌어줍니다.
세상에 없던 새로운 C언어 입문서 탄생!
가장 중요한 프로그래밍 언어를 하나 배워야 한다면, 결론은 자바다!
SDK 5.0 롤리팝 호환!
삼성, LG에서 펼쳐졌던 전설의 명강의를 풀타임 동영상 강좌로!
중급 개발자로 나아가기 위한 람다식, JavaFX, NIO 수록
이보다 더 확실한 방법은 없다, 칠판강의
책만 보고, 동영상 강좌로도 만족하지 못했다면 Daum 카페 '슈퍼드로이드'에서 만나요
전체 동영상 강좌 유투브 전격 공개!
자바의 모든 것을 알려주는 인터넷 강의 궁금한 것은 카페에서!
cafe.daum.net/superdroid
http://goo.gl/tJK3Tu
cafe.naver.com/thisisjava
박성근 저 | 1,164쪽 | 45,000원
서현우 저 | 708쪽 | 25,000원
신용권 저 | 1,224쪽 | 30,000원
w w w. h a n b i t . c o . k r
지금은 모던 웹 시대! 모던 웹 디자인을 위한
모던 웹을 위한
HTML5 + CSS3 입문 HTML5 분야 부동의 1위 도서
JavaScript + jQuery 입문
HTML5 표준안 확정에 맞춘 완전 개정판의 귀환!
자바스크립트에서 제이쿼리, 제이쿼리 모바일까지 한 권으로 끝낸다!
HTML5 권고안과 최신 웹 브라우저 환경 대응
시대의 흐름에 맞춰 다시 쓴 자바스크립트 교과서
윤인성 저 | 624쪽 | 30,000원
윤인성 저 | 980쪽 | 32,000원
모던 웹을 위한
HTML5 + CSS3 정복
Node.js
프로그래밍 페이스북, 월마트, 링크드인은 왜 Node.js를 선택했는가?
필요한 것만 배워 바로 현장에서 쓰는 HTML5
이 물음에 대한 답은 Node.js가 보여주는 빠른 처리 능력 때문이다.
순서대로 읽으며 실습할 수 있는 HTML5 자습서
윤인성 저 | 484쪽 | 25,000원
김상형 저 | 700쪽 | 32,000원
게임 매니악스 액션 게임 알고리즘 : 페르시아의 왕자, 슈퍼 마리오, 소닉, 젤다의 전설을 구현하는 기술 초판발행 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 ) 로 보내주세요. 한빛미디어(주)는 여러분의 소중한 경험과 지식을 기다리고 있습니다.
옮긴이의 말
현실에서 할 수 없거나 해보기 어려운 경험이 게임에서는 가능합니다. 길을 가다 몬스터를 잡 거나 건물과 건물 사이를 뛰어다닐 수 있습니다. 그리고 노력한 만큼 보상도 해주죠. 그래서 우 리는 게임에 열광하고, 좋아하는 것을 넘어 나만의 게임을 상상해보고, 또 직접 만들게 되나 봅 니다. 이 책은 지금까지 보았던 멋지고 화려한 게임 액션이 어떻게 만들어졌는지 다양한 예제를 통해 소개하고 있습니다. 수많은 게임 장르 중에서 액션 게임을 선택하신 여러분께 큰 도움이 되었 으면 합니다. 한국 게임 산업의 현황이나 발전 방향에 대해 물으신다면 딱히 드릴 말씀은 없습니다. 그러나 한국 게임 개발자들은 어떤 사람들이냐고 물으시면 그 역사와 환경에 비해 감히 세계 최고라고 말씀드립니다. 주변에서 늘 함께하는 선후배 게임 개발자들을 보며 매일 드는 생각입니다. 그런 분들을 위해, 그리고 원서의 명성과 『게임 매니악스』 시리즈에 누가 되지 않아야 한다는 마음으로 원고를 여러 번 살펴보았습니다. 그래도 어딘가 부족함이 보이겠지만, 이 책을 펼쳐 보시는 현역 게임 개발자 그리고 앞으로 게임 개발자가 되실 여러분께 멋진 참고서가 되어줄 것이라 자신합니다. 끝으로 이 책이 나오기까지 함께 해주신 많은 분들과 한빛미디어 이복연 과장님, 박지영 대리 님, 김진불 차장님께 진심으로 감사드립니다. 2015년 여름 옮긴이_
4
Wisdom Teeth
지은이의 말
이 책은 ‘액션 게임의 구조’를 설명하는 책이지만 게임 프로그래밍의 입문서로도 활용할 수 있 을 것입니다. 이런 분들께 이 책을 추천합니다. ●●
액션 게임의 내부 구조를 이해하고 게임을 더 즐기고 싶다.
●●
액션 게임을 만들고 싶다.
●●
학교 과제로 액션 게임을 만들게 되었으나 어디서부터 시작해야 할지 모르겠다.
●●
대시, 점프, 무기, 아이템 등 다양한 장치의 구현 방법을 알고 싶다.
●●
액션 게임을 구성하는 기술 목록을 찾고 있다.
●●
액션 게임에 대한 열띤 토론을 위한 기본서를 가지고 싶다.
●●
예전에 즐겼거나 만든 액션 게임을 떠올리며 추억에 빠져들고 싶다.
●●
그냥 액션 게임이 좋다.
이 책은 순서에 상관없이 원하는 부분만 골라 읽어도 무방합니다. 그림을 중심으로 설명하고 있으니 그림만이라도 만화를 보듯이 편한 마음으로 보시기 바랍니다. 또한 다양한 기법을 간단 하게 정리한 프로그램을 다수 제공하므로 이를 활용하면 액션 게임을 만들 때 많은 도움이 될 것입니다. 게임 기획자와 디자이너, 심지어 게이머에게도 액션 게임의 세계를 더 깊게 즐기도록 해주는 가이드북이 될 것입니다. 지은이_ 마츠우라 켄이치로, 츠카사 유키
5
CONTENTS
CHAPTER
옮긴이의 말 ..........................................................................................................................
4
지은이의 말 ..........................................................................................................................
5
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
6
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
7
CONTENTS
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
8
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
9
CONTENTS
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
10
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
11
CHAPTER
0 소개
대시 점프를 하여 산을 넘고 계곡을 건너 적을 물리치고 목적지에 도달해야 하는 대담하고 섬세한 게임을 액션 게임이라고 할 수 있습니다. 대부분의 액션 게임은 ‘8방향 버튼 + 점프 버튼 + 공격 버튼’ 정도면 조작할 수 있지만 작품에 따라 완전히 다른 게임성을 제공한다는 점이 액션 게임의 매력입니다. 하드웨어가 진화하며 그래픽과 사운드는 크게 향상되었지만 ‘달리고, 뛰고, 도망가고, 수집하다’라는 액션 게임의 본질은 예전부터 거의 변하지 않았습 니다. 최근에는 스마트폰이나 휴대용 게임기, 플래시나 HTML5를 활용한 웹 브라우저 게 임이 보급되어 고전 2D 액션 게임이 다시 주목을 받고 있습니다.
0장 - 소개
13
0.1 액션 게임의 기본 요소 먼저 액션 게임이 어떠한 요소로 구성되어 있는지 확인해봅시다. 액션 게임에 필요한 요소는 그리 많지 않습니다. 대부분은 [그림 0-1 ]과 같은 요소로 구성됩 니다. 그림 0-1 액션 게임의 기본 구성
점수 무기 배경 캐릭터
적 아이템
지형
●●
캐릭터 플레이어가 조작하는 캐릭터입니다. 인간이나 로봇과 같이 사람의 형태를 띠는 경우가 많으나 동물이나 자동 차, 심지어 인형이나 공룡인 경우도 있습니다.
●●
적 캐릭터에게 공격해오는 상대입니다. 대부분 게임에서는 적과 충돌하면 충격을 받기 때문에 회피의 대상입니다.
●●
무기 캐릭터가 적에게 행하거나 적이 캐릭터에게 행하는 공격입니다. 무기로 적을 공격하면 충격을 주게 됩니다.
●●
지형 스테이지를 구성하는 플랫폼이나 벽 등을 말합니다. 게임에 따라 밧줄, 사다리, 컨베이어 벨트 등 다양한 장치 가 등장합니다.
●●
배경 캐릭터나 적의 배후에 표시되는 하늘이나 나무 등을 말합니다. 화면을 화려하게 꾸미기도 하고, 스크롤하여 속 도감을 표현하기도 합니다. 평소에는 캐릭터나 적이 부딪혀도 아무 일도 일어나지 않습니다.
●●
아이템 캐릭터가 주우면 다양한 효과를 얻게 됩니다. 점수를 얻거나 무적이 되는 등 그 종류는 무궁무진합니다.
14
게임 매니악스 액션 게임 알고리즘
●●
점수 득점입니다. 보통은 적을 물리쳐 아이템을 줍거나 한 스테이지를 완료하면 점수를 얻을 수 있습니다.
규칙은 게임에 따라 다릅니다. 예를 들어 캐릭터와 적이 충돌하면 충격을 받지 않고 오히려 점 수를 얻는 경우도 있습니다. 이렇듯 게임별로 세세한 차이는 있지만 기본적으로는 지금까지 설 명한 요소를 조합하여 액션 게임을 만듭니다.
0.2 액션 게임에서의 움직임 처리 캐릭터의 매끄러운 동작은 사실 작은 움직임을 연속해서 빠르게 보여주는 것입니다(그림
0-2 ). 예를 들어 화면의 왼쪽 끝에서 오른쪽 끝까지 움직인다면, 처음에는 화면 폭의 1/100만 움직이고 다음에 다시 1/100을 더 움직이는 식으로, 총 100번의 연속된 움직임을 연이어서 만 들어냅니다. 그림 0-2 액션 게임의 진행
캐릭터를 조금 움직인다.
1/60초의 짧은 주기를 반복한다.
적을 조금 움직인다.
작은 움직임이 쌓여 연속된 동작으로 보인다.
무기를 조금 움직인다. 지형을 조금 움직인다. 배경을 조금 움직인다. 아이템을 조금 움직인다.
이 작은 움직임은 대단히 짧은 주기로 반복됩니다. 대부분의 게임에서는 이 주기를 화면 갱신 주기와 맞춥니다. 예를 들어 TV나 PC용 모니터의 일반적인 화면 갱신 주기는 1/60초이므로 게임에서도 1/60초 주기로 갱신합니다. 갱신 주기와 게임 주기를 맞추면 애니메이션을 매끄럽 게 표시할 수 있기 때문입니다.
0장 - 소개
15
적, 무기, 지형, 배경, 아이템 등의 움직임도 캐릭터와 마찬가지로 작은 움직임을 반복해서 만 들어냅니다. 액션 게임의 프로그램은 각 캐릭터·적·무기·지형·배경·아이템 등을 조금씩 움직이게 하는 처리를 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와 같이 다양한 방식으로 표현됩니다.
16
게임 매니악스 액션 게임 알고리즘
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
0장 - 소개
17
그림 0-3 충돌 판정 처리 X축 캐릭터의 충돌 판정 (CL, CT) ~ (CR, CB)
적의 충돌 판정 (EL, ET) ~ (ER, EB)
캐릭터와 적이 접촉하는 조건
Y축
CL < ER && EL < CR && CT < EB && ET < CB
캐릭터의 중심 좌표에 대해 충돌 판정이 상하·좌우 대칭일 경우에는 [그림 0-4 ]와 같은 방법 으로 충돌 판정 처리를 할 수도 있습니다. 캐릭터의 중심 좌표를 (CX, CY ), 적의 중심 좌표를 (EX, EY ), X축 방향 충돌 판정의 거리를 XDIST, Y축 방향 충돌 판정의 거리를 YDIST라고 합니다. 이때 캐릭터와 적이 접촉하는 조건은 다음과 같습니다.
abs (CX - EX ) < XDIST && abs (CY - EY ) < YDIST
abs는 절댓값을 구하는 함수입니다. 이 식은 캐릭터와 적이 X축 방향과 Y축 방향 각각에서 일 정 거리 내에 있다면 접촉했다고 판단한다는 의미입니다. 그림 0-4 상하·좌우 대칭일 경우의 충돌 판정 처리 X축 Y축 방향 충돌 판정 거리 YDIST
적 중심 좌표 (EX, EY)
X축 방향 충돌 판정 거리 XDIST 캐릭터 충돌 판정 (CX - XDIST, CY - YDIST) ~ (CX+ XDIST, CY + YDIST)
Y축
18
캐릭터 중심 좌표 (CX, CY)
캐릭터와 적이 접촉하는 조건
abs(CX - EX) < XDIST && abs(CY - EY) < YDIST
게임 매니악스 액션 게임 알고리즘
0.4 태스크 시스템 태스크 시스템이란 게임 프로그램에서 사용하는 장치 중 하나입니다. 장르에 상관없이 다양한 게임에 적용할 수 있는데 특히 액션 게임이나 슈팅 게임에 적합합니다. 게임에 따라서는 태스 크 시스템을 다른 이름으로 부르기도 합니다. 태스크 시스템은 복수의 태스크(일)를 병렬 처 리하기 위한 장치입니다. 태스크 시스템을 사용한 게임 프로그램에서는 게임에 등장하는 각종 요소를 태스크에서 표현합니다. 액션 게임을 예로 들면 캐릭터, 적, 무기 등의 사물 처리를 각 각의 태스크가 담당합니다. 태스크는 일종의 스레드 같은 것입니다. 게임에서는 보통 수많은 사물이 동시에 움직여서 자칫 복잡해질 수 있는데, 태스크 시스템을 사용하면 훨씬 쉽게 처리할 수 있습니다. 또한, 태스크 시스템이 제공하는 태스크 생성과 삭제 기능은 ‘무기 발사 처리’나 ‘쓰러진 적 지우기 처리’ 등에 도 도움이 됩니다. 게다가 메모리 할당과 해제까지 관리해주는 태스크 시스템이라면 메모리 단 편화로 인한 성능 하락 걱정 없이도 태스크를 마음껏 생성하고 삭제할 수 있습니다. 태스크 시스템이 태스크를 실행하는 방식은 게임에서의 물체 움직임과 민첩성에 영향을 줍니 다. 예를 들어 캐릭터와 적이 하나씩 있고 무기가 2개인 상황을 가정해봅시다(그림 0-5 ). 태 스크 시스템은 캐릭터와 적, 그리고 두 무기에 태스크를 하나씩 할당하므로 이때 필요한 태스 크의 수는 총 4개가 됩니다. 그리고 이 태스크들을 차례로 실행하여 이동이나 애니메이션 등을 처리합니다. 그 밖에 플랫폼 등의 지형을 태스크로 처리하기도 합니다. 그림 0-5 캐릭터와 적이 하나씩, 무기가 2개인 상황 무기 무기 캐릭터
적
이번에는 게임에서 사물을 생성하는 상황에 대해 살펴봅니다.
0장 - 소개
19
●●
캐릭터가 등장한다.
●●
적이 출현한다.
●●
캐릭터가 무기를 발사한다.
●●
아이템을 떨군다.
이때 새로운 캐릭터와 적, 무기, 아이템을 생성하게 됩니다. 태스크 시스템에서는 이러한 사물 의 생성이 곧 태스크의 생성을 뜻합니다(그림 0-6 ). 사물을 삭제해야 하는 상황 역시 다양합 니다. 예를 들면 다음과 같습니다. ●●
주운 아이템을 버린다.
●●
적에게 명중한 무기를 지운다.
●●
무기에 맞은 적을 지운다.
●●
적에 부딪힌 캐릭터를 지운다.
●●
화면 밖으로 사라진 아이템을 지운다.
●●
화면 밖으로 사라진 무기를 지운다.
●●
화면 밖으로 사라진 적을 지운다.
그림 0-6 사물 생성 = 태스크 생성 무기 발사 (무기 태스크 생성)
캐릭터 등장 (캐릭터 태스크 생성)
아이템 등장 (아이템 태스크 생성)
적 출현 (적 태스크 생성)
이러한 예가 바로 캐릭터, 적, 무기, 아이템의 삭제 처리입니다. 태스크 시스템은 태스크를 삭 제해서 사물을 삭제합니다(그림 0-7 ). 이 책의 샘플들은 태스크 시스템을 이용하여 작성되었 습니다. 태스크 시스템을 잘 몰라도 내용을 이해하는 데에는 전혀 무리가 없으므로 걱정하지
20
게임 매니악스 액션 게임 알고리즘
않아도 됩니다. 태스크 시스템에 대한 자세한 내용은 『게임 매니악스 탄막 게임 알고리즘』(한 빛미디어, 2014 )의 ‘2장 캐릭터 움직이기’를 참고하세요. 그림 0-7 사물 삭제 = 태스크 삭제 적에 명중한 무기를 지운다. (무기 태스크 삭제)
주운 아이템을 지운다. (아이템 태스크 삭제)
무기에 맞은 적을 지운다. (적 태스크 삭제)
0.5 액션 게임 제작 순서 액션 게임 제작을 취미로 하든 일로 하든 또는 학교 과제로 하든 그 기본 순서는 크게 다르지 않습니다(그림 0-8 ). 여러 사람이 함께 개발한다면 몇 가지 작업이 추가로 필요합니다. 먼저 게임을 구상해야 합니다. 회사 업무라면 기획서를 쓰거나 예산을 확보하는 일도 필요할 것입니다. 기본적인 구상이 어느 정도 완성되면 그래픽, 음향, 프로그램 작성을 시작합니다. 게 임에 필요한 데이터와 프로그램을 만들면서 추가로 구상을 해나가는 경우도 있을 것입니다. 좋은 게임을 만들려면 반복해서 테스트해야 합니다. 단순히 움직이는 수준에 만족하지 않고, 최대한 반복해서 테스트하고 버그를 잡아 밸런스를 조절해야 합니다.
0장 - 소개
21
그림 0-8 액션 게임을 제작하는 순서 개발 시작
구상/아이디어(기획서 작성)
그래픽 제작
음향 제작
프로그램 작성
통합
테스트 디버그 및 밸런스 조절 완성?
아니오
예 공개 또는 판매
개발 완료
0.6 게임 플랫폼과 개발 환경 이 절에서는 액션 게임 프로그램을 작성하려면 무엇이 필요한지 살펴보겠습니다.
0.6.1 게임 플랫폼 먼저 게임을 실행할 플랫폼을 선택해야 합니다. 주로 이용되는 플랫폼은 다음과 같습니다.
22
게임 매니악스 액션 게임 알고리즘
●●
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라는 언어를 사 용하여 게임 등의 창의적이고 인터랙티브한 콘텐츠를 만들 수 있습니다. 어도비가 판매하고 있는 정식 개발 환
0장 - 소개
23
경 외에 무료 개발 환경도 구할 수 있습니다.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/쯔꾸르
24
게임 매니악스 액션 게임 알고리즘
다만, 책에 수록된 소스 코드는 각 알고리즘의 핵심만 발췌한 것입니다. 관련 처리나 클래스 정 의는 전체 샘플 코드에서 각 알고리즘에 대응하는 부분을 참고하기 바랍니다.
0.8 샘플 프로그램 실행 방법 내려받은 샘플 프로그램은 소스 파일, 데이터 파일, 실행 파일로 구성되어 있습니다. 샘플을 돌 려보려면 Output\Exe\Debug 폴더 또는 Output\Exe\Release 폴더에 있는 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’로 지정하면 됩니다.
0장 - 소개
25
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 정리 이 장에서는 액션 게임의 전체적인 윤곽을 짚어보며 게임 프로그래밍의 요점과 필요한 개발 환 경을 정리했습니다. 게임 프로그래밍은 절대 어렵지 않습니다. 환경을 준비하거나 라이브러리 의 성격을 파악하는 등 처음의 몇 가지 어려움만 극복하면 됩니다. 먼저 샘플을 조작해보고 빌 드하고 조금씩 수정하는 것부터 시작하면 재미있고 수월하게 액션 게임 프로그래밍의 세계로 들어설 수 있을 것입니다. 무엇보다 액션 게임 만들기는 마음 편하게 먹고 게임을 즐기는 것부터 시작하면 됩니다.
26
게임 매니악스 액션 게임 알고리즘
CHAPTER
1 이동
1장에서 설명하는 ‘이동’은 액션 게임에서의 가장 기본적인 액션입니다. 걷기, 뛰기, 점프하 기부터 헤엄치기와 미끄러지기에 이르기까지 그 종류는 정말 다양합니다.
1장 - 이동
27
1.1 레버 대시 레버1를 특정 방향으로 조작하여 캐릭터를 가속하는 액션입니다. 대부분의 게임에서는 조이스 틱의 레버(또는 이동 버튼)로 플레이어를 상하좌우로 이동시킬 수 있습니다. 여기에 가속 요 소를 곁들이면 훨씬 멋진 움직임이 만들어집니다. 예를 들어 [그림 1-1 ]처럼 캐릭터가 정지한 상태에서 레버를 오른쪽으로 입력하면 [그림
1-2 ]와 같이 캐릭터가 오른쪽으로 움직이기 시작합니다. 입력 상태인 채로 계속 놔두면 움직 임의 속도가 점점 빨라집니다(그림 1-3 ). 캐릭터가 너무 빨리 이동하면 조정하기 어렵기 때문 에 최대 속도는 제한하는 것이 좋습니다. 레버 조작을 중단하면 캐릭터는 점차 감속합니다(그 림 1-4 ). 또한 레버를 반대로 조작할 경우 더 빠르게 감속시키면 좋겠지요(그림 1-5 ). 예를 들어 눈앞에 적이나 장애물이 출현하여 급하게 정지하고 싶을 경우, 레버를 반대 방향으로 입 력하여 캐릭터를 정지할 수 있으면 편리할 것입니다. 이 경우에도 한순간에 속도를 0으로 떨어 뜨리는 것이 아니라 조금씩 시간을 두고 감속하는 것이 핵심입니다. 이렇게 하면 빠른 속도로 이동하면 할수록 급정지가 어려워지기 때문에 현실적인 움직임이 만들어집니다. 또한 빨리 이 동할수록 장애물을 피하기 어려워지기 때문에 조작 난이도가 높아집니다. 단, 급하게 감속할 때 흙먼지를 일으키거나 브레이크 음을 울리는 등의 연출이 있으면 재미가 더해질 것입니다. 그림 1-1 정지 상태의 캐릭터
그림 1-2 레버를 오른쪽으로 입력하면 오른쪽으로 이동한다.
정지 상태의 캐릭터
레버를 오른쪽으로 입력하면 오른쪽으로 이동한다.
1 역자주_ 주로 왼손이나 왼손 엄지로 방향을 조작할 때 쓰는 막대를 말합니다. 스틱(stick)이라고도 부릅니다.
28
게임 매니악스 액션 게임 알고리즘
그림 1-3 레버를 입력한 채 그대로 있으면 가속한다. 레버를 오른쪽으로 입력한 채로 그대로 있으면 가속한다.
그림 1-4 레버 입력을 멈추면 점차 감속한다.
그림 1-5 레버를 반대 방향으로 입력하면 빠르게 감속한다. 레버를 반대 방향으로 입력하면 급하게 감속한다.
레버 입력을 멈추면 감속한다.
레버 대시를 활용한 게임으로는 <슈퍼 마리오 브라더스>나 <소닉 더 헤지혹> 등이 있습니다. <슈퍼 마리오 브라더스>는 버튼을 사용한 대시(1.2절)도 지원합니다. <소닉 더 헤지혹>은 루 프(1.12절) 등을 포함해 기복이 심한 주변 지형이나 캐릭터가 몸을 돌돌 말아 더욱 빠르게 가 속하는 액션(5.7절) 등을 지원합니다. <슈퍼 마리오 브라더스>와 <소닉 더 헤지혹>은 비슷한 점이 많지만 게임성은 상당히 다릅니 다. 굳이 말하자면 <슈퍼 마리오 브라더스>는 가속과 점프가 급격하기 때문에 지형 패턴을 확 실하게 외우고, 타이밍을 정확히 맞춰 점프해야 하는 게임입니다. 이에 비해 <소닉 더 헤지혹 >은 점프한 후의 궤도를 조정하기 때문에 조금 더 편하고 쉽게 즐길 수 있는 게임입니다. 같은 레버 대시를 채택한 게임에서도 가속이나 점프 등을 어떻게 활용하느냐에 따라 전혀 다른 게임 이 되기도 합니다. 레버 대시를 사용한 게임 중 조금 독특한 게임으로는 <버닝 러버>가 있습니 다. 이것은 종-스크롤 자동차 경주 게임으로 레버를 조작하여 자동차를 가속할 수 있습니다.
1장 - 이동
29
알고리즘 레버 대시를 구현하려면 레버의 조작 상태에 맞게 캐릭터의 이동 속도를 변화시킵니다. 캐릭터 가 오른쪽으로 이동한다고 생각해봅시다. 레버가 오른쪽으로 입력되어 있으면 캐릭터의 속도 를 증가시킵니다(그림 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 )로 감속시켰지만 감속 정도는 자유롭게 결정하면 됩니다.
30
게임 매니악스 액션 게임 알고리즘
그림 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) {
1장 - 이동
31
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 ]과 같이 캐릭터가 오른쪽으로 빠르게 가속합니다. 이때 최대 속도는 레버를 입력하고
32
게임 매니악스 액션 게임 알고리즘
CHAPTER
2 점프
점프는 액션 게임에서 이동 다음으로 기본적인 액션입니다. 주인공이 사람이나 동물인 횡 스크롤 게임은 거의 대부분 캐릭터를 점프시킬 수 있습니다. 이 점프에도 여러 가지 변형이 있습니다.
2장 - 점프
77
2.1 고정 길이 점프 버튼을 누르면 캐릭터가 점프하는 액션입니다. 게임에 따라서는 레버를 위쪽이나 대각선으로 입력했을 때 점프하는 것도 있습니다. 대부분의 경우 캐릭터는 완만한 포물선을 그리며 점프합 니다. 점프를 사용한 게임에는 점프 중에 버튼을 놓는 시점에 따라 점프의 높이를 조절할 수 있는 것 과 점프의 높이가 고정되어 있는 것이 있습니다. 이 책에서는 전자를 ‘가변 길이 점프’, 후자를 ‘고정 길이 점프’라고 하여 각각 해설합니다. 여기서는 먼저 고정 길이 점프에 대해 설명하겠습니다. 정지 상태에 있는 캐릭터가 점프할 경 우를 생각해봅시다(그림 2-1 ). 버튼을 누르면 캐릭터는 점프하여 수직으로 상승하기 시작합 니다(그림 2-2 ). 그림 2-1 정지 상태의 캐릭터
그림 2-2 점프 시작 점프를 하면 캐릭터가 수직 상승하기 시작한다.
정지 상태의 캐릭터
캐릭터는 상승하다가 중력의 힘으로 인해 점차 상승 속도가 떨어지기 시작합니다(그림 2-3 ). 그리고 언젠가는 상승 속도가 0이 됩니다(그림 2-4 ). 여기가 점프의 정점입니다. 정점에 달한 후에는 상승에서 낙하로 이행합니다(그림 2-5 ). 낙하 중에는 중력으로 인해 점점 속도가 빨라집니다. 그리고 지면에 착지하면 점프는 종료합니다(그림 2-6 ).
78
게임 매니악스 액션 게임 알고리즘
그림 2-3 상승 속도가 느려진다.
그림 2-4 점프의 정점
중력의 힘으로 상승 속도가 점차 느려지기 시작한다.
점프의 정점에서는 상승 속도가 0이 된다.
그림 2-5 낙하
그림 2-6 점프의 종료 중력에 의해서 낙하하다.
지면에 착지하면 점프는 종료한다.
중력에 의해서 낙하 속도가 점차 빨라진다.
다음에는 좌우로 이동하면서 점프하는 경우를 생각해봅시다. 세로 방향의 움직임은 정지하고 있는 캐릭터가 점프했을 때와 같습니다. 여기에 가로 방향의 움직임이 더해지면서 점프의 궤적 은 포물선을 그립니다(그림 2-7 ). 점프를 사용한 게임은 상당히 많습니다. 예를 들어 <동키콩>은 굴러오는 나무 통들을 점프로 피하면서 전진해 나가는 게임입니다. 이 게임의 점프는 고정 길이 점프이기 때문에 중간에 버 튼을 놓는다고 해서 점프 높이가 달라지지는 않습니다. 일단 점프를 시작하면 점프가 종료할 때까지는 조작이 불가능합니다. 고정 길이 점프보다 가변 길이 점프가 플레이어가 자유롭게 점프할 수 있어 쾌적해 보이지만
2장 - 점프
79
반드시 그렇지만은 않습니다. <동키콩>의 경우 처음부터 나무 통을 뛰어넘기에 가장 적합한 높 이로 점프하도록 설정되어 있습니다. 따라서 플레이어는 버튼을 언제 놓을지 고민할 필요 없 이, 점프하는 타이밍만 계산하여 버튼을 누르기만 하면 됩니다. 결과적으로 리듬에 맞춰 버튼 을 누르며 장애물을 뛰어넘는 경쾌한 게임성을 갖추게 됩니다. 그림 2-7 좌우로 이동하면서 점프 가로로 이동하면서 점프하면 궤 적이 포물선을 그린다.
알고리즘 고정 길이 점프를 구현하려면 캐릭터의 점프 상태와 평상시 상태를 구별해야 합니다. 평상시 상태에서 캐릭터는 레버에 의해 좌우로 움직일 수 있고 점프 버튼을 누르면 점프 상태로 돌입 합니다. 점프를 시작할 때 캐릭터가 정지 상태에 있다면 수직 점프가 되며, 좌우로 움직이고 있 다면 포물선을 그리는 점프가 됩니다. 캐릭터가 점프를 시작할 때 위쪽으로의 처음 속도를 부여합니다(그림 2-8 ). 예를 들어 캐릭터 의 속도 VY에 일정한 값 jump_speed를 할당합니다.
VY = jump_speed 점프 중에는 아래로의 가속도를 추가합니다(그림 2-9 ). 예를 들어 1프레임( 1/60초)마다
Y축 속도 VY에 가속도 jump_accel을 추가합니다. VY += jump_accel
80
게임 매니악스 액션 게임 알고리즘
아래로의 가속도가 추가됨에 따라 어느 일정한 시점을 기준으로 캐릭터는 상승에서 낙하로 이 행합니다. 이 이행 순간이 점프의 정점입니다(그림 2-10 ). 정점의 높이는 처음 속도(jump_
speed )와 가속도(jump_accel )에 의해 결정됩니다. 처음 속도가 빠르면 빠를수록 정점은 높 아지며 느리면 느릴수록 낮아집니다. 또한 가속도가 클수록 신속히 떨어지는 점프가 되며, 작 을수록 천천히 움직이는 점프가 됩니다. 예를 들어 처음 속도가 빠르고 가속도가 작으면 완만 하면서 높은 점프가 됩니다. 그림 2-8 처음 속도를 부여한다.
그림 2-9 아래쪽 방향의 가속도를 추가한다. 점프 중에는 속도에 아래쪽 방향의 가속도를 추가한다. VY += jump_accel
점프를 시작하면 위쪽 방향의 처음 속도를 부여한다. VY=jump_speed
속도
VY
가속도
jump_accel
그림 2-10 상승에서부터 낙하로 이행한다. 처음 속도에 가속도를 더해 나아다가, 속도가 0이 된 지점이 점프의 정점이다.
가속도 아래쪽 방향의 가속도가 추가됨에 따라 상승에서 낙하로 이행한다.
캐릭터가 착지하면 점프는 종료합니다. 점프 상태에서 평상시 상태로 되돌아갑니다. 점프 상태 에서는 레버를 좌우로 움직이거나 점프를 하는 등의 행동은 불가능합니다. 평상시 상태로 되돌 아가 다시 좌우로 움직이거나 점프를 할 수 있습니다.
2장 - 점프
81
지면에 착지했는지의 여부를 판정하려면 캐릭터의 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
82
게임 매니악스 액션 게임 알고리즘
CHAPTER
3 장치
액션 게임의 스테이지에는 다양한 장치가 있습니다. 캐릭터는 수많은 장치가 마련된 스테 이지를 대시나 점프를 구사하며 뚫고 지나갑니다. 매력적인 장치는 게임을 재미있게 할 뿐 만 아니라 그 게임만의 개성을 강렬하게 어필합니다.
3장 - 장치 149
3.1 로프 캐릭터가 붙잡고 이동할 수 있는 장치입니다. 로프를 잡고 좌우로 이동하거나 낙하 도중에 로 프를 붙잡아 정지하는 등의 액션이 가능합니다. 로프에는 횡방향과 종방향이 있는데 여기서는 횡방향 로프에 대해 설명하도록 하겠습니다. 종 방향 로프는 횡방향 로프나 사다리(3.2절)를 응용하여 만들 수 있습니다. 캐릭터는 로프를 붙 잡을 수 있고(그림 3-1 ), 로프를 잡고 있을 때는 레버를 좌우로 입력해서 캐릭터를 좌우로 이 동시킬 수 있습니다(그림 3-2 ). 그림 3-1 로프 잡기
그림 3-2 로프를 이용하여 좌우로 이동하기
로프
로프를 잡고 좌우로 이동 할 수 있다.
캐릭터
레버를 아래로 입력하면 캐릭터는 로프를 놓고 낙하합니다(그림 3-3 ). 일단 낙하가 시작되면 레버를 아래로 입력하지 않아도 낙하 상태가 지속됩니다. 낙하 중에 레버를 아래로 입력하지 않은 상태에서 로프가 캐릭터의 바로 근처에 있는 경우에는 다시 로프를 잡을 수 있습니다(그림 3-4 ). 온통 로프로 둘러싸인 스테이지에서는 로프를 잡고 좌우로 이동하거나 로프를 놓고 낙하하며 스테이지를 자유롭게 돌아다닐 수 있습니다. 그림 3-3 로프를 놓고 낙하하기
레버를 아래로 입력 하면 로프를 놓고 낙하한다. 로프를 놓은 후에는 레버를 입력하지 않아도 낙하를 지속한다.
150 게임 매니악스 액션 게임 알고리즘
그림 3-4 낙하 중에 로프 잡기 낙하 중에 레버를 아래로 입력하지 않고, 근처에 로프가 있다면 다시 로프를 잡을 수 있다.
로프를 사용한 게임으로는 <로드런너>가 있습니다. 이 게임의 로프는 횡방향으로 제공됩니다. 로프를 이용해서 좌우로 이동하거나 로프를 붙잡아 낙하를 중지할 수 있습니다. 스테이지에 따 라서는 로프가 마치 미로처럼 펼쳐져 있으며, 상당히 복잡한 로프의 망을 이용하여 금덩어리를 수집하거나 적으로부터 도망치는 등의 액션을 즐길 수 있습니다. <동키콩 주니어>도 로프를 이용하고 있습니다. 종방향 로프가 제공되는 이 게임은 사다리(3.2 절)와 유사한 성질의 장치가 사용됩니다. 여기서 재미있는 것은 로프를 하나만 잡았을 때와 동 시에 좌우 두 개를 잡았을 때 캐릭터가 로프를 오르내리는 속도가 다르다는 점입니다. 하나만 잡았을 때는 캐릭터의 충돌 영역이 작아지는 만큼 적에게 타격을 받기 어려워지나 오르내리는 속도는 느려집니다. 따라서 주변에 적이 없을 때는 두 개를 붙잡아 이동하고, 적이 가까워지면 하나를 놓는 독특한 액션을 구현할 수 있습니다.
알고리즘 로프 구현의 핵심은 캐릭터가 로프를 잡고 있는지 판정하는 처리입니다. 이것은 일종의 충돌 판정 처리입니다. 충돌 판정 처리에 대해서는 2장(점프)에서도 자세하게 설명하고 있으니 참 조하기 바랍니다. 로프를 잡으려면 다음 조건을 만족해야 합니다(그림 3-5 ). ●●
캐릭터와 로프의 X좌표 차이값이 일정 범위에 있다.
●●
캐릭터와 로프의 Y좌표 차이값이 일정 범위에 있다.
●●
레버를 아래로 입력하고 있지 않다.
해당 조건을 모두 만족하면 캐릭터는 로프를 잡게 되어 낙하하지 않습니다. 또한 로프를 잡고 좌우로 이동할 수 있습니다. 조건이 만족되지 않으면 캐릭터는 낙하합니다. 낙하 도중에도 모든 로프에 대하여 이들 조건으 로 판정 처리를 시행하고 로프를 잡게 되면 낙하를 중단합니다.
X좌표나 Y좌표의 차이의 범위는 조금 넓게 잡아두는 것이 좋습니다. 그래야 로프를 잡기 쉬워 집니다. 특히, 낙하하는 캐릭터가 충돌 범위를 지나쳐버리지 않도록 Y좌표의 차이는 캐릭터가
1프레임에 이동하는 거리보다 넓게 잡아두어야 합니다.
3장 - 장치 151
그림 3-5 로프를 잡기 위한 조건 X좌표의 차이값이 일정 범위에 있다. abs(rx - x) < max_x 레버를 아래로 입력하고 있지 않다.
Y좌표의 차이값이 일정 범위에 있다. ry - y >= min_y && ry - y < max_y
로프의 좌표 (rx, ry)
캐릭터의 좌표 (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좌표 차이값의 최대치
152 게임 매니악스 액션 게임 알고리즘
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;
3장 - 장치 153
// X축 방향 속도에 따라 캐릭터를 기울어지도록 표시한다.
Angle = VX/speed*0.1f; return true; }
샘플
<ROPE>는 로프 액션 샘플입니다. 캐릭터가 로프를 잡고 있는 동안에는 좌우 레버로 캐릭터를 이동시킬 수 있습니다. 레버를 아래로 입력하거나 로프의 끝을 넘어가면 캐릭터는 낙하합니다. 낙하 중에 새로운 로프가 있다면 그 로프를 잡습니다. 레버를 아래로 계속 입력하고 있으면 캐릭터는 언제까지나 낙하를 지속합니다. ●
ROPE → p. 520
3.2 사다리 캐릭터가 잡고 이동할 수 있는 장치입니다. 사다리를 잡고 있는 동안에는 자유롭게 위아래로 이동할 수 있습니다. 좌우로 조금씩 이동하거나 사다리 위에 올라서는 것도 가능합니다. 캐릭터는 사다리를 잡을 수 있습니다(그림 3-6 ). 사다리를 잡고 있을 때는 레버를 위아래로 입력하여 캐릭터를 상하로 이동시킬 수 있습니다(그림 3-7 ). 또한 사다리 위에 올라서거나(그림 3-8 ) 사다리를 이용하여 좌우로 이동할 수도 있습니다(그 림 3-9 ). 대부분의 경우 사다리는 상하로 뻗어 있기 때문에 좌우로 이동할 수 있는 폭은 그다 지 넓지 않습니다. 사다리가 서로 인접해 있을 경우 옆 사다리로 갈아탈 수 있는 게임도 있습 니다.
154 게임 매니악스 액션 게임 알고리즘
CHAPTER
4
지형 이용
액션 게임의 스테이지는 일반적으로 산이나 골짜기 같이 기복이 풍부한 지형으로 구성됩니 다. 바위나 얼음 등의 장애물이 배치되어 있기도 합니다. 캐릭터는 위험한 지형이나 장애물 을 회피하기도 하고, 때로는 이들을 역으로 활용하여 적을 공격하는 등 다양한 액션을 선보 입니다.
4장 - 지형 이용 227
4.1 벽이나 천장에 매달리기 캐릭터가 벽이나 천장에 매달리는 액션입니다. 벽에 붙어 상하로 이동하거나 천장에 붙어 좌우 로 이동할 수도 있습니다. 또한 벽에서 점프하여 다른 벽이나 천장에 매달릴 수도 있습니다. 먼저, 캐릭터가 벽에 매달리는 상황을 생각해봅시다. 벽에 매달리려면 벽과 가까워져야 합니 다(그림 4-1 ). 벽 근처에서 벽을 향해 점프하면 매달릴 수 있습니다(그림 4-2 ). 매달린 상태 에서 점프 버튼을 누르면 캐릭터가 점프하면서 벽에서 떨어집니다. 점프를 잘하면 벽에서 더욱 높은 곳에 있는 플랫폼으로 이동할 수도 있습니다(그림 4-3 ). 벽과 벽이 서로 가까이 있을 때 는 더욱 재미있는 움직임이 가능해집니다(그림 4-4 ). 벽에서 벽으로 점프를 반복하여 깊이 파 인 구덩이를 기어오를 수 있습니다. 그림 4-1 캐릭터와 벽
그림 4-2 벽에 매달린다.
벽에 매달린다.
벽 캐릭터
228 게임 매니악스 액션 게임 알고리즘
벽을 향하여 점프한다.
그림 4-3 벽에서 떨어진다.
그림 4-4 구덩이에서 기어오른다.
벽에서 플랫폼으로 날아 이동할 수도 있다.
벽 사이가 가까우면 차례로 날아 이동할 수 있다.
점프하여 벽에서 떨어진다.
다음으로 캐릭터가 천장에 매달리는 상황에 대해 살펴봅니다(그림 4-5 ). 천장을 향하여 점프 하면 천장에 매달릴 수 있습니다. 천장에서 내려올 때는 벽의 경우와 마찬가지로 점프 버튼을 누릅니다(그림 4-6 ). 캐릭터가 뛰어 내리면서 천장에서 떨어져 나옵니다. 그림 4-5 천장에 매달린다.
그림 4-6 천장에서 떨어진다.
천장에 매달린다. 천장을 향하여 점프한다.
뛰어내려 천장에서 떨어진다.
벽이나 천장에 매달릴 수 있는 게임은 보통 주인공이 ‘닌자’인 경우가 많습니다. 벽이나 천장에 매달려 이동한다고 하는 액션 자체가 마치 닌자처럼 보이기 때문입니다. 예를 들어 <닌자 용검 전>이나 <스트라이더 비룡>은 모두 닌자가 주인공인 게임입니다. 벽이나 천장에 매달리거나 그대로 상하좌우로 이동할 수 있고, 다른 벽이나 천장으로 날아 옮겨갈 수도 있습니다.
4장 - 지형 이용 229
닌자가 아닌 다른 캐릭터를 주인공으로 한 게임 <채큰 팝>에서도 천장에 매달릴 수 있습니다. 이 게임에서는 캐릭터가 천장에 거꾸로 매달린 채 좌우로 움직일 수 있고, 천장의 기복을 타고 넘어갈 수도 있습니다. 벽이나 천장에 매달리는 게임을 재미있게 만들려면 스테이지의 구성이 중요합니다. 매달리는 액션을 살리기 위해 붙기 쉬운 벽이나 천장을 준비하거나 날아 옮겨가기 쉽도록 벽이나 천장의 간격 설정을 조절합니다. 이러한 게임 스테이지는 액션 게임 중에서도 특이 기복이 풍부한 지 형이라 할 수 있습니다.
알고리즘 벽이나 천장에 매달리는 액션을 구현하려면 캐릭터가 공중에 있는 상태와 캐릭터가 무엇인가 에 매달려 있는 상태를 구분합니다. 여기서는 Jump라는 플래그를 사용해서 캐릭터가 공중에 있을 때, 다시 말해 점프 또는 낙하하고 있을 때는 true로 설정합니다(그림 4-7 ). 벽이나 천장에 매달려 있거나 플랫폼에 올라서 있을 때는 Jump 플래그를 false로 합니다. 캐 릭터가 벽이나 천장에 매달리는 조건은 다음 2가지입니다(그림 4-8 ). ●●
캐릭터가 천장에서 일정 범위에 있다.
●●
캐릭터의 속도가 위쪽을 향한다.
그림 4-7 캐릭터 상태를 나타내는 플래그
그림 4-8 천장에 매달린다. 이 범위에 캐릭터가 들어오고, 속도가 위쪽을 향하면 천장에 매달렸다고 판정한다. Jump = false
점프를 하면 플래그를 설정한다. Jump = true
캐릭터의 속도
캐릭터의 속도에 관한 조건이 있는 이유는 캐릭터가 천장으로 달려들 때와 천장으로부터 떨어 져 낙하할 때를 구별하여 전자의 경우에만 매달리도록 하기 위해서입니다. 그러려면 캐릭터가 상승 중일 때, 즉 속도가 위쪽을 향하는지의 여부를 조사하면 됩니다.
230 게임 매니악스 액션 게임 알고리즘
마찬가지로 벽과 플랫폼에 대해서도 판정 처리를 시행하여 벽에 매달렸는지 또는 플랫폼에 올 라섰는지의 여부를 조사합니다. 캐릭터의 X축 방향의 속도를 VX, Y축 방향의 속도를 VY라고 한다면 천장과 플랫폼에 관한 조건은 [그림 4-9 ], 벽에 관한 조건은 [그림 4-10 ]처럼 지정됩 니다. 캐릭터가 벽과 천장, 플랫폼에 가까워지는 방향으로 각각 충돌 판정이 있는 것이 핵심입 니다.
Jump 플래그가 false, 다시 말해 무엇인가에 매달려 있는 상태의 캐릭터는 상하 또는 좌우로 이동할 수 있습니다. 캐릭터가 벽에 접촉하고 있으면 벽에 매달려 있는 상태에서 상하로 이동 할 수 있습니다(그림 4-11 ). 천장에 접촉하고 있을 때와 플랫폼에 올라서 있을 때는 좌우로 이동할 수 있습니다(그림 4-12 ). 그림 4-9 천장과 플랫폼의 판정
그림 4-10 벽의 판정 VX < 0이며 이 범위에 캐릭터가 있으면 오른쪽에서부터 벽에 매달렸다고 판정한다.
VY > 0이며 이 범위에 캐릭터가 있으면 플랫폼에 올라섰다고 판정한다.
VY < 0이며 이 범위에 캐릭터가 있으면 천장에 매달렸다고 판정한다.
VX > 0이며 이 범위에 캐릭터가 있으면 왼쪽에서부터 벽에 매달렸다고 판정한다.
그림 4-11 벽에 매달린 채로 이동한다.
Jump == false이자 벽에 접촉하고 있으면, 벽에 매달린 상태로 이동할 수 있다.
그림 4-12 천장에 매달린 채로 이동한다.
Jump == false이자 천장에 접촉하고 있으면, 천장에 매달린 상태로 이동할 수 있다.
4장 - 지형 이용 231
프로그램 [코드 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 bool bool bool
hit_up = false; hit_left = false; hit_right = false; hit_down = false;
// 벽, 천장, 플랫폼에 캐릭터가 접촉했는지의 판정
for (CTaskIter i(Game -> MoverList); i.HasNext(); ) { CMover* mover = (CMover*)i.Next(); if (mover -> Type = = 1) {
232 게임 매니악스 액션 게임 알고리즘
CHAPTER
5
특수 행동
액션 게임의 캐릭터는 뛰거나 점프만 하는 것이 아닙니다. 기구에 올라서거나 장치에 걸려 드는 등 다양한 특수 행동을 행합니다. 웅크리거나 구르기도 하고 혹은 거대화하는 등 캐릭 터 자신의 모습을 변화시키는 액션도 있습니다.
5장 - 특수 행동 313
5.1 스케이트보드 타기 캐릭터가 스케이트보드를 타고 이동하는 액션입니다. 스케이트보드에 타면 평소 걸을 때보다 더 빠른 속도로 이동할 수 있습니다. 스케이트보드는 [그림 5-1 ]과 같이 올라서는 이동수단입니다. 타는 방법은 게임에 따라 다른 데, 예를 들어 스케이트보드에 접촉하여 버튼을 누를 경우 올라탈 수 있습니다(그림 5-2 ). 그림 5-1 스케이트보드
그림 5-2 스케이트보드에 올라탄다. 캐릭터가 스케이트 보드에 접촉하고 있다.
버튼을 누른다.
캐릭터
스케이트보드
스케이트보드에 타고 있을 때 레버를 조작하면 입력한 방향으로 스케이트보드가 이동합니다 (그림 5-3 ). 버튼을 누르면 스케이트보드에서 내려옵니다. 그림 5-3 스케이트보드로 이동한다.
걸어갈 때보다 빠른 속도로 이동할 수 있다.
스케이트보드를 이용한 게임 중 하나로 <메트로 크로스>가 있습니다. 이 게임에서도 스케이트 보드에 타면 평소 뛰어가는 것보다 빠른 속도로 이동할 수 있습니다. 또한 평범하게 뛰고 있을
314 게임 매니악스 액션 게임 알고리즘
때는 속도가 느려지는 타입의 플랫폼 위를 통과할 때도 스케이트보드에 타고 있으면 속도가 느 려지지 않습니다. 다만, 스케이트보드에 타고 있는 동안에는 점프를 할 수 없기 때문에 레버 조 작만으로 장애물을 피해야 합니다. 게임 <원더보이>에도 스케이트보드가 등장합니다. 이 게임에서는 스케이트보드에 타고 있어도 점프할 수 있습니다. 또한 적에 접촉했을 때는 스케이트보드에서 내려오게 되지만 그 이상의 페널티는 없습니다.
알고리즘 스케이트보드를 구현하려면 캐릭터가 스케이트보드에 타고 있는 상태와 타고 있지 않은 상태 를 구별합니다. 이를 위해서는 스케이트보드의 형상에 맞춘 충돌 판정 처리를 준비하여 캐릭터 와의 사이에서 충돌 판정을 시행합니다(그림 5-4 ). 캐릭터와 스케이트보드가 서로 접촉하고 있을 때 버튼을 누르면 스케이트보드에 타고 있는 상 태로 이행합니다. 스케이트보드에 타고 있는 상태에서 버튼을 누르면 이번에는 다시 타고 있지 않은 상태로 되돌아갑니다. 그리고 스케이트보드에 타고 있을 때는 이동의 속도가 빨라집니다. 점프나 급격한 방향 전환을 하지 못하도록 하면 더욱 재미있을 것입니다. 그림 5-4 스케이트보드의 충돌 판정 이 영역에 캐릭터가 오면 접촉하고 있는 것으로 판정
프로그램 [코드 5-1 ]은 스케이트보드 프로그램입니다. 여기에 처리 내용을 조금 추가하면 스케이트보 드를 타고 있을 때는 점프를 불가능하게 하거나 속도가 느려지지 않도록 하는 등의 규칙을 구 현할 수도 있습니다.
5장 - 특수 행동 315
코드 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 (
316 게임 매니악스 액션 게임 알고리즘
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
5장 - 특수 행동 317
5.2 자동차 움직이고 있는 자동차의 지붕 위로 뛰어오르는 액션입니다. 캐릭터가 제대로 뛰어오르면 자동 차에 탄 상태로 이동할 수 있습니다. 자동차는 [그림 5-5 ]와 같이 지면을 달립니다. 자동차에 올라서려면 자동차 근처에서 캐릭터 를 점프시킵니다(그림 5-6 ). 그림 5-5 자동차
그림 5-6 자동차에 타려면 점프한다. 점프한다.
캐릭터
자동차
자동차 지붕에 제대로 착지하면 자동차에 탈 수 있습니다(그림 5-7 ). 캐릭터가 올라서도 자동 차는 이전과 같은 속도로 계속 달립니다. 올라선 상태의 캐릭터 역시 자동차에 실려 같은 속도 로 전진하며 운반됩니다(그림 5-8 ). 그림 5-7 자동차 위로 뛰어오른다.
그림 5-8 자동차와 함께 전진한다.
자동차 위로 뛰어오른다.
자동차에 실려 같은 속도로 전진한다.
자동차는 이전과 같은 속도로 계속해서 달린다.
318 게임 매니악스 액션 게임 알고리즘
CHAPTER
6 무기
액션 게임에서 적을 공격하는 방법이 펀치나 킥만 존재하는 것은 아닙니다. 게임에 따라서 는 다양한 무기를 사용하여 공격할 수 있습니다. 검이나 채찍 등의 무기를 이용한 근접 공 격이 있는가 하면, 수류탄이나 기관총 등을 이용하는 원격 공격도 있습니다. 그 밖에도 유 도 미사일이나 부메랑과 같이 특수한 움직임을 보여주는 무기도 있습니다.
6장 - 무기 353
6.1 검 검을 휘둘러서 적을 베는 공격입니다. 검의 길이는 게임에 따라 다르지만 캐릭터와 비교적 가 까운 곳에 있는 적을 공격한다는 점에서는 유사합니다. 버튼을 누르면 검을 휘두를 수 있습니다(그림 6-1 ). 검을 휘두를 때 적을 제대로 맞춘다면 데 미지를 줄 수 있습니다(그림 6-2 ). 검을 휘두르는 모습을 표현하는 방법은 게임에 따라 다릅니다. 심플하게 검을 앞으로 내밀기만 하는 게임이 있는가 하면 검의 이미지를 회전시키거나 애니메이션으로 표시하는 등의 처리를 통해 검을 휘두르는 분위기를 표현하는 게임도 있습니다. 검을 사용한 게임에는 <드루아가의 탑>이 있습니다. 이 게임에서는 버튼을 계속 누르고 있으면 캐릭터가 전방을 향해 검을 내밉니다. 검이 나와 있는 동안에 적을 푹 찌르듯 캐릭터를 이동시 키면 적에게 데미지를 입힐 수 있습니다. <원평토마전>에서도 검을 사용하고 있습니다. 이 게임은 다양한 모드로 제공되는데, 캐릭터를 크게 표시하는 모드에서는 검의 이미지를 회전 표시하여 검을 휘두르는 모습을 표현합니다. 레 버와의 조합에 따라 위쪽 베기나 아래쪽 베기 등 여러 가지 방법으로 공격할 수 있습니다. <골든 액스>에서도 검이나 도끼를 휘두를 수 있습니다. 서로 모양은 다르지만 사용법은 검이나 도끼 모두 동일합니다. 이 게임에서는 검을 휘두르는 모습을 애니메이션으로 표현하고 있습니 다. 점프 공격, 하이점프 공격, 배후 공격 등 공격의 변형variation이 많아 서로 다른 검의 사용법 을 즐길 수 있습니다. <라스탄 사가>도 검을 이용한 게임입니다. 기본 무기는 검이지만 아이템을 주우면 도끼 등도 사용할 수 있습니다. 단순히 베는 행동 이외에도 레버의 조합에 따라 위에서 찍어내릴 수도 있 고 아래쪽에서 찌를 수도 있습니다.
354 게임 매니악스 액션 게임 알고리즘
그림 6-1 검을 휘두른다.
그림 6-2 적을 벤다.
버튼을 누른다.
검을 휘두른다.
적을 벤다.
알고리즘 검을 구현할 때의 핵심은 검을 휘두르는 모습을 어떻게 표현하는가에 있습니다. 예를 들어 검 의 이미지를 회전 표시하면 비교적 간단하게 분위기를 연출할 수 있습니다. 이미지를 표시하는 위치를 조절하여 캐릭터가 검을 손에 쥐고 있는 분위기를 만들면 좋겠습니다. 또 하나의 핵심은 적을 벨 때의 처리입니다. 검과 적의 충돌 판정을 시행하고, 검이 적에 접촉 하면 적에게 데미지를 부여합니다. 충돌 판정은 검의 움직임 처리에서 시행하는 방법과 적의 이동 처리에서 시행하는 방법이 있으며 어느 쪽을 사용해도 무방합니다. 그림 6-3 검의 처리 검을 휘두르기 시작했을 때부터의 경과 시간에 따라 위치나 각도를 변화시킨다. 검에 닿으면 데미지를 받는다.
6장 - 무기 355
프로그램 [코드 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(); // 무기와 충돌 판정
356 게임 매니악스 액션 게임 알고리즘
// 무기와 접촉하면 속도를 설정하고, 당한 상태로 이행한다.
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; }
6장 - 무기 357
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;
358 게임 매니악스 액션 게임 알고리즘
CHAPTER
7
아이템
액션 게임에는 다양한 아이템이 등장합니다. 그 중에는 주웠을 때 오히려 데미지를 입는 아 이템도 있지만 대부분의 아이템은 어떤 식으로든 메리트를 제공합니다. 득점으로 연결되는 아이템이 대부분이며 무적 상태가 되는 아이템이나 주워 던질 수 있는 아이템 등도 있습니 다. 또한 아이템의 등장 방법에도 몇 가지 패턴이 있습니다.
7장 - 아이템 419
7.1 무적 아이템 해당 아이템을 주운 캐릭터는 주기적으로 무적 상태를 유지합니다. 무적 상태인 동안에는 적을 몸으로 직접 공격하여 데미지를 입힐 수 있습니다. 아이템은 캐릭터가 접촉하면 주울 수 있습니다(그림 7-1 ). 아이템을 주운 캐릭터는 일정 시간 무적 상태를 유지합니다(그림 7-2 ). 여기서는 캐릭터를 거대화하여 무적 상태를 표현했습니 다. 무적 상태에서는 적에게 접촉해도 데미지를 입지 않습니다. 반대로 캐릭터에게 접촉한 적 에게는 데미지를 입힐 수 있습니다. 무적 아이템을 사용한 게임에는 <팩맨>이 있습니다. 이 게임에서는 특정 아이템을 먹은 캐릭터 가 일정 시간 무적 상태를 유지합니다. 무적 상태에서는 적에게 몸으로 부딪혀 적을 먹어치울 수 있습니다. <채큰 팝>에도 무적 아이템이 있습니다. 이 게임에서는 적을 폭탄으로 쓰러뜨리게 되는데 적을 퇴치했을 때 무적 아이템이 나오는 경우가 있습니다. 이것을 주우면 일정 시간 캐릭터는 무적 상태가 되어 몸으로 적을 쓰러뜨릴 수 있습니다. 그림 7-1 아이템을 줍는다.
그림 7-2 무적 상태 일정 시간 거대화해진다. 접촉한 적은 데미지를 입는다.
아이템을 줍는다.
적과 접촉해도 데미지를 입지 않는다.
알고리즘 아이템을 얻어 무적이 되는 액션을 구현하려면 캐릭터의 상태를 관리해야 합니다(그림 7-3 ).
420 게임 매니악스 액션 게임 알고리즘
평소 상태의 캐릭터가 아이템을 획득하면 무적 상태로 이행합니다. 무적 상태에서 일정 시간이 경과하면 평소 상태로 되돌아갑니다. 그림 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 함수
7장 - 아이템 421
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;
422 게임 매니악스 액션 게임 알고리즘
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
7장 - 아이템 423
7.2 주워 던지는 아이템 주운 아이템을 던지는 액션입니다. 던진 아이템을 적에게 맞추면 데미지를 입힐 수 있습니다. 여기서는 폭탄 아이템을 생각해봅시다(그림 7-4 ). 아이템에 접촉하면 캐릭터가 아이템을 줍 습니다(그림 7-5 ). 캐릭터는 아이템을 든 채로 자유롭게 이동할 수 있습니다. 버튼을 누르면 손에 들고 있는 아이템을 던집니다(그림 7-6 ). 폭탄의 경우 던지면 포물선을 그리며 날아가고 땅에 닿으면 폭발합니다(그림 7-7 ). 폭발에 적을 끌어들이면 데미지를 입힐 수 있습니다. 그림 7-4 아이템
그림 7-5 아이템을 줍는다.
캐릭터
접촉해서 아이템을 줍는다.
아이템을 든 채로 자유롭게 움직일 수 있다.
아이템
그림 7-6 아이템을 던진다. 버튼을 누른다.
그림 7-7 아이템으로 적을 공격한다.
아이템을 던진다.
폭발에 접촉한 적은 데미지를 입는다.
착지 지점에서 폭발한다.
아이템을 주워 던지는 액션을 이용한 게임에는 <부타상>이 있습니다. 이 게임에서는 폭탄을 적
424 게임 매니악스 액션 게임 알고리즘
CHAPTER
8 미션
이 책에서는 지금까지 액션 게임에서 이용할 수 있는 수많은 요소들에 대해 소개했습니다. 이들 요소들을 액션 게임 제작에 활용할 수는 있지만 실제로 게임을 만들 때에는 게임의 핵 이 되는 것이 필요합니다. 그것은 미션, 다시 말해 게임의 목적입니다. 8장에서는 적을 쓰 러뜨리거나 아이템을 습득하는 등 플레이어에게 주어지는 미션의 다양한 패턴에 대해 소개 합니다,
8장 - 미션 443
8.1 모든 적 쓰러뜨리기 스테이지에 있는 모든 적을 쓰러뜨리는 미션입니다. 스테이지에는 수많은 적이 있습니다(그림
8-1 ). 캐릭터를 움직이거나 무기를 사용해서 모든 적을 쓰러뜨리면 스테이지를 완료합니다 (그림 8-2 ). 게임에 따라서는 조무래기 적을 먼저 전멸시킨 다음에 스테이지 가장 마지막에 등장하는 보스 를 쓰러뜨리면 완료하는 패턴도 있습니다. 한편으로는 조무래기 적이 쓰러졌는지 여부와 상관 없이 최종 보스만 쓰러뜨리면 완료하는 경우도 있습니다. 모든 적을 쓰러뜨리는 미션을 사용한 게임으로는 <헤이안쿄 에일리언>이 있습니다. 이 게임에 서는 스테이지에 있는 몇몇 적을 모두 땅에 묻어 퇴치하면 스테이지를 완료합니다. <골든 액스> 역시 모든 적을 쓰러뜨리는 미션의 일종이 적용됩니다. 횡 스크롤 액션 게임인 <골든 액스>를 플레이하다 보면 가끔 스크롤이 멈출 때가 있습니다. 이때 화면 내에 보이는 적 을 전멸시키면 스크롤이 다시 움직이면서 다음 스테이지로 나아갈 수 있습니다.
알고리즘 모든 적을 쓰러뜨리는 미션을 구현하려면 스테이지 내에 있는 적의 수를 카운트합니다. 적을 쓰러뜨릴 때마다 적의 수를 줄여 나가다가 카운트가 0이 되면 스테이지를 완료한 것으로 처리 합니다. 그림 8-1 스테이지 내에 배치된 적
그림 8-2 적을 모두 쓰러뜨리면 스테이지 완료 적을 전원 쓰러뜨리면 스테이지 완료
적
캐릭터
444 게임 매니악스 액션 게임 알고리즘
8.2 모든 아이템 획득하기 스테이지 내에 있는 아이템을 모두 획득하는 미션입니다. 스테이지 내에는 수많은 아이템이 배 치되어 있습니다(그림 8-3 ). 캐릭터를 이동시켜 아이템을 모두 주우면 스테이지를 완료합니 다(그림 8-4 ). 게임에 따라서는 모든 아이템을 주운 뒤에 특정한 장소에 골goal이 출현하는 경우도 있습니다. 또한 상당수의 게임에서는 점프나 각종 장치를 이용하지 않으면 획득할 수 없는 장소에 아이템 이 마련되어 있거나 아이템 획득을 적이 방해하는 등 손쉽게 아이템을 획득할 수 없도록 만들 어져 있습니다. 그림 8-3 스테이지 내에 배치된 아이템
그림 8-4 아이템을 모두 주우면 스테이지 완료 아이템을 모두 주우면 스테이지 완료
아이템
모든 아이템을 획득하는 미션을 사용한 게임은 다수 존재합니다. 예를 들어 <마피>에서는 집 안에 놓여진 물품을 모두 회수하면 스테이지를 완료합니다. 쫓아오는 적은 트램펄린(3.3절)이 나 문 날리기(3.6절)를 이용해서 피합니다. 또한 물품을 획득하는 순서를 고민하여 같은 물품 의 페어를 계속해서 회수하면 높은 점수를 얻을 수 있습니다. <랠리 X>에서는 스크롤하는 스테이지에 배치된 국기를 회수합니다. 추격해오는 적은 폭연 (6.6절)을 사용하여 이동하지 못하게 합니다. <팩맨>은 아이템을 회수하는 대표적 게임입니다. 스테이지 내에 배치된 수많은 점dot들을 모두 먹으면 완료합니다. 점은 스테이지 내 곳곳에 배치되어 있기 때문에 뒤에서 설명할 페인트 칠 하기(8.4절) 미션의 한 종류로 간주할 수 있습니다. 추격해오는 적은 무적 상태가 되는 아이템 (7.1절) 액션을 이용하여 쓰러뜨립니다. <팩맨>과 같이 화면상의 점을 모두 지우는 게임 형식
8장 - 미션 445
을 ‘도트 이터dot eater’라 도 합니다. <로드런너> 역시 스테이지 내의 아이템을 회수하는 형식의 게임입니다. 이 게임에서는 자동 구 덩이(4.5절)를 사용하여 적을 그 자리에 묶어두거나 적을 땅에 파묻어 쓰러뜨린 뒤 금괴를 회 수합니다. 스테이지에 따라서는 구덩이를 잘 파서 깊은 곳에 있는 금괴를 회수하거나 로프(3.1 절)나 사다리(3.2절)를 이용하여 적으로부터 교묘하게 멀어져야 합니다. 아이템 회수 게임 중 에서도 특히 퍼즐 요소가 강한 게임입니다. <레킹크루>는 스테이지에 있는 모든 벽을 무너뜨리는 것이 목적이지만 내용적 측면에서는 아 이템을 회수하는 것과 유사합니다. 단단한 벽을 무너뜨리려면 수차례에 걸쳐 타격을 줘야 합니 다. 또한 추격해오는 적에게 잡히지 않도록 적의 빈틈을 노려 벽을 쳐야 합니다. <신입사원 토오루군>에도 아이템을 회수하는 스테이지가 있습니다. 스테이지 내에 있는 하트 를 회수하는 것인데 그러려면 의자에 앉아 있는 다른 사원을 공격해서 의자로부터 밀어내야 합 니다. 상대방의 빈틈을 파고들어 사원을 공격하는 움직임은 <레킹크루>와 유사합니다.
알고리즘 모든 아이템을 획득하는 미션을 구현하려면 스테이지 내에 있는 아이템의 개수를 카운트합니 다. 아이템을 획득할 때마다 카운트를 줄여 나가다가 카운트가 0이 되면 스테이지를 완료합니 다. 카운트가 0이 된 시점에 출구를 출현시키고 캐릭터가 출구에 들어가면 스테이지를 완료하 는 게임도 있습니다.
8.3 아군 돕기 스테이지 내에 있는 아군을 전원 구해내는 미션입니다. 스테이지 내에는 수많은 아군이 배치되 어 있습니다(그림 8-5 ). 캐릭터를 이동시켜 아군에게 접촉시키면(그림 8-6 ), 아군이 캐릭터 를 따라옵니다(그림 8-7 ). 아군을 데리고 골에 들어가면 아군을 구출할 수 있습니다(그림 8-8 ). 아군을 전원 구출하면 해당 스테이지를 완료합니다. 게임에 따라서는 아군에 접촉한 지점에서 이미 구출한 것으로 간 주하는 경우도 있습니다.
446 게임 매니악스 액션 게임 알고리즘
그림 8-5 스테이지 내에 배치된 아군
그림 8-6 아군에 접촉한다.
접촉해서 아군을 돕는다.
아군
그림 8-7 아군이 캐릭터를 따라온다.
그림 8-8 아군을 구출한다. 아군을 전원 구해내면 스테이지 완료
구출된 아군이 따라온다.
아군을 구출하는 미션을 사용한 게임에는 <플리키>가 있습니다. 이 게임에서는 한 번에 많은 아군 캐릭터를 구출할 경우 고득점을 받을 수 있습니다. 캐릭터를 뒤따라오는 수많은 아군은 아름다운 궤적을 그려냅니다. 단, 캐릭터가 이끌고 가는 아군이 적과 부딪히게 되면 캐릭터로 부터 멀어져 버립니다. 아군의 행렬이 길어질수록 적과 접촉하기 쉬워지는 만큼, 어떻게 하면 적을 잘 피하면서도 행렬을 길게 만들 수 있을지 고민하면서 플레이하는 것이 이 게임의 재미 요소입니다.
알고리즘 아군을 구해내는 미션을 구현하려면 스테이지 내에 있는 아군의 수를 카운트해두었다가 아군 을 구출할 때마다 카운트를 줄여 나갑니다. 카운트가 0이 되면 스테이지 완료입니다.
8장 - 미션 447
또 하나의 핵심은 아군이 캐릭터를 뒤따라오도록 만드는 처리입니다. 이것을 구현하려면 캐릭 터가 통과한 좌표를 기록해두고 같은 좌표를 아군이 조금 늦게 찾아오도록 합니다. 캐릭터의 움직임에 가속도를 이용하면 아군의 궤적이 완만한 곡선을 그리므로 보기에도 재미있습니다.
8.4 페인트 칠하기 스테이지를 빈틈없이 모두 칠하는 미션입니다. 캐릭터가 통과하면 스테이지 내의 블록이나 플 랫폼 등이 모두 칠해집니다(그림 8-9 ). 모든 블록이나 바닥을 통과하여 스테이지 전체를 칠하 면 완료입니다(그림 8-10 ). 이 미션은 <팩맨>에서 이용하는 ‘도트 이터’ 형식으로 볼 수도 있 습니다. 그림 8-9 스테이지 전체를 칠한다.
그림 8-10 모두 칠하면 스테이지 완료
캐릭터가 통과한 블록은 색이 변한다.
모든 블록을 통과하면 스테이지 완료
페인트를 사용한 게임에는 <시티 커넥션>이 있습니다. 이 게임에서는 자동차를 조작하여 점프 를 구사하면서 높낮이가 서로 다른 스테이지의 플랫폼을 칠해 나갑니다. 모든 플랫폼을 칠하면 완료입니다. 경찰차가 추격해오거나 진로를 방해하는 고양이가 나오기 때문에 이들을 잘 피해 가면서 페인트를 칠해야 합니다. <큐버트> 역시 페인트를 사용한 게임입니다. 캐릭터는 입체감 있는 스테이지의 지형 사이를 뛰 어다니며 이동합니다. 플랫폼 바닥을 통과할 때마다 색을 칠할 수 있고 모든 바닥을 칠하면 스 테이지 완료입니다.
448 게임 매니악스 액션 게임 알고리즘
CHAPTER
9 공격
적이 등장하는 대부분의 액션 게임에는 적을 공격할 수 있는 수단이 마련되어 있습니다. 치 거나 차는 등의 직접적인 공격법은 물론 스테이지 내의 다양한 물건을 사용해 공격하는 간 접적인 방법도 있습니다. 9장에서는 지금까지 기술하지 못했던 ‘공격’과 관련한 여러 항목 에 대해 설명합니다.
9장 - 공격 455
9.1 몸으로 부딪히는 공격 캐릭터가 적에게 직접 몸으로을 부딪히는 심플한 공격입니다. 다만, 단순히 몸을 부딪히는 것 만으로 적이 반드시 쓰러지도록 구성하면 캐릭터는 무적 상태가 되어버립니다. 이를 방지하기 위해, 예를 들면 점프하는 경우에 한해 몸으로 부딪히는 공격을 할 수 있다는 등의 조건을 걸어 두는 게임도 있습니다. 몸으로을 부딪히는 공격을 시행할 때는 캐릭터를 적에게 접근시킵니다(그림 9-1 ). 그러면 캐 릭터와 접촉한 적은 튕겨 날아갑니다(그림 9-2 ). 그림 9-1 적에게 접근한다. 캐릭터가 적을 향해 접근한다.
그림 9-2 적을 튕겨 날린다.
튕겨 날아간다. 적에게 몸으로 부딪힌다.
몸으로 부딪히는 공격 방법을 이용한 게임에는 <닌자군>이 있습니다. 이 게임에서는 점프를 하 거나 뛰어내릴 때 적과 접촉하게 되면 몸으로 부딪히는 공격을 통해 적을 기절시킬 수 있습니
456 게임 매니악스 액션 게임 알고리즘
다. 한편, 점프 또는 뛰어내리는 중이 아닐 경우 적과 접촉을 하게 되면 오히려 캐릭터 자신이 기절하게 됩니다. <팩맨>에서의 무적 상태 역시 몸으로 부딪히는 공격의 한 종류입니다. 아이템을 주워 무적 상 태가 되었을 때는 적에게 몸을 부딪혀 먹어버릴 수 있습니다.
알고리즘 몸으로 부딪히는 공격을 구현하려면 캐릭터가 적에게 몸을 부딪혔는지의 여부를 판단합니다 (그림 9-3 ). 이는 캐릭터와 적의 충돌을 판정한다는 뜻입니다. 캐릭터가 적과 접촉하면 적은 쓰러집니다. 그림 9-3 몸으로 부딪히는 공격의 판정 해당 범위에 캐릭터가 있으면, 몸이 부딪힌 것으로 판정한다.
프로그램 [코드 9-1 ]은 몸으로 부딪히는 공격 프로그램입니다. 캐릭터가 적과 접촉했을 때의 판정 처리 에 조건을 추가하면 점프하거나 낙하하는 도중에만 해당 공격을 가능하게 하는 등의 규칙을 만 들 수도 있습니다. 코드 9-1 몸으로을 부딪히는 공격(CAttackEnemy 클래스, CBodyAttackMan 클래스) // 적을 공격했을 때 호출하는 Attack 함수 // 적이 평상시 상태일 때 이 함수를 호출하면 // 적은 당하는 상태가 된다.
void CAttackEnemy::Attack() {
9장 - 공격 457
// 적이 튕겨 날아갈 때의 속도
float vx = 0.4f; float vy = -0.5f; // 적이 평상시 상태라면 // 공중으로 튕겨 날아가 당하는 상태가 된다. // State는 적의 상태를 나타낸다.
if (State = = 0) { VX = vx; VY = vy; State = 1; } } // 적의 움직임을 처리하는 Move 함수
bool CAttackEnemy::Move(const CInputState* is) { // 공중에 있을 때의 가속도
float accel = 0.02f; // 당했을 때의 회전 속도
float vangle = 0.05f; // 상태에 따라 분기한다.
switch (State) { // 평상시 상태
case 0: // X좌표의 갱신
X + = VX; // 화면의 왼쪽 경계에서 벗어나면 위치를 초기화하여 재출현시킨다.
if (X<-1) Init(); break; // 공격 당한 상태
case 1: // X좌표의 갱신
X + = VX; // Y축 방향의 속도를 갱신한다.
VY + = accel;
458 게임 매니악스 액션 게임 알고리즘
// Y좌표의 갱신 Y + = VY; // 당하고 있는 모습을 나타내기 위해 이미지를 회전시킨다.
Angle + = vangle; // 화면의 오른쪽 경계에서 벗어나면 위치를 초기화하여 재출현시킨다.
if (X>MAX_X) Init(); break; }
return true; } // 캐릭터의 움직임을 처리하는 Move 함수
bool CBodyAttackMan::Move(const CInputState* is) { // 이동 속도
float speed = 0.2f; // 적과의 충돌 판정을 위한 정수 // X좌표 차이의 최대치
float max_dist = 0.6f; // 레버의 입력에 따라 좌우로 이동한다.
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; // 적과의 충돌 판정 // 적과 접촉하면 적에게 데미지를 입힌다.
for (CTaskIter i(Game -> MoverList); i.HasNext(); ) { CMover* mover = (CMover*)i.Next(); if ( mover -> Type = = 1 && abs(X -mover -> X)<max_dist ) {
CAttackEnemy* enemy = (CAttackEnemy*)mover; enemy -> Attack(); }
9장 - 공격 459
} // X축 방향의 속도에 따라 캐릭터를 기울어지도록 표시한다.
Angle = VX/speed*0.1f; return true; }
샘플
<BODY ATTACK>은 몸으로 부딪히는 공격의 샘플입니다. 레버를 이용하여 캐릭터를 좌우로 이동시킬 수 있습니다. 적과 접촉하면 상대는 회전하면서 날아갑니다. ●
BODY ATTACK → p. 526
9.2 점프 공격 점프 중 공격하는 액션입니다. 대부분의 게임에서는 점프를 할 때 지상에 있을 때와는 다른 공 격을 할 수 있습니다. 점프 공격을 구현하려면 우선 점프부터 해야 합니다(그림 9-4 ). 여기서는 버튼 0을 누르면 점 프를 하도록 했습니다. 그림 9-4 점프를 한다. 점프한다. 버튼을 누른다.
캐릭터
460 게임 매니악스 액션 게임 알고리즘
CHAPTER
9 부록
Appendix A. 데모 프로그램 일람 Appendix B. 인용 게임 일람
부록 A - 데모 프로그램 일람
517
Appendix
A
데모 프로그램 일람
1장 이동 LEVER DASH p.32
BUTTON DASH p.37
레버 대시 → : 이동
버튼 대시 → : 이동 Z : 가속
DOUBLE LEVER DASH p.40 레버 2단 대시
RAPID BUTTON DASH p.43
→ : 이동 →→ : 가속
연타 대시 Z : 이동 Z연타 : 가속
SPEED UP ITEM p.46
SLIP ON ICE p.51
속도 향상 아이템 → : 이동
얼음에서 미끄러지기 ← → : 이동
SWIMMING p.55
LINE MOVE p.58
헤엄치기 ← → : 이동 Z : 부상
518 게임 매니악스 액션 게임 알고리즘
라인 이동 ← →↑↓ : 이동
SCREEN EDGE WARP p.62
DECREASING LIFE p.65
화면 끝 워프 ← →↑↓ : 이동
이동하면 생명이 줄어 든다. ← →↑↓ : 이동
REVERSED DIRECTION p.69
LOOP p.75
FIXED JUMP p.84
VARIABLE JUMP p.91
레버 입력과 반대 방향으로 움직이기 ← →↑↓ : 이동
루프 → : 이동
2장 점프 고정 길이 점프 ← → : 이동 Z : 점프
DOUBLE JUMP p.97 2단 점프 ← → : 이동
Z : 점프
가변 길이 점프 ← → : 이동 Z : 점프
TRIANGLE JUMP p.103 삼각 점프 ← → : 이동 Z : 점프
부록 A - 데모 프로그램 일람
519
Appendix
B
인용 게임 일람
본문에서 인용한 게임의 목록입니다. PC나 가정용 게임기에 이식된 작품도 많기 때문에 관심 이 가는 게임이 있다면 실제로 한 번씩 플레이해볼 것을 추천합니다. 단, 일부 게임의 경우 속 편이 출시되었거나 이식할 때 게임명이 바뀐 경우가 있으니 정확한 정보는 제작사의 웹사이트 에서 확인하기 바랍니다.
※범례
●●게임명 ●●
제작사 : 발매 연도 : 플랫폼 AC (아케이드), DC (드림캐스트), DS (닌텐도 DS ), FC (패밀리 컴퓨터) GBA (게임보이 어드밴스드), GC (게임큐브), GW (게임워치) MD (메가 드라이브), NG (네오지오), PC (윈도우즈 PC ) PS (플레이스테이션), PS2 (플레이스테이션2 ), PS3 (플레이스테이션3 ) PSP (플레이스테이션 포터블), SFC (슈퍼 패미컴), SS (세가 새턴)
WII (Wii ), XB (Xbox, XB360 ), Xbox360 ●● 본문에서 다룬 주요 특징 ●●
첨언
●●10야드 파이트 아이렘 : 1983 : AC ●● 레버 반복 입력 공격 ●●
미국식 풋볼을 소재로 한 게임입니다. [로드런너] 등으로 유명한 미국 브로드밴드사의 작품 을 아이렘이 아케이드 게임화했습니다. 적을 피하거나 따라붙는 적을 레버 반복 입력으로 뿌리치면서 적의 진지에 쳐들어갑니다.
528 게임 매니악스 액션 게임 알고리즘
●●Pong ●● ●●
아타리 : 1972 : AC 물건 쳐내기
탁구를 소재로 한 게임으로 사상 최초의 비디오 게임으로 알려져 있습니다. 라켓을 위아래 로 조작하여 사선으로 날아오는 공을 되받아치는데 공을 놓치면 지게 됩니다. 단순한 게임 이지만 라켓에 공이 맞는 위치에 따라 공의 각도나 속도가 크게 달라진다는 점이 이 게임의 재미 요소입니다.
●●Warp & Warp ●● ●●
남코 : 1981 : AC, FC 시한폭탄
주인공을 조작하여 쫓아오는 적을 무찌르는 게임입니다. 모든 적을 무찌르면 스테이지 완 료입니다. 스테이지는 빈 공간 또는 미로로 구성되는데, 전자에서는 총을 사용하고 후자에 서는 폭탄을 사용하여 적을 무찌릅니다. 폭탄은 시한폭탄으로 폭발하면 사방에 폭풍이 퍼 져 나갑니다. 이 폭탄의 움직임은 [봄버맨]과 같지만 [Warp & Warp ]가 선행 작품입니다. 슈팅 게임과 액션 게임이 믹스된 듯한 독특한 작품이라고 할 수 있습니다.
●●건틀렛 ●● ●●
아타리 : 1985 : AC, MD 복수 캐릭터의 조작
최대 4명까지 동시에 플레이할 수 있는 게임입니다. 판타지 세계를 모티브로 하고 있으며 워리어·발키리·엘프 등의 캐릭터가 등장합니다. 차례로 생성되는 방대한 수의 몬스터를 여러 명의 플레이어가 협력하여 무찔러 나가면서 출구로 향하게 됩니다.
●●게게게의 키타로 요괴대마경 ●● ●●
반다이 : 1986 : FC 원격 조종 무기
미즈키 시게루Mizuki Shigeru의 만화 [게게게의 키타로]를 소재로 한 게임입니다. 원작에 등장 하는 머리카락 바늘, 손가락 총, 원격 조종 나막신 등의 무기를 사용할 수 있는 것이 매력입 니다. 또한 ‘요계마경’이나 ‘요기마경’ 등 여러 종류의 스테이지로 구성되며 스테이지마다 완 료 조건이 다르다는 점도 플레이를 즐길 수 있는 요소입니다.
부록 B - 인용 게임 일람
529
마치며
이 책은 ‘액션 게임을 좋아하는 사람이라면 한 번쯤은 스스로 액션 게임을 만들어보자고 생각 한 적이 있을 것이다!’라는 생각을 기초로, 일반적인 게임 프로그래밍 입문서와는 다르게 진행 했습니다. 이 책을 통해 액션 게임에 대해 한 번 더 생각해 보거나, 더 즐겁게 즐기게 되거나, 열정적으로 이야기하거나, 프로그램을 작성하는 등 액션 게임을 더욱 좋아하게 되었다면 그것 으로 만족합니다. 마지막으로 [게임 매니악스] 시리즈 도서를 소개하고자 합니다. [게임 매니악스] 시리즈는 다 음의 3권과 이 책까지 총 4권으로 이루어져 있습니다. 함께 읽으면 게임 프로그래밍의 세계를 더 깊이 즐길 수 있을 것입니다.
●●『게임 매니악스 퍼즐 게임 알고리즘』
퍼즐 게임을 구성 요소별로 다루는 퍼즐 게임 알고리즘 해설서입니다. 물체를 운반하는 게임이 나 낙하물 퍼즐 게임 등 다양한 액션 퍼즐 게임도 다루고 있어서 게임 프로그래밍 입문서로도 좋습니다. 떨어뜨리기Drop, 볼Ball, 블록Block 등 퍼즐 게임을 구성하는 요소별로 나뉘어 있어서 원하는 요소를 조합하며 퍼즐 게임의 원리와 기본을 깨우칠 수 있고 새로운 퍼즐 게임을 만드 는 데에도 응용할 수 있습니다.
●●『게임 매니악스 슈팅 게임 알고리즘』
‘슈팅 게임’의 간단한 원리부터 자연스러운 움직임에 관한 이론까지 자세히 설명한 책입니다. 적기가 쏘는 탄환을 시작으로 플레이어의 분신 같은 메인 캐릭터, 적기를 무찌르기 위한 나만 의 무기, 비장의 무기 같은 특수 경격법, 보스나 편대로 등장하는 적기의 캐릭터, 화려한 우주 또는 드넓은 초원으로 묘사되는 배경 화면, 점수와 난이도 등 게임의 모든 것을 좌우하는 시스 템까지 이 책을 통해 하나씩 습득할 수 있습니다.
●●『게임 매니악스 탄막 게임 알고리즘』
37가지 탄막을 만드는 방법을 알려줍니다. 속성에 변화를 주면 100여 종류에 이르는 탄막을 직접 만들게 될 것입니다. 또한 다양한 탄을 실제로 확인할 수 있도록 간단한 슈팅 게임을 제공 합니다. 샘플 프로그램을 내려받아 실제로 게임을 하듯 여러 가지 탄막을 체험해보세요.
w w w. h a n b i t . c o . k r
Hanbit eBook
Realtime w w w. h a n b i t . c o . k r / e b o o k
DRM free! 어떤 디바이스에서도 자유롭게
eBook Oriented! 전자책에 꼭 맞는 최적의 내용과 디자인
Hanbit eBook
Hanbit eBook
Realtime 70
Realtime 89 49
MFC 프로그래밍 주식분석 프로그램 만들기 김세훈 지음
Hanbit eBook
Hanbit eBook
Realtime 90
Realtime 92 49
자바 개발자를 위한
Vert.x JavaScript Promise azu지음 /주우영옮김
애플리케이션 개발 모바일/웹 메시징 STOMP와 MQTT로 개발하는 IoT 모바일/웹 애플리케이션 Mobile and Web Messaging 제프 메스닐 지음 / 조건희 옮김
이연복 지음
w w w. h a n b i t . c o . k r
즐거운 상상이 가득! 2015년 화제의 신간
즐거운 상상이 가득! 2015년 화제의 신간
전자부품 백과사전 vol.1 찰스 플랫 지음 / 배지은 옮김 / 30,000원
취미공학에 필요한 핵심 전자부품을 사전식으로 정리한 안내서.
전자부품 백과사전 vol.1 찰스 플랫 지음 / 배지은 옮김 / 30,000원
처음 시작하는 센서
취미공학에 필요한 핵심 전자부품을 사전식으로 정리한 안내서.
전자부품 백과사전 vol.2
찰스 플랫 지음 / 가격미정
키모 카르비넨, 테로 카르비넨 지음 임지순 옮김 / 13,000원
세상을 수치로 읽어내는
<전자부품 백과사전> 시리즈의 두 번째 도서다.
부품인 센서를 알려주 는 책. 이 책을 통해 자신 만의 프로젝트에 다양한 처음 센서를 사용해보자.
Zero to Maker
: 누구나 메이커가 될 수 있다 데이비드 랭 지음 / 장재웅 옮김 / 14,000원
전자부품 백과사전 vol.2
찰스 플랫 지음 / 가격미정
일반인에서 메이커로. 날백수에서 무인 잠
<전자부품 백과사전> 시리즈의 수정 회사 CEO 가 된 사나이, 데이비드두 번째 도서다. 랭의 메이커 도전기.
Make: 센서
시작하는 센서
키모 카르비넨, 테로 카르비넨 지음 임지순 옮김 / 13,000원
세상을 수치로 읽어내는 부품인 센서를 알려주
키모 카르비넨, 테로 카르비 넨, 빌 발토카리 지음 는 책. 이 책을 통해 자신 / 가격미정
만의 프로젝트에 다양한
필수 전자부품인 센서를
센서를 사용해보자. 마이크로 컨트롤러 보드
Zero to Maker
: 누구나 메이커가 될 수 있다
에 응용하는 방법을 담
데이비드 랭 지음 / 장재웅 옮김 / 14 ,000원 Maker Pro
았다.
베이첼 지음 / 가격미정 일반인에서 메이커로.존날백수에서 무인 잠
메이커라면 반드시 읽어야 할 필수 계발
수정 회사 CEO가 된 사나이, 데이비드 서. 프로 메이커들과의 인터뷰 및 에세이 랭의 메이커 도전기. 수록.
프로젝트로 배우는 라즈베리 파이
도날드 노리스 지음 / 임지순 옮김
다양한 실전 프로젝트를 통해 라즈베리 파이를 쉽고 재미있게 배워본다.
Maker Pro 존 베이첼 지음 / 가격미정
메이커라면 반드시 읽어야 할 필수 계발
Make: 센서 키모 카르비넨, 테로 카르비 넨, 빌 발토카리 지음 / 가격미정
필수 전자부품인 센서를 마이크로 컨트롤러 보드 에 응용하는 방법을 담 았다.