SDL과 C++를 이용한 크로스 플랫폼 프로그래밍

Similar documents
Microsoft PowerPoint - chap01-C언어개요.pptx

URL Shortener 프로젝트로 배우는 Vert.X 프레임워크

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

슬라이드 1

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

슬라이드 1

C++ Programming

K&R2 Reference Manual 번역본

SIGIL 완벽입문

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

BMP 파일 처리

Windows 8에서 BioStar 1 설치하기

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

untitled

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

C++ Programming

Microsoft PowerPoint - CSharp-10-예외처리

슬라이드 1

UI TASK & KEY EVENT

4S 1차년도 평가 발표자료

vRealize Automation용 VMware Remote Console - VMware

Studuino소프트웨어 설치

슬라이드 1

Microsoft PowerPoint - 권장 사양

안전한 웨 애플리케이션을 위한 자바스크립트 보안

Mango-IMX6Q mfgtool을 이용한 이미지 Write하기

JAVA PROGRAMMING 실습 08.다형성

View Licenses and Services (customer)

PowerPoint Presentation

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

(Microsoft PowerPoint - AndroG3\306\367\306\303\(ICB\).pptx)

gnu-lee-oop-kor-lec06-3-chap7

을풀면된다. 2. JDK 설치 JDK 는 Sun Developer Network 의 Java( 혹은 에서 Download > JavaSE 에서 JDK 6 Update xx 를선택하면설치파일을

JDK이클립스

경우 1) 80GB( 원본 ) => 2TB( 복사본 ), 원본 80GB 는 MBR 로디스크초기화하고 NTFS 로포맷한경우 복사본 HDD 도 MBR 로디스크초기화되고 80GB 만큼포맷되고나머지영역 (80GB~ 나머지부분 ) 은할당되지않음 으로나온다. A. Window P

오버라이딩 (Overriding)

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

PathEye 공식 블로그 다운로드 받으세요!! 지속적으로 업그래이드 됩니다. 여러분의 의견을 주시면 개발에 반영하겠 습니다.

var answer = confirm(" 확인이나취소를누르세요."); // 확인창은사용자의의사를묻는데사용합니다. if(answer == true){ document.write(" 확인을눌렀습니다."); else { document.write(" 취소를눌렀습니다.");


Visual Studio online Limited preview 간략하게살펴보기

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

(Microsoft PowerPoint - \301\24615\260\255 - \303\346\265\271\303\263\270\256)

ISP and CodeVisionAVR C Compiler.hwp

슬라이드 1

슬라이드 1

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Windows Live Hotmail Custom Domains Korea

C++ Programming

윈도우시스템프로그래밍

<4D F736F F F696E74202D20C1A632C0E520C7C1B7CEB1D7B7A5B0B3B9DFB0FAC1A4>

Microsoft PowerPoint - 2-Objective-C 기초

MVVM 패턴의 이해

PowerPoint 프레젠테이션

윈도 모바일 6.1을 OS로 사용하는 스마트폰(옴니아2 등)에서의 Tcl/Tk의 사용

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

금오공대 컴퓨터공학전공 강의자료

슬라이드 1

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

Windows 10 General Announcement v1.0-KO

Lab 3. 실습문제 (Single linked list)_해답.hwp

Microsoft Word - FunctionCall

Microsoft PowerPoint - chap06-2pointer.ppt

17장 클래스와 메소드

유니티 변수-함수.key

vi 사용법

02 C h a p t e r Java

System Recovery 사용자 매뉴얼

Android Master Key Vulnerability

UI TASK & KEY EVENT

쉽게 풀어쓴 C 프로그래밍

consulting

SBR-100S User Manual

tiawPlot ac 사용방법

서현수

Chapter #01 Subject

Microsoft Word - 3부A windows 환경 IVF + visual studio.doc

Windows Server 2012

Microsoft PowerPoint - 14주차 강의자료

Chapter_02-3_NativeApp

( )부록

Microsoft PowerPoint - 09-CE-5-윈도우 핸들


SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

슬라이드 1

Chapter 4. LISTS

(Microsoft PowerPoint - \301\24613\260\255 - oFusion \276\300 \261\270\274\272)

1. 안드로이드개발환경설정 안드로이드개발을위해선툴체인을비롯한다양한소프트웨어패키지가필요합니다 툴체인 (Cross-Compiler) 설치 안드로이드 2.2 프로요부터는소스에기본툴체인이 prebuilt 라는이름으로포함되어있지만, 리눅스 나부트로더 (U-boot)

PowerPoint Presentation

제11장 프로세스와 쓰레드

미디어 및 엔터테인먼트 업계를 위한 Adobe Experience Manager Mobile

C 언어와 프로그래밍 개요

제이쿼리 (JQuery) 정의 자바스크립트함수를쉽게사용하기위해만든자바스크립트라이브러리. 웹페이지를즉석에서변경하는기능에특화된자바스크립트라이브러리. 사용법 $( 제이쿼리객체 ) 혹은 $( 엘리먼트 ) 참고 ) $() 이기호를제이쿼리래퍼라고한다. 즉, 제이쿼리를호출하는기호

슬라이드 1

Transcription:

110 SDL과 C++를 이용한 크로스 플랫폼 프로그래밍 박주항 지음

110 SDL 과 C++ 를이용한크로스플랫폼프로그래밍 박주항지음

표지사진이종원이책의표지는이종원님이보내주신풍경사진을담았습니다. 리얼타임은독자의시선을담은풍경사진을책표지로보여주고자합니다. 사진보내기 ebookwriter@hanbit.co.kr SDL 과 C++ 를이용한크로스플랫폼프로그래밍 초판발행 2015 년 7 월 28 일 지은이박주항 / 펴낸이김태헌펴낸곳한빛미디어 ( 주 ) / 주소서울시마포구양화로 7길 83 한빛미디어 ( 주 ) IT출판부전화 02-325-5544 / 팩스 02-336-7124 등록 1999년 6월 24일제10-1779호 ISBN 978-89-6848-771-2 15000 / 정가 12,000원 총괄배용석 / 책임편집김창수 / 기획 편집정지연 / 교정이미연디자인표지 / 내지여동일, 조판최송실마케팅박상용 / 영업김형진, 김진불, 조유미 이책에대한의견이나오탈자및잘못된내용에대한수정정보는한빛미디어 ( 주 ) 의홈페이지나아래이메일로알려주십시오. 한빛미디어홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr Published by HANBIT Media, Inc. Printed in Korea Copyright c 2015 박주항 & HANBIT Media, Inc. 이책의저작권은박주항과한빛미디어 ( 주 ) 에있습니다. 저작권법에의해보호를받는저작물이므로무단복제및무단전재를금합니다. 지금하지않으면할수없는일이있습니다. 책으로펴내고싶은아이디어나원고를메일 (ebookwriter@hanbit.co.kr) 로보내주세요. 한빛미디어 ( 주 ) 는여러분의소중한경험과지식을기다리고있습니다.

저자소개 지은이 _ 박주항 게임업계에서 10년째일하고있는개발자다. 어린시절국산게임이었던 PC게임 폭스레인저 나 그날이오면 3 같은게임에감명을받아패키지게임개발을꿈꿔왔으나패키지게임시장이사장된현실을받아들이고온라인게임업체에입사하게되었다. 클라이언트프로그래머로입사했지만여러가지회사사정으로서버프로그래머로전향하게되었으며이후로계속온라인게임서버프로그래머로근무해왔다. 서강대학교에서컴퓨터공학과물리학을전공했으며한국산업기술대학교디지털엔터테인먼트학과에서대학원과정을수료하였다. JCE ( 현조이시티 ), LINE Plus Corporation에서근무하였으며현재모바일게임제작회사인 갤럭시엔터테인먼트에서대표이사를역임하고있다. 저서로는온라인서버프로그래밍관련서적인 C++ 로온라인게임서버구축하기 : CGSF를활용한게임서버제작 ( 한빛미디어, 2014년 ) 과 C++ 로온라인게임서버구축하기 : CGSF 파헤쳐보기 ( 한빛미디어, 2014 년 ), C++ 개발자를위한 WIN32 오픈소스라이브러리 100 ( 한빛미디어, 2014년 ) 이있다.

일러두기 하나의소스로다양한플랫폼에대응하자 2000년도초반까지만하더라도멀티플랫폼에대해서는크게고려할필요가없었습니다. PC 단일플랫폼을타깃으로제품을출시해도충분히고객을확보할수있었기때문입니다. 하지만인터넷인프라가예전과비교할수없을정도로좋아지고, 모바일환경이조성되면서이제단일플랫폼으로는프로그램의생명력이그빛을발하기가어렵게되었습니다. 이에따라크로스플랫폼프로그래밍이점차중요한화두로대두하였습니다. 멀티미디어크로스플랫폼을지원하는대표적인추상라이브러리로는 SDL Simple Direct Media 라이브러리가있습니다. SDL과 C++ 다양한플랫폼이등장하고있지만해당플랫폼제공사에서는자신만의고유한프로그래밍언어에특화된환경만을제공하고있습니다. 예를들어, 아이폰에서는 Objective-C, 안드로이드에서는자바, 윈도우폰에서는.NET을지원하고있습니다. 또한, WIN32 플랫폼에서는그래픽처리를위해 DirectX를활용하는데, DirectX 는 WIN32 플랫폼만지원하고다른플랫폼은지원하지않습니다. 이런여러가지여건을고려해볼때, 하나의프로그래밍소스로여러플랫폼에대응하는코드를개발하는것은불가능한것처럼보입니다. 하지만 SDL과 C++ 를활용한다면이문제를해결할수있습니다. 여러플랫폼에서자신만의프로그래밍언어로소프트웨어를개발하긴하지만, 이런소프트웨어의개발을도와주는커널이나상위프레임워크는근본적으로 C나 C++ 로작성되었고개별플랫폼들이 C++ 컴파일을지원하여 C++ 로작성된소스는여러플랫폼에서활용할수있기때문입니다. 그리고 SDL은미디어처리, 렌더링, 사운드처리에관련된프로그래밍인터페이스를여러플랫폼에서대응할수있게제공하므로 SDL로작성된코드는새로운플랫폼으로이식하더라도코드를거의수정하지않아도됩니다. 즉, SDL과 C++ 를이용해소프트웨어를개발했

다면저비용으로타플랫폼에이식하는게가능하다는뜻입니다. SDL과 C++ 를굳이사용할필요가있을까? SDL과 C++ 를사용하면여러플랫폼에서해당소스를재활용할수있지만이것만으로는매력적으로보이지않습니다. 여러플랫폼에대응할수있다고하나생산성이란부분에서걸림돌로작용하기때문입니다. 예를들어, 안드로이드의경우자바란언어의수준높은생산성과안드로이드플랫폼에서제공하는다양한기능을고려해본다면굳이 C++ 로개발할필요가없습니다. 다만지금까지 C++ 로작성된과거레거시코드를재활용한다거나게임프로그래밍처럼 C++ 와궁합이잘맞는분야에사용하는경우 C++ 와 SDL의조합은탁월한선택이라고할수있습니다. 물론게임의경우 Unity3D라는크로스플랫폼개발환경을제공하는개발툴이존재합니다. Unity3D 는다양한애셋이존재하고막강한게임개발환경을제공해주어그래픽디자이너나기획자도게임을제작할수있게해주지만역으로생각해보면프로그래머입장에서는그만큼구현자유도를빼앗기는결과를낳습니다. 이로볼때 C++ 와 SDL 조합을통한게임개발은소프트웨어의동작하나하나를처음부터끝까지프로그래머가제어할수있기에꽤매력적이라고할수있습니다. 책의구성이책에서는 SDL 크로스플랫폼프로그래밍을위한환경설정을구성하는방법을서두에설명합니다. 그리고 SDL을활용해서레거시코드를재활용하는예제를살펴보며그과정에서각플랫폼에특화된내용을점검하고이를해결하는방법을설명합니다. 또한, SDL을활용하여완성된게임프로젝트를설명함으로써 SDL이게임개발과궁합이맞는다는것을강조합니다. 게임개발뿐만아니라 SDL을활용한멀티미디어프로그램개발에대한예제도다루며 WIN32에특화된사용법도설명합니다. 마지막으로 SDL 확장모듈에관해다루고기타이슈사항을살펴봅니다.

대상독자이책에서는 SDL과 C++ 로크로스플랫폼프로그래밍을하는데중점을두고있습니다. 특히윈도우와안드로이드플랫폼용프로그램을단일한소스코드로개발하는방법을설명합니다. 따라서다음사항에해당하는분이라면이책의대상독자에속한다고할수있습니다. 멀티플랫폼멀티미디어소프트웨어개발과관련된분 멀티플랫폼게임개발과관련된분 과거 C++ 로작성한코드를여러플랫폼에이식하고싶은분 SDL 2.0에대한사용법을배우고싶은분 WIN32에특화된 SDL 응용프로그램을제작하려는분 현재이책을쓰고있는시점에서, 한국에서는아직윈도우폰이활성화되지않았지만마이크로소프트의저력을생각하면언젠가윈도우폰도시장의한축을차지할것입니다. 그러면더욱더크로스플랫폼프로그래밍이주목받게될것이며이책이큰도움이되리라생각합니다. 비록이책에서는 WIN32와안드로이드에중점을둔 SDL 활용내용을다루지만이책을읽고나면프로그램을윈도우폰이나아이폰으로포팅하는것이어렵지않음을알게될것입니다.

사전지식및준비사항 크로스플랫폼프로그래밍을하기위한개발툴이필요합니다. 또한, SDL 프로그래밍을위해기초적인 C/C++ 지식이필요합니다. 책후반부에설명하는게임프로젝트의경우간단한디자인패턴을소개하는데, 디자인패턴에대해알고있다면수월히진행할수있습니다. 샘플코드 이책의샘플코드는다음링크에서다운로드할수있습니다. https://github.com/pdpdds/sdlprogramming 다음링크에서 SDLLibrary.rar 파일을다운로드하여샘플코드가들어있는폴더에 압축을풉니다. https://drive.google.com/drive/folders/0b4zzs0o3dor0ds1lowxvq0nhqkk 정상적으로설치했다면샘플코드가있는폴더하위에다음세폴더가있습니다. Project SDL2_Module external Visual Studio 2013 윈도우용프로그램을제작하기위해서 Visual Studio 2013이필요합니다. Visual Studio 2013의경우무료버전인 Express 버전이있어서이 Express 버전을설치하면 SDL 프로그래밍이가능합니다. Express 버전외에 Visual Studio 2013의기능을대부분활용할수있는 Community 버전도마이크로소프트에서무료로공개했습니다. 두버전은다음링크에서다운로드할수있습니다. https://www.visualstudio.com/downloads/download-visual-studio-vs

책에나오는모든샘플소스는 Express 버전에서테스트하였지만 Community 버전에서도동작에문제가없으니가능하면 Community 버전을다운로드하여설치합니다. 학생은 Professional 버전이무료이므로학생이라면 Professional 버전을설치해보기바랍니다. 안드로이드용도구와개발킷 Visual Studio 2013 만으로윈도우용애플리케이션을제작할수있지만안드로이드 용앱을제작하기위해서는다음도구와개발킷을설치해야합니다. ADT ADT Android Developer Tools 는안드로이드프로그램을빌드할수있는 IDE입니다. 현재 ADT는다운로드할수없으며 Android Studio라는새로운 IDE로통일된상태입니다. 이책에서제공하는샘플코드는모두 ADT를사용해서작성되었기때문에최신 IDE인 Android Studio를사용하지않습니다. ADT는다음링크에서다운로드하기바랍니다. http://downloads.puresoftware.org/files/android/adt-bundle/ 이링크에서 adt-bundle-windows-x86_64-20131030.zip 파일을다운로드해서 ADT를설치합니다 ( 운영체제가 32비트라면 32비트버전의 ADT를다운로드합니다 ). 추후해당링크에서파일을다운로드할수없게되면 ADT를다운로드할수있는별도의저장소를제공하겠습니다. ADT에는다음항목이포함되어있습니다. 이클립스 + ADT 플러그인 안드로이드 SDK 툴 안드로이드플랫폼툴

에뮬레이터를위한안드로이드시스템이미지 NDK C++ 소스코드를빌드하기위해 NDK Native Development Kit 가필요합니다. 다음링크에서 NDK를다운로드합니다. https://developer.android.com/ndk/downloads/index.html 윈도우 64비트버전을설치하는데, 현재 NDK 최신버전은 r10e입니다 ( 운영체제가 32비트라면 32비트버전의 NDK를다운로드합니다 ). 환경변수 PATH 항목에 NDK가설치된곳의경로를추가하고, 경로를추가한후콘솔창에 ndk_build.cmd를입력해서정상적으로 NDK가실행되는지확인합니다. 블루스택일반적인 NDK 프로그래밍이라면 ADT에서제공하는안드로이드에뮬레이터로충분하지만아직까진이에뮬레이터가그래픽부분렌더링을완벽히지원하지않습니다. 블루스택 BlueStacks 이라는에뮬레이터를설치하면실제기기가없어도프로그램의결과를확인할수있습니다. 블루스택은다음링크에서다운로드할수있습니다. http://www.bluestacks.com/download.html JDK Java Development Kit 안드로이드프로그램을개발하기위해추가로자바가상머신과 JDK 를설치해야합니다. JDK 는다음링크에서다운로드할수있습니다. http://www.oracle.com/technetwork/java/javase/downloads/index. html?sssourcesiteid=otnjp 윈도우환경에설치하므로최신버전의 JDK 32 비트또는 64 비트버전을설치합니 다. 현재 JDK 최신버전은 1.8 입니다.

한빛리얼타임 한빛리얼타임은 IT 개발자를위한 ebook 입니다. 요즘 IT 업계에는하루가멀다하고수많은기술이나타나고사라져갑니다. 인 터넷을아무리뒤져도조금이나마정리된정보를찾기도쉽지않습니다. 또한, 잘정리되어책으로나오기까지는오랜시간이걸립니다. 어떻게하면조금이라 도더유용한정보를빠르게얻을수있을까요? 어떻게하면남보다조금더빨 리경험하고습득한지식을공유하고발전시켜나갈수있을까요? 세상에는수 많은종이책이있습니다. 그리고그종이책을그대로옮긴전자책도많습니다. 전자책에는전자책에적합한콘텐츠와전자책의특성을살린형식이있다고생 각합니다. 한빛이지금생각하고추구하는, 개발자를위한리얼타임전자책은이렇습니다. 1 ebook First - 빠르게변화하는 IT 기술에대해핵심적인정보를신속하게제공합니다 500페이지가까운분량의잘정리된도서 ( 종이책 ) 가아니라, 핵심적인내용을빠르게전달하기위해조금은거칠지만 100페이지내외의전자책전용으로개발한서비스입니다. 독자에게는새로운정보를빨리얻을기회가되고, 자신이먼저경험한지식과정보를책으로펴내고싶지만너무바빠서엄두를못내는선배, 전문가, 고수분에게는좀더쉽게집필할수있는기회가될수있으리라생각합니다. 또한, 새로운정보와지식을빠르게전달하기위해 O'Reilly의전자책번역서비스도하고있습니다. 2 무료로업데이트되는전자책전용서비스입니다 종이책으로는기술의변화속도를따라잡기가쉽지않습니다. 책이일정분량이상으 로집필되고정리되어나오는동안기술은이미변해있습니다. 전자책으로출간된이 후에도버전업을통해중요한기술적변화가있거나저자 ( 역자 ) 와독자가소통하면서보완하여발전된노하우가정리되면구매하신분께무료로업데이트해드립니다.

3 4 독자의편의를위해 DRM-Free 로제공합니다 구매한전자책을다양한 IT 기기에서자유롭게활용할수있도록 DRM-Free PDF 포맷으로제공합니다. 이는독자여러분과한빛이생각하고추구하는전자책을만들어나가기위해독자여러분이언제어디서어떤기기를사용하더라도편리하게전자책을볼수있도록하기위함입니다. 전자책환경을고려한최적의형태와디자인에담고자노력했습니다종이책을그대로옮겨놓아가독성이떨어지고읽기어려운전자책이아니라, 전자책의환경에가능한한최적화하여쾌적한경험을드리고자합니다. 링크등의기능을적극적으로이용할수있음은물론이고글자크기나행간, 여백등을전자책에가장최적화된형태로새롭게디자인하였습니다. 앞으로도독자여러분의충고에귀기울이며지속해서발전시켜나가겠습니다. 지금보시는전자책에소유권한을표시한문구가없거나타인의소유권한을표시한문구가있다면위법하게사용하고있을가능성이큽니다. 이경우저작권법에따라불이익을받으실수있습니다. 다양한기기에사용할수있습니다. 또한, 한빛미디어사이트에서구매하신후에는횟수에관계없이내려받으실수있습니다. 한빛미디어전자책은인쇄, 검색, 복사하여붙이기가가능합니다. 전자책은오탈자교정이나내용의수정 보완이이뤄지면업데이트관련공지를이메일로알려드리며, 구매하신전자책의수정본은무료로내려받으실수있습니다. 이런특별한권한은한빛미디어사이트에서구매하신독자에게만제공되며, 다른사람에게양도나이전은허락되지않습니다.

차례 Part 1 크로스플랫폼프로젝트 001 chapter 1 SDL 003 1.1 SDL 2.0 003 1.2 SDL과 SDL Extension 004 1.3 주요내용 005 1.4 게임관련크로스플랫폼프레임워크비교 006 1.5 정리 007 chapter 2 안드로이드 NDK 프로그래밍 009 2.1 JNI 009 2.2 안드로이드프로젝트설정 012 2.2 샘플 NDK 프로젝트 015 chapter 3 크로스플랫폼프로젝트작성 HelloSDL2 019 3.1 메인코드 019 3.2 안드로이드 SDL_main 함수호출과정 022 3.3 정리 024 chapter 4 빌드시스템구성 025 4.1 프로젝트구성 026 4.2 정리 028

chapter 5 GUI 라이브러리의활용 029 5.1 Guichan 029 5.2 SDLGUI 프로젝트 030 5.3 안드로이드빌드 034 5.4 정리 036 chapter 6 미디플레이어의제작 037 6.1 TiMidity++ 037 6.2 사운드폰트 038 6.3 코드의구현 038 6.4 안드로이드에서미디파일실행하기 042 6.5 정리 043 chapter 7 IMS 플레이어의제작 045 7.1 코드구현 046 7.2 메인스레드와콜백스레드와의동기화 052 7.3 iconv 라이브러리 056 7.4 TTF 폰트의사용 056 7.5 정리 057

Part 2 게임프로그래밍 059 chapter 8 OpenTyrian 061 8.1 빌드를위한사전준비 062 8.2 소스분석 062 8.3 정리 065 chapter 9 Alien Blaster 067 9.1 게임구조 068 9.2 입력처리 071 9.3 오브젝트상호작용처리및충돌관련처리 073 9.4 렌더링 075 9.5 정리 078 chapter 10 Arkanoid 079 10.1 게임소스 079 10.2 코드분석 080 10.3 정리 086 chapter 11 Snake Bite 087 11.1 SDL 2.0 마이그레이션 088 11.2 게임구조 088 11.3 정리 093

chapter 12 Super Mario 095 12.1 SDL 2.0 마이그레이션 096 12.2 안드로이드포팅 097 12.3 정리 098 chapter 13 Socoban 099 13.1 소스코드변경작업 101 13.2 코드리팩토링 104 13.3 안드로이드포팅 104 13.4 정리 105 chapter 14 Pacman 107 14.1 SDL 2.0 마이그레이션 107 14.2 소스분석 108 14.3 안드로이드포팅 111 14.4 정리 112 chapter 15 SDL 게임엔진 113 15.1 코난게임 114 15.2 안드로이드포팅 115 15.3 타일드맵의사용 117 15.4 정리 118

Part 3 활용하기 119 chapter 16 SDL_net 121 16.1 채팅서버 121 16.2 채팅클라이언트 124 16.3 정리 125 chapter 17 SDL_gfx 127 17.1 SDL_gfx 127 17.2 샘플예제 129 17.3 SDL_gfx 실전 130 17.4 정리 135 chapter 18 SDL_ttf 137 chapter 19 특정영역에 SDL 화면출력하기 139 19.1 balor 라이브러리 140 19.2 SDL 화면의출력 142 19.3 정리 145 chapter 20 SDL + Windows GUI + FFmpeg 147 20.1 FFmpeg 147 20.2 SDLMPEGPlayer 148 20.3 정리 153

chapter 21 동기화 155 chapter 22 에러보고시스템구축 159 22.1 콜스택 159 22.2 ACRA 160 22.3 정리 167 chapter 23 SDL Migration 169 23.1 구조체와 enum값 169 23.2 변경된메서드 170 23.3 삭제된메서드 171 23.4 Visual Studio 2013 포팅 172 23.5 정리 172 chapter 24 기타 173 24.1 TinyGUI 173 24.2 AntTweakBar 174 24.3 도스박스 175 24.4 ScummVM 175 chapter 25 맺음말 181

Part 1 크로스플랫폼프로젝트 특정플랫폼에서동작하는애플리케이션을제작하기위해서는특정플랫폼의 CPU가해석할수있는어셈블리코드를생성할수있어야한다. 이런어셈블리코드는컴파일러가만들어내며, 해당플랫폼에종속적인기계어를만들어낸다. 한편 C++ 나 C로작성된코드는플랫폼종속적인컴파일러에의해어셈블리코드로변환된다. 다르게말하자면 C/C++ 로작성된코드는플랫폼독립적이기때문에여러플랫폼에서그대로사용할수있다. 그렇다하더라도화면렌더링이나사운드출력같은 API는플랫폼마다다른형태로제공되기때문에크로스플랫폼앱을제작한다면플랫폼별로동작하는코드를작성해야한다. #ifdef WIN32 #else if ANDROID #endif

하지만이와같은코드를작성하는것은매우성가신일이며특정플랫폼에대한지식이있어야가능하다. SDL은이런부분, 즉사운드처리나화면렌더링, 입력장치등을각플랫폼에따라개별적으로미리구현해놓았기때문에개발자가 SDL을사용하여멀티미디어애플리케이션을제작한다고해도해당플랫폼을자세하게알필요가없다. 이번파트에서는크로스플랫폼을가능하게해주는 SDL에대해자세히살펴본다. 그리고안드로이드플랫폼에서 SDL로제작한애플리케이션이어떤원리로동작하는지살펴보고안드로이드애플리케이션을빌드하기위한빌드시스템구축에대해살펴본다. 또한몇가지멀티미디어애플리케이션을제작하여본격적인 SDL 프로그래밍을시작해본다. 002 -

chapter 1 SDL SDL Simple Direct Media Layer 은크로스플랫폼프로그래밍을위한멀티미디어라이브러리다. SDL은비디오, 오디오, 사용자입력등을추상화했기때문에해당라이브러리로구현한소스를여러플랫폼으로거의수정없이포팅하는것이가능하다. 즉, 한플랫폼에서 SDL을사용하여프로그램을개발하면별다른비용없이다른플랫폼에쉽게이식할수있다는뜻이다. 이것이가능한이유는플랫폼종속적인부분을 SDL 내부에서모두처리하기때문이다. SDL은 C로구현되었으며 C/ C++ 개발환경에서활용할수있다. 1.1 SDL 2.0 SDL은 1.x 버전이주류를이루다가 2.0 버전으로업데이트되었는데, 이책에서는 SDL 2.0 기준으로설명하겠다. 2.0 버전으로업데이트되면서추가된특징은다음과같다. 다중윈도우창생성가능 오디오캡처기능추가 멀티스레드관련기능향상 여러입력장치지원 다양한오디오장치출력지원 특정렌더타깃지정가능 하드웨어가속기능지원 1 SDL - 003

이외에도업데이트되면서많은부분이향상되었으나아직 SDL을사용하는프로젝트모두가 2.0 버전으로마이그레이션된것은아니다. 파이썬에서 2.x 버전과 3.x 버전이공존하고있는것처럼 SDL도 1.x 버전과 2.0 버전을둘다사용하고있다. SDL 1.x 버전을사용하는대표적인프로젝트로 ScummVM 프로젝트를들수있다. 하지만기능이나성능면에서 2.0 버전이훨씬뛰어나고좀더안정화되었으므로신규프로젝트를개발하거나 SDL 프로그래밍에입문한다면 SDL 2.0으로프로그래밍하는것을권장한다. 1.2 SDL 과 SDL Extension SDL이멀티미디어나게임개발을위한대부분기능을지원하지만더강력한기능을지원하기위해확장모듈이나오게되었다. 이런확장모듈은 SDL 라이브러리에모두포함될수있었지만 SDL 라이브러리의경량화를위해 SDL에추가하지않았으며별도의모듈로분리하여기능을제공하고있다. 이런확장모듈에는 [ 표 1-1] 과같이다양한라이브러리가있다. 표 1-1 SDL 과 SDL 확장모듈 SDL 모듈설명사이트주소 SDL 비디오및오디오처리를위한기본 API 제공 http://www.libsdl.org SDL_mixer 복잡한사운드처리를위한모듈 https://www.libsdl.org/projects/sdl_image SDL_ttf 트루타입폰트출력지원 http://www.libsdl.org/projects/sdl_mixer SDL_net 네트워킹라이브러리 https://www.libsdl.org/projects/sdl_ttf SDL_rtf 서식있는텍스트포맷렌더링 http://www.libsdl.org/projects/sdl_net https://github.com/quoturnix/sdl_net SDL_image 다양한이미지파일처리지원 http://www.libsdl.org/projects/sdl_rtf SDL_gfx 점, 선등의기본프리미티브렌더링지원 https://github.com/ferzkopp/sdl_gfx http://sourceforge.net/projects/sdlgfx 004 -

SDL은기본적으로 2D만을지원하는프레임워크지만 OpenGL을활용하면 3D 프로그래밍도가능하다. 또한, 앞으로 SDL 자체에서 3D 기능을지원할예정이다. 앞에서언급했지만이책에서는최신버전인 SDL 2.0을기준으로설명한다. SDL 관련참고소스를찾아보면 1.2 버전이많은데 1.2 버전의소스를활용한다면 2.0 버전으로마이그레이션하는것을권장한다. 1.x 버전에서 2.0 버전으로마이그레이션하는내용에대해서는마이그레이션가이드 01 를참조하기바란다. 또한, 이책에서 1.x 버전에서 2.0 버전으로포팅할때중요하게고려해야될사항을별도로정리했으니해당부분 (23장) 을참조하기바란다. SDL_gfx와 SDL_rtf 모듈은책을쓴시점에서 2.0으로마이그레이션된버전이존재하지않는다. 이책에서사용하는 SDL_gfx 라이브러리는필자가 2.0에서동작할수있도록수정한것이다. SDL_mixer 라이브러리또한안드로이드플랫폼에서동작할수있도록수정했다. SDL 확장모듈은해당사이트에서다운로드할수있지만책을쓰는시점에서라이브러리의버전이변경되었을가능성이있고설정이번거롭기때문에미리라이브러리를다운로드하여바로컴파일할수있도록소스트리를구성했다. 책에서제공하는샘플프로젝트는 Visual Studio 2013과 ADT로특별한설정없이빌드가가능하다 ( 안드로이드의경우빌드가되지않는일부프로젝트가있으며계속해서소스를수정하고있다 ). 1.3 주요내용 이책은 SDL 2.0 프로그래밍을위해관련 API 에대해설명을하지만세세한설 명은하지않는다. API 자체에대해설명하면 SDL 에대한레퍼런스책이되기때 01 https://wiki.libsdl.org/migrationguide 1 SDL - 005

문이다. 이책에서중점을두는내용은다음과같다. SDL 2.0 프로그래밍 SDL 크로스플랫폼을위한환경설정 SDL을활용한레거시코드의재사용 SDL 게임프로그래밍 SDL 멀티미디어프로그래밍 SDL WIN32 프로그래밍 즉, SDL 자체에중점을두기보다 SDL을활용해서실전에적용할수있는내용을소개하는데중점을두었다. 그래서장마다완성된프로젝트에대한설명이주를이룬다. 물론이과정에나오는 SDL 관련내용중중요하다고생각하는내용에대해서는별도로설명을할애한다. SDL 관련 API 레퍼런스는공식홈페이지를참조하기바란다. 1.4 게임관련크로스플랫폼프레임워크비교 앞에서 SDL을사용하면크로스플랫폼프로그래밍이가능하다고언급했다. 특히 SDL은게임관련크로스플랫폼프로그래밍을하기에매우유용한라이브러리다. 게임제작을위한크로스플랫폼, 즉윈도우나안드로이드, ios 플랫폼에서개발가능한툴과프레임워크는수없이존재한다. Unity3D나 Cocos2d-x 등이대표적이라할수있는데, 이들과 SDL을비교하여 SDL만의장점을확인해보자. 표 1-2 게임관련크로스플랫폼프레임워크비교 프레임워크장점단점 Unity3D - 고품질의 3D 게임을쉽게제작할수있으며, 2D도지원한다. - 애셋스토어가있어서다양한리소스를쉽게얻을수있다. - 게임개발에특화된툴이다. - C# 이주언어라레거시코드를이식하기어렵다. 006 -

프레임워크장점단점 Cocos2d-x SDL - 2D 게임개발을위한크로스플랫폼프레임워크다. - C++ 가기본언어이므로 C++ 라이브러리를손쉽게재활용할수있다. - C++ 로개발하므로레거시 C++ 코드를손쉽게이식할수있다. - Unity3D와마찬가지로게임과교육용소프트웨어개발에특화된프레임워크다. - 기존의 C++ 게임소스를포팅할때상당부분의코드를수정해야한다. - 앞의두플랫폼에비해저수준의 API 를제공하므로필요한기능을새로구축해야한다. SDL은멀티미디어라이브러리긴하지만다른멀티미디어프레임워크처럼많은기능을제공하지는않는다. 하지만이부분은단점이자곧장점이될수있다. 이는기존레거시코드의포팅과관련이있다. 기존레거시코드를 Unity3D나 Cocos2d-x에포팅한다면언어자체를바꾸거나프레임워크의양식에맞게코드를전면수정해야한다. 그러나 SDL을사용하면기존코드의수정을최소화해서개발할수있다. 레거시코드는보통 C나 C++ 로제작되었기때문에이런코드를 Unity로변경하는것은꽤수고로운작업이된다 ( 물론플러그인형태로개발하면 C++ 코드를재활용할수있으나매우번거로운작업이될것이다 ). SDL을사용하면이런부분에서비용을최소화할수있다. 또한, SDL로제작된샘플코드가매우풍부하므로애플리케이션을제작할때조금더수월하게프로그램을개발할수있다. 1.5 정리 지금까지 SDL 라이브러리의개념과강점, SDL 확장모듈에대해간략히살펴봤다. SDL도세상에나온지꽤시간이흘러서조금은시대에뒤처진라이브러리가되어가고있는지도모르겠다. 하지만이책을읽고나면 SDL이사용하기편하며아직크로스플랫폼용라이브러리로서제역할을발휘하고있다는것을느끼게될것이다. 또한, 이책을통해 SDL이게임과궁합이좋다는것을보여주고자한다. 내용이크게어렵지않은만큼이책의마지막까지잘따라올수있으리라믿는다. 1 SDL - 007

chapter 3 크로스플랫폼프로젝트작성 HelloSDL2 앞장에서안드로이드 NDK 프로그래밍방법을배웠다. 이제본격적으로윈도우와안드로이드플랫폼이통합된 SDL 프로그래밍을시작하자. 모든프로그래밍언어는 HelloWorld 문자열을출력하는튜토리얼부터시작하지만, SDL은그래픽라이브러리이므로그림파일로이미지를출력하는예제부터시작하겠다. Project/02_HelloSDL2/win32 경로에서 HelloSDL2.sln 솔루션파일을실행하자. 3.1 메인코드 다음코드는 BMP 이미지파일을출력하는소스로, Hello.bmp라는이미지를로드하여화면에출력한다. 간단한코드지만이코드의구조를이해한다면차후진행할 SDL 프로젝트도무리없이진행할수있다. 코드에서주목해야할점은타깃플랫폼에해당하는진입경로의설정이다. Main.cpp 파일을살펴보자. [Main.cpp] // 윈도우개발환경일경우추가헤더를포함하도록한다. #ifdef WIN32 #include <Windows.h> #include <tchar.h> #endif // 라이브러리를링크할때프로젝트파일에추가하기보다는소스코드에링크지시어를둬서라이브러리를링크하도록한다. #ifdef WIN32 3 크로스플랫폼프로젝트작성 HelloSDL2-019

#pragma comment(lib, SDL2.lib ) #endif // 윈도우환경에서의메인엔트리는 main 함수지만안드로이드에서는진입점이다르다. #ifdef WIN32 #else #endif { int _tmain(int argc, _TCHAR* argv[]) extern C int SDL_main(int argc, char *argv[]) //SDL 을초기화한다. if (SDL_Init(SDL_INIT_EVERYTHING)!= 0){ std::cout << SDL_Init Error: << SDL_GetError() << std::endl; return 0; //SDL 2.0 부터는여러개의윈도우를화면에띄우는것이가능하다 // 윈도우와렌더러객체가분리되었으나안드로이드의경우여러개의윈도우를 띄울일이없다. SDL_Window *pwindow; SDL_Renderer *prenderer; #ifndef WIN32 #else #endif if (SDL_CreateWindowAndRenderer(0, 0, SDL_WINDOW_FULLSCREEN, &pwindow, &prenderer) < 0) if (SDL_CreateWindowAndRenderer(640, 480, 0, &pwindow, &prenderer) < 0) { std::cout << SDL_CreateWindowAndRenderer Error: << SDL_GetError() << std::endl; return 0; //hello.bmp라는이미지파일을 SDL_Surface 객체에로드한다. SDL_Surface *phellowbmp = SDL_LoadBMP( hello.bmp ); if (phellowbmp == 0) { SDL_DestroyRenderer(pRenderer); SDL_DestroyWindow(pWindow); std::cout << SDL_LoadBMP Error: << SDL_GetError() << std::endl; return 0; 020 -

// 이미지를렌더러에복사하기위해서는텍스처를생성해야한다. // 조금전에이미지를로드한 SDL_Surface 객체를사용해텍스처객체를생성한다. SDL_Texture *ptexture = SDL_CreateTextureFromSurface(pRenderer, phellowbmp); SDL_FreeSurface(pHellowBMP); if (ptexture == 0) { SDL_DestroyRenderer(pRenderer); SDL_DestroyWindow(pWindow); std::cout << SDL_CreateTextureFromSurface Error: << SDL_GetError() << std::endl; return 0; bool running = true; // 사용자입력을받는코드다. // 윈도우의경우 Escape 키를누르면해당루프를벗어날수있다. while (running) { SDL_Event event; // 이벤트를조회한다. while (SDL_PollEvent(&event)) { if (event.type == SDL_KEYDOWN) { if (event.key.keysym.sym == SDLK_ESCAPE) { running = false; else if (event.type == SDL_QUIT) { running = false; // 화면클리어 SDL_RenderClear(pRenderer); // 렌더러에텍스처를복사 SDL_RenderCopy(pRenderer, ptexture, NULL, NULL); // 화면을출력한다. SDL_RenderPresent(pRenderer); 3 크로스플랫폼프로젝트작성 HelloSDL2-021

// 생성한객체를모두제거한다. SDL_DestroyTexture(pTexture); SDL_DestroyRenderer(pRenderer); SDL_DestroyWindow(pWindow); SDL_Quit(); 윈도우에서는프로세스실행엔트리함수가 main 이지만안드로이드는 SDL_main 함수가프로그램의시작점이된다. 안드로이드의경우를조금더살펴보자. 3.2 안드로이드 SDL_main 함수호출과정 안드로이드프로그램은보통자바로작성되며생명주기를가진 Activity 라는자바객체로부터프로그램이시작된다. HelloSDL2 프로젝트의경우 SDLActivity라는자바객체가존재하는데, 이객체가프로그램의시작점인것이다 (Project/02_HelloSDL2/android/src/org/libsdl/app 경로에해당파일이있다 ). 해당파일은이책전반에걸쳐소스코드가수정될일은거의없다. main.cpp처럼콘텐츠구현부분에만신경쓰면될뿐안드로이드프로그래밍을위한구조를알필요는없다. 하지만 SDL_Main 함수가호출되는대략적인과정은이해할필요가있다. 우선 Activity 객체가초기화되면공유오브젝트라이브러리를로드한다. System.loadLibrary( SDL2 ); System.loadLibrary( main ); 이라이브러리는프로젝트빌드시 NDK 가생성하는공유오브젝트라이브러리 로, 라이브러리가로드되고난후 Activity 클래스에서는 oncreate 메서드가 호출되는데이때화면출력을위한구성을준비한다. 022 -

protected void oncreate(bundle savedinstancestate) { SDLActivity.initialize(); oncreate 메서드호출이후 surfacechanged 메서드가호출된다. surface Changed 메서드는화면해상도가갱신될때호출되며, 이시점에서별도의스레드를생성하여 SDLMain 객체를실행하고 SDLMain 객체는 SDLActivity의 nativeinit 메서드를호출한다. 이 nativeinit 메서드를통해자바는 C++ 의메서드를호출하게되며최종으로 C++ 의 SDL_main 함수를호출하게된다. SDLActivity 시작 : 공유오브젝트라이브러리로드 SDLActivity surfacechanged 메서드호출 : 별도의스레드를생성하여 SDLActivity 의 nativeinit 메서드호출여기까지가자바코드로실행되는부분이다. nativeinit 메서드는 JNI를통해해당이름과매칭되는 C++ 의적절한메서드를찾는다. SDLActivity의패키지이름은 org.libsdl.app로, 이패키지이름과메서드이름을조합하여 C++ 네이티브함수를찾게되며이함수는 SDL2 라이브러리에구현되어있다. 그리고이함수는결국 SDL_Main 함수를호출하기때문에 ( 내부에서 extern으로선언되어있다 ) SDL_Main 함수를구현하기만하면그결과를안드로이드기기에서확인할수있다. 다만안드로이드와윈도우환경은조금씩차이가있으므로주의하여프로그래밍해야한다. 예를들어, 안드로이드에서특정파일을 fopen 함수로읽으려고하면실패한다. 안드로이드앱은단일한파일 (APK) 로구성되어있어서특정파일을찾을수없기때문이다. 다행히 SDL에서는압축된 APK 파일내부의리소스를찾을수있는메서드를제공하고있기때문에별도로압축파일을읽거나쓰는루틴을구현할필요는없다. 3 크로스플랫폼프로젝트작성 HelloSDL2-023

3.3 정리 이제 SDL로윈도우와안드로이드에서동시에개발할수있는프로그램을작성할수있는이론적토대를마련하였다. 두플랫폼에서각각빌드하여그림이미지가제대로출력되는지확인하자. 다음장부터는빌드환경설정에따른시간낭비에서벗어나실제코드구현에집중한다. 024 -

Part 2 게임프로그래밍 크로스플랫폼프로그래밍과밀접하게관련된분야를꼽으라면단연게임개발분야를들수있다. 2000년대초반까지만하더라도게임은대부분윈도우용으로개발되었지만기기의성능이높아지고다양한 OS와플랫폼이등장함에따라특정 OS에종속된 API로게임개발하는것을지양하게되었다. 또한, Unity와 Cocos2d-x, 언리얼엔진 4 덕택에게임개발자는손쉽게윈도우, 안드로이드, 아이폰등에서동작하는애플리케이션을손쉽게개발할수있게되었다. 이런상황에서 SDL 로게임을개발하는것은굉장히비효율적이다. 물론 SDL로게임을제작한다면각플랫폼으로이식하는데드는비용이그렇게많이들지않는다. 하지만게임을동작하게하는기능외에해당기기에특화된기능을활용할수있는라이브러리가매우부실해서상용게임을제작하고자한다면 SDL의선택은좋지않다. 하지만기존에제작했던레거시게임코드를최소한의수정으로여러플랫폼에이식하고자한다면어떠할까? Cocos2d-x, Unity 등으로는쉽지않은작업이지만 SDL로는최소한의수정으로여러플랫폼에이식할수있다. 또한, Unity 같은툴을사용한다면프로그램의내부동작을파악하기어

렵지만 SDL을사용하면극단적으로이야기해서어셈블리코드수준까지제어가가능하다. Unity 같은툴은개발에편리성을높여주었지만그만큼개발자의자유도를빼앗았다. 편리성이높아지면그만큼자유도가떨어지는것은비단프로그래밍의영역뿐만이아니다. 일상생활의경우를예로들면, 자동차는이동의편리성을높여주지만좁은골목길로이동하는것은어렵다. 하지만도보로는이런골목길도막힘없이걸을수있다. SDL로게임프로그래밍을한다는것은골목길을걷는것과같은맥락으로볼수있다. 이번파트에서는오픈타이리언, 에일리언블래스터, 알카노이드, 스네이크바이트, 슈퍼마리오, 소코반, 팩맨, 코난등의게임을소개하면서오래된게임소스의포팅, 최신 SDL 버전으로의마이그레이션방법등을살펴보겠다. 또한, 게임의로직을설명하면서 SDL과 C++ 조합을살펴본다. 060 -

chapter 10 Arkanoid 알카노이드 Arkanoid 라는게임을알것이다. 1970 년대에나온게임으로벽돌을공 으로전부깨서스테이지를클리어하는게임이다. 공을바닥으로떨어뜨리면죽게 되므로반사신경이꽤중요한게임이다. 그림 10-1 알카노이드게임화면 10.1 게임소스 알카노이드게임소스는인터넷에서쉽게구할수있다. 그중에서 C++ 와애플의 Xcode 로작성된게임소스를포팅하기로결정했다. 게임의원본소스는다음링 10 Arkanoid - 079

크에서알카노이드소스를확인할수있다. https://github.com/asiron/arkanoid 코드의원작자인 Maciej Żurad( 폴란드 ) 에게코드사용에대한허가를받았기때 문에이번장에서는게임소스에대해자세히설명하고자한다. 해당게임소스는 SDL 을사용했기때문에샘플코드로사용하기에안성맞춤이라고생각한다. 그림 10-2 알카노이드게임화면 10.2 코드분석 이번알카노이드프로젝트는게임이라는점과게임이 C++ 와궁합이잘맞는다는 것을고려하여게임구조에대해설명하고자한다. 전체게임구조는다음과같다. 080 -

그림 10-3 게임상태 UML 클래스다이어그램 알카노이드프로젝트에서상태는 메뉴상태 와 게임상태 2 가지가있다. [ 그림 10-4] 는타이틀화면으로, 타이틀화면의상태는 MenuState 며 [START GAME] 버튼을누르면상태는 PlayingState, 즉게임상태로전이된다. 그림 10-4 메뉴화면 메뉴상태에서입력이어떻게처리되는지살펴보자. [ 코드 10-1] 은유저입력을 처리하는가상함수인 HandleEvent 메서드의구현내용이다. 10 Arkanoid - 081

[ 코드 10-1] MenuState의 HandleEvent 메서드 void MenuState::HandleEvents(Uint8* keystates, SDL_Event event, int control_ type){ // 마우스좌표를얻어온다. SDL_GetMouseState(&mouse_pos_x, &mouse_pos_y); switch (curmenu) { // 옵션메뉴에서 ESC 키를누르면메인메뉴화면으로돌아간다. case OPTIONS: if (keystates[sdl_getscancodefromkey(sdlk_escape)]){ GotoMainMenu(); return; // 최고점수화면에서 ESC키를누르면메인메뉴화면으로돌아간다. case HIGHSCORES: if (keystates[sdl_getscancodefromkey(sdlk_escape)]){ GotoMainMenu(); return; // 게임메인으로진입하거나옵션메뉴로진입한다. if(event.type == SDL_MOUSEBUTTONUP){ if(event.button.button == SDL_BUTTON_LEFT){ switch (curmenu) { case MAIN_MENU: RunCommand(menu_main); break; case OPTIONS: RunCommand(menu_options); break; default: break; 키보드의상태를얻어올때는 1.x 버전의경우 keystates[sdlk_escape] 형 태였지만 2.0 버전에서는키를 keystates[sdl_getscancodefromkey(sdlk_ 082 -

ESCAPE)] 형태의스캔코드로변환해야됨을잊지말자. RunCommand(menu_main); 이코드를통해리스트인 menu_main 에등록된함수포인터 startgame 이실행 되며함수포인터 startgame 은 ChangeState 함수를가리키고있다. Change State 함수는다음과같다. [ 코드 10-2] ChangeState 함수 void ChangeState(){ //Game 객체는게임전반에서유지되는전역객체다. // 이객체의내부상태를변경해서메뉴, 메인게임의상태로변경한다. Game* game = g_gameptr; // 현재게임객체의상태가게임플레이상태였을경우메뉴상태로전환한다. if (game->current_state == PLAYING){ game->current_state = MENU; delete game->game_state; game->game_state = new MenuState(); game->game_state->initstate(); // 현재게임객체의상태가메뉴였다면게임플레이상태로전환한다. else if (game->current_state == MENU){ game->current_state = PLAYING; delete game->game_state; game->game_state = new PlayingState(); game->game_state->initstate(); [ 코드 10-2] 의 ChangeState 함수를보면알겠지만 Game 객체는전형적인 State Design Pattern을활용하고있다. 객체의내부상태가 MENU에서 PLAYING으로바뀌면서슬롯카드를교체하듯이 Game 객체의상태는 PlayingState 객체로변경되는데, 상태가바뀌면서 InitState 메서드로게임을초기화한다. 이제게임상태가 PLAYING일때의코드를살펴보자. 10 Arkanoid - 083

[ 그림 10-5] 는게임에서쓰이는타일이나아이템, 플랫폼, 공에관한클래스다이 어그램이다. 그림 10-5 게임객체관련클래스다이어그램 알카노이드게임을구현하기위해등장하는게임객체는 5가지다. 벽돌, 타일, 공과아이템, 그리고우리가조종하는플랫폼은알카노이드게임을구성하는필수구성요소다. 각각의게임객체는 GameObject 클래스를상속하고있으며다음네가지가상메서드를구현해야한다. 표 10-1 GameObject 클래스의가상메서드 메서드 설명 Render 게임객체를렌더링한다. Init 게임객체를초기화한다. Destroy 게임객체를소멸시킨다. Update 게임객체의상태를갱신한다. 각게임객체의상태가렌더링되거나갱신되는과정은해당메서드를살펴보자. 여기서는 Ball 객체의 Render 메서드만살펴보겠다. [ 코드 10-3] Ball 객체의 Render 메서드 void Ball::Render(){ if(isalive()){ GameObject::Render(); if(animation) animation Draw(x-boundX,y-boundY); 084 -

실제볼을그리는 Draw 메서드를살펴보자. [ 코드 10-4] Draw 메서드 void Animation::Draw(float x, float y) const { SDL_Rect offset = {(Sint16)x, (Sint16)y, 0, 0; SDL_BlitSurface(image, clip, g_game.getscreen(), &offset); 이메서드는 SDL_BlitSurface 함수를호출하여글로벌화면영역에볼을그린 다. image 변수는 Ball 과관련된이미지를담고있다. 그림 10-6 볼이미지 볼이미지는단일이미지로구성되었기때문에 SDL_Rect 타입의 clip 변수는이 미지그자체의영역과같다. offset 은화면에그려질좌표를의미한다. 그런데벽돌을격파해서내려오는아이템과같은이미지는상황이달라서, 애니메이션효과를위해 clip 값이계속변한다. [ 그림 10-7] 의경우 11개의이미지프레임이존재하며가로 세로가 10 10이라고가정하면 5프레임째의 clip 영역은좌표가 (40, 0) 가로, 세로가 (10, 10) 이된다. 이런식으로아이템은특정프레임에필요한게임이미지를클립하여애니메이션효과를구현한다. 그림 10-7 아이템이미지 세부사항에대해서는게임을디버깅하면서코드를분석해보면이해할수있으리 라생각한다. 정리하는차원에서지금까지설명한클래스전체에대한클래스다 이어그램을살펴보자. 10 Arkanoid - 085

그림 10-8 알카노이드클래스다이어그램 PlayingState 클래스는내부변수로 GameObject 객체의관리를위한리스트를유지하고있다. 이리스트로게임객체를업데이트하는동시에렌더링도가능하다. PlayingState 클래스를개선하면자신만의알카노이드게임을구현할수있다. 10.3 정리 알카노이드게임은 SDL을활용한간단한 2D 게임을제작하기에안성맞춤인샘플이다. 비록게임을제작하는데 Cocos2d-x나 Unity3D에비해다소불편한점이있으나그차이가그렇게큰건아니다. 또한, 언급한두프레임워크보다레거시코드의활용이더쉽다. 레거시코드를 Cocos2d-x나 Unity3D에이식한다면수정사항이매우많아질것이다 (Cocos2d-x의경우 C++ 를사용한다하더라도해당프레임워크에맞게코드를전면재수정해야한다 ). 따라서간단한 2D 게임을제작하는경우 SDL을활용하는것도충분히경쟁력이있으며고려해볼만하다. 게다가 SDL은앞에서언급한두프레임워크처럼 ios나윈도우폰을모두지원하는라이브러리다. 086 -