1. 화면전환 [ 그림 1] 화면전홖에대한상태도 [ 그림 1] 은게임전반적이화면전홖에대한상태도입니다. 이에대한설명은아래와같습니다. Intro: 게임이시작될때보여주는화면. 화면이보여지고난뒤 2초후면 Main으로이동합니다. 실제게임에서는필요한데이터등을로딩하는동안보여주는형식

Similar documents
1. 게임관련패키지추가 이번연재의소스에는아래와같이, 두개의패키지가추가되었습니다. 이패키지에있는소스들은 에서 Jet Boy 따라하기 라는제목으로설명되어있으니참고하시기바랍니다. app.game.resource 게임에서필요한이

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

1. 테트리스퍼즐설계 [ 그림 1] 테스리스퍼즐실행화면 이번에만들테트리스퍼즐은 [ 그림 1] 과같이조각난퍼즐을다시하나로합치는게임입니다. 이동중이거나퍼즐이겹쳐져있을때는이것을알수있도록퍼즐색상을어둡게 ( 투명 ) 처리하였습니다. 우선기능요구사항을정리하면다음과같습니다. 정사각

1. 슬라이딩퍼즐설계 슬라이딩퍼즐은이미여러종류가앱스토어에도공개되어있기때문에독자분들께서이미알고 있을것이라고생각합니다. 숫자또는이미지퍼즐조각을숚서대로맞춰서원래의모양으로되 돌리는것을목표로하는게임입니다. 이번연재에서는숫자로되어있는퍼즐조각을이용하도록하겠습니다. 이미지를넣어서처리

03장

( )부록

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

심플하고 가벼운 안드로이드 게임 엔진 게쪽 소개 1. 게임 엔진 게쪽 의 개요 게쪽 은 제가 앆드로이드 강좌를 위해서 릶듞 가벼운 게임 엔짂입니다. 원래 이름은 게임 엔진 이라고 하기에는 심하게 쪽 팔리지만 이며, 이름에서 말해주듯이 심플하고 단숚한 라이브러리 모 음

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

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

작성자 : 김성박\(삼성 SDS 멀티캠퍼스 전임강사\)

PowerPoint Presentation

제11장 프로세스와 쓰레드

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

어댑터뷰

JAVA PROGRAMMING 실습 08.다형성

PowerPoint 프레젠테이션

PowerPoint Presentation

// 화면을터치하였을때해야할작업구현 case MotionEvent.ACTION_MOVE: // 화면을드래그하였때 // 화면을드래그하였을때해야할작업구현 case MotionEvent.ACTION_UP: // 화면에서터치가사라질때 // 화면에서터치가사라질때해야할자업구현 c

Microsoft PowerPoint - 2강

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an

13ÀåÃß°¡ºÐ

PowerPoint Presentation

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 14주차 강의자료

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

Network Programming

Microsoft PowerPoint - java1-lab5-ImageProcessorTestOOP.pptx

01장

학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

JUNIT 실습및발표

PowerPoint Presentation

학습목표 선언하여디자인을하는방법을이해하고, 실행할수있다. 시작화면을만드는방법과대체리소스를사용하는방법을이해하고실행할수있다. About 과같은상자를구현하고, 테마를적용하는법을이해하고실행할수있다.

Design Issues

Microsoft PowerPoint - 04-UDP Programming.ppt

신림프로그래머_클린코드.key

<4D F736F F F696E74202D20C1A63034B0AD202D20C7C1B7B9C0D3B8AEBDBAB3CABFCD20B9ABB9F6C6DBC0D4B7C2>

PowerPoint 프레젠테이션

Microsoft Word - Armjtag_문서1.doc

No Slide Title

PowerPoint 프레젠테이션

제8장 자바 GUI 프로그래밍 II

Spring Data JPA Many To Many 양방향 관계 예제

슬라이드 1

리니어레이아웃 - 2 -

PowerPoint Presentation

PowerPoint Presentation

JAVA PROGRAMMING 실습 05. 객체의 활용

오핀 (OFIN) SDK Guide Fintech Mobile SDK Guide - Android V 1.0 OPPFLIB 1

이것은리스트뷰의 setadapter 메소드에잘표현되어있습니다. setadapter 는리스트뷰에사용할데이터객체를넘겨주는메소드입니다. 일반적으로생각한다면 ArrayAdapter 객체를생성하여사용할데이터를저장할것이고데이터가저장된 ArrayAdapter 객체를 setadapt

PowerPoint 프레젠테이션

JAVA PROGRAMMING 실습 07. 상속

Microsoft PowerPoint - 11_DesignPatterns(2010).ppt [호환 모드]

Microsoft PowerPoint - CSharp-10-예외처리

Cluster management software

쉽게 풀어쓴 C 프로그래밍

PowerPoint 프레젠테이션

오버라이딩 (Overriding)

Spring Boot/JDBC JdbcTemplate/CRUD 예제

(8) getpi() 함수는정적함수이므로 main() 에서호출할수있다. (9) class Circle private double radius; static final double PI= ; // PI 이름으로 로초기화된정적상수 public

슬라이드 1

슬라이드 1

Microsoft PowerPoint - ÀÚ¹Ù08Àå-1.ppt

PowerPoint Presentation

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

쉽게 풀어쓴 C 프로그래밍

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

C++ Programming

INAPP결제 API 가이드

PowerPoint Presentation

SKT UCC DRM

JAVA PROGRAMMING 실습 09. 예외처리

PowerPoint Presentation

ThisJava ..

JAVA PROGRAMMING 실습 02. 표준 입출력

쉽게 풀어쓴 C 프로그래밍

슬라이드 1

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

Microsoft Word - java19-1-midterm-answer.doc

C++ Programming

API - Notification 메크로를통하여어느특정상황이되었을때 SolidWorks 및보낸경로를통하여알림메시지를보낼수있습니다. 이번기술자료에서는메크로에서이벤트처리기를통하여진행할예정이며, 메크로에서작업을수행하는데유용할것입니다. 알림이벤트핸들러는응용프로그램구현하는데있어

쉽게 풀어쓴 C 프로그래밊

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - additional08.ppt [호환 모드]

10.0pt1height.7depth.3width±â10.0pt1height.7depth.3widthÃÊ10.0pt1height.7depth.3widthÅë10.0pt1height.7depth.3width°è10.0pt1height.7depth.3widthÇÁ10.0pt1height.7depth.3width·Î10.0pt1height.7depth.3width±×10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width¹Ö pt1height.7depth.3widthŬ10.0pt1height.7depth.3width·¡10.0pt1height.7depth.3width½º, 10.0pt1height.7depth.3width°´10.0pt1height.7depth.3widthü, 10.0pt1height.7depth.3widthº¯10.0pt1height.7depth.3width¼ö, 10.0pt1height.7depth.3width¸Þ10.0pt1height.7depth.3width¼Ò10.0pt1height.7depth.3widthµå

(Microsoft PowerPoint - 07\300\345.ppt [\310\243\310\257 \270\360\265\345])

쉽게 풀어쓴 C 프로그래밍

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

K&R2 Reference Manual 번역본

(Microsoft PowerPoint - java1-lecture11.ppt [\310\243\310\257 \270\360\265\345])

PowerPoint Presentation

gnu-lee-oop-kor-lec10-1-chap10

Contents. 1. PMD ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 2. Metrics ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 3. FindBugs ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ 4. ㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍㆍ

쉽게 풀어쓴 C 프로그래밍

PowerPoint Template

Transcription:

안드로이드개발 - 4 회 게임으로배우는안드로이드개발 지금까지게임의핵심부분을구현하는것에집중하였다면, 이번연재에서는게임을포장하는단계라고볼수있습니다. 게임이시작할때인트로를보여주고, 옵션설정이나게임결과를표시하는화면등의전환에대해서다뤄볼것입니다. 글류종택 ryujt658@hanmail.net http://ryulib.tistory.com/ ( 트위터 : @RyuJongTaek) 연재순서 1. 심플하고가벼운안드로이드게임엔짂 게쪽 소개 2. 슬라이딩퍼즐맊들기 3. 테트리스퍼즐맊들기 4. 슈팅게임만들기 #1 5. 슈팅게임맊들기 #2

1. 화면전환 [ 그림 1] 화면전홖에대한상태도 [ 그림 1] 은게임전반적이화면전홖에대한상태도입니다. 이에대한설명은아래와같습니다. Intro: 게임이시작될때보여주는화면. 화면이보여지고난뒤 2초후면 Main으로이동합니다. 실제게임에서는필요한데이터등을로딩하는동안보여주는형식을취합니다. Main: 게임의 Main Menu에해당하는화면 사용자의선택에따라 Option/Game/Finish 화면으로이동할수있습니다. Option: 게임의옵션을설정하고자할때이용하는화면 옵션을설정한이후에는 Main 화면으로이동합니다. Game: 게임화면 게임이짂행되는화면입니다. 게임은여러개의레벨로구성되어있을수있으며, 한레벨을완료하면다음레벨로자동으로이동하게됩니다. 게임로직에의해서게임이끝나게되면게임결과에해당하는 Result 화면으로이동합니다. Result: 게임결과내용을표시하는화면 사용자가내용을확인하면, 다시 Main 화면으로이동합니다. Finish: 게임이종료될때보여주는화면 게임어플리케이션이완전히종료되기전에표시되는화면이며, 2초정도표시한후에어플리케이션이종료됩니다.

[ 그림 2] Class Diagram [ 그림 2] 는화면을표시하기위하여작성한클래스들의 Class Diagram 입니다. 우선화면마다클래스를따로맊들어서관리할예정입니다. 그리고, 화면이복수개로존재하다보니, 이것을한곳에서일관성있도록관리하기위해서 SceneManager를두어서접근하려고합니다. 모듞화면은자싞이표시될때초기화를처리하는 actionin() 과자싞에게서다른화면으로전홖될 때종료화를처리하는 actionout() 메소드를공통적으로가지고있기때문에, Scene 클래스를부 모클래스로하고이를상속받아서처리하도록하였습니다. [ 소스 1] Scene.java 1 : package app.scene; 2 : 3 : import ryulib.valuelist; 4 : import ryulib.game.gamecontrol; 5 : import ryulib.game.gamecontrolgroup; 6 : 7 : public class Scene extends GameControl { 8 : 9 : public Scene(GameControlGroup gamecontrolgroup) { 10 : super(gamecontrolgroup); 11 : 12 : setvisible(false); 13 : } 14 : 15 : final void doactionin(scene oldscene, ValueList params) { 16 : setvisible(true); 17 : actionin(oldscene, params); 18 : } 19 : 20 : public void actionin(scene oldscene, ValueList params) {

21 : // Override 해서사용 22 : } 23 : 24 : final void doactionout(scene newscene) { 25 : setvisible(false); 26 : actionout(newscene); 27 : } 28 : 29 : public void actionout(scene newscene) { 30 : // Override 해서사용 31 : } 32 : 33 : } 15: 이미설명한것과같이자싞이표시될때초기화를실행하는메소드입니다. 파라메터로이전화면과 params를사용합니다. params는화면전홖시에부가정보가필요할경우를대비해서작성하였습니다. 현재짂행하는예제에서는사용하지않기때문에 null로처리하고있습니다. 17: 자식클래스에서 Override 하여사용하게될 actionin() 을호출합니다. 각화면마다처리할내 용이달라질것이자명하기때문입니다. 이와같은형태를템플릿메소드패턴이라고합니다. actionout() 도 actionin() 과처리가같기때문에설명을생략합니다. 다맊, params가논리상으로필요하지않기때문에새로표시될화면에해당하는 newscene 객체맊을파라메터를전달받습니다. [ 소스 2] SceneManager.java 1 : package app.scene; 2 : 3 : import ryulib.valuelist; 4 : import ryulib.game.gamecontrolgroup; 5 : 6 : 7 : public class SceneManager { 8 : 9 : private static SceneManager _MyObject = new SceneManager(); 10 : 11 : private SceneManager() {} 12 : 13 : public static SceneManager getinstance() { 14 : return _MyObject; 15 : } 16 : 17 : private GameControlGroup _GameControlGroup = null; 18 : 19 : private Scene _Scene = null; 20 : private SceneIntro _SceneIntro = null; 21 : private SceneMain _SceneMain = null; 22 : private SceneOption _SceneOption = null; 23 : private SceneGame _SceneGame = null; 24 : private SceneResult _SceneResult = null; 25 : private SceneFinish _SceneFinish = null; 26 :

27 : public void intro(valuelist params) { 28 : if (_SceneIntro == null) _SceneIntro = new SceneIntro(_GameControlGroup); 29 : setscene(_sceneintro, params); 30 : } 31 : 32 : public void main(valuelist params) { 33 : if (_SceneMain == null) _SceneMain = new SceneMain(_GameControlGroup); 34 : setscene(_scenemain, params); 35 : } 36 : 37 : public void option(valuelist params) { 38 : if (_SceneOption == null) _SceneOption = new SceneOption(_GameControlGroup); 39 : setscene(_sceneoption, params); 40 : } 41 : 42 : public void game(valuelist params) { 43 : if (_SceneGame == null) _SceneGame = new SceneGame(_GameControlGroup); 44 : setscene(_scenegame, params); 45 : } 46 : 47 : public void result(valuelist params) { 48 : if (_SceneResult == null) _SceneResult = new SceneResult(_GameControlGroup); 49 : setscene(_sceneresult, params); 50 : } 51 : 52 : public void finish(valuelist params) { 53 : if (_SceneFinish == null) _SceneFinish = new SceneFinish(_GameControlGroup); 54 : setscene(_scenefinish, params); 55 : } 56 : 57 : public void setgamecontrolgroup(gamecontrolgroup value) { 58 : _GameControlGroup = value; 59 : } 60 : 61 : public GameControlGroup getgamecontrolgroup() { 62 : return _GameControlGroup; 63 : } 64 : 65 : public void setscene(scene value, ValueList params) { 66 : Scene temp = _Scene; 67 : _Scene = value; 68 : 69 : if (temp!= null) temp.doactionout(_scene); 70 : if (_Scene!= null) _Scene.doActionIn(temp, params); 71 : } 72 : 73 : public Scene getscene() { 74 : return _Scene; 75 : } 76 : 77 : } 각화면으로이동하기위해서는 intro(), main(), option() 등의메소드를호출하기맊하면됩니다.

이메소드들은상당히유사한코드형식을보이고있기때문에중복을제거하는것이좋을수도있습니다. 하지맊, 화면의개수가거의고정이며, 변화가된다고해도심할가능성이없기때문에갂단하게표현하였습니다. 변화가없을가능성이높은데굳이코드를복잡하게작성하는것이득이되지않을것이라는판단입니다. 9-15: SceneManager 는싱글톤패턴으로작성되어있기때문에참조할변수를사용하지않고, SceneManager.getInstance() 를호출해서참조하면됩니다. 65: 실제화면을전홖하는메소드입니다. 69: 이전화면이 null 이아니라면, 이전화면객체의 doactionout() 메소드를호출합니다. 70: 현재표시될화면객체의 doactionin() 메소드를호출합니다. 2. Main Activity [ 소스 3] Main.java 1 : package app.main; 2 : 3 : import ryulib.game.gameplatform; 4 : import android.app.activity; 5 : import android.os.bundle; 6 : import android.view.viewgroup; 7 : import android.widget.linearlayout; 8 : import app.scene.scenemanager; 9 : 10 : public class Main extends Activity { 11 : 12 : /** Called when the activity is first created. */ 13 : @Override 14 : public void oncreate(bundle savedinstancestate) { 15 : super.oncreate(savedinstancestate); 16 : 17 : _GamePlatform = new GamePlatform(this); 18 : _GamePlatform.setUseMotionEvent(true); 19 : _GamePlatform.setLayoutParams( 20 : new LinearLayout.LayoutParams( 21 : ViewGroup.LayoutParams.FILL_PARENT, 22 : ViewGroup.LayoutParams.FILL_PARENT, 23 : 0.0F 24 : ) 25 : ); 26 : setcontentview(_gameplatform); 27 : 28 : SceneManager.getInstance().setGameControlGroup( 29 : _GamePlatform.getGameControlGroup()); 30 : SceneManager.getInstance().intro(null);

31 : } 32 : 33 : private GamePlatform _GamePlatform = null; 34 : 35 : } 소스가지금까지의 Main.java 와유사하기때문에틀리부분맊설명하도록하겠습니다. 28: 관리하고있는화면객체들이 GameControl 을상속받고있기때문에 GameControlGroup 객 체를지정해줘야합니다. _GamePlatform.getGameControlGroup() 을지정하여, 모듞화면객체들이 소속될 GameControlGroup 을지정합니다. 29: 어플리케이션이실행되자마자 intro 화면을표시합니다. 앞서설명한것과같이 params 는 현재의예제에서는사용하지않기때문에 null 을전달하고있습니다. 이는다른게임에서도같은 소스를재사용하기위해서미리맊들어둔인터페이스입니다. 3. 초기화면표시 [ 그림 3] 초기화면 [ 소스 4] SceneIntro.java 1 : package app.scene; 2 : 3 : import ryulib.valuelist;

4 : import ryulib.game.gamecontrolgroup; 5 : import ryulib.game.gameplatforminfo; 6 : import android.graphics.bitmap; 7 : import android.graphics.bitmapfactory; 8 : import android.graphics.canvas; 9 : import android.graphics.paint; 10 : 11 : public class SceneIntro extends Scene { 12 : 13 : public SceneIntro(GameControlGroup gamecontrolgroup) { 14 : super(gamecontrolgroup); 15 : 16 : gamecontrolgroup.addcontrol(this); 17 : } 18 : 19 : private Canvas _Canvas = null; 20 : private Paint _Paint = null; 21 : private Bitmap _Bitmap = null; 22 : private long _DisplayTime = 0; 23 : 24 : @Override 25 : public void actionin(scene oldscene, ValueList params) { 26 : _DisplayTime = 2000; 27 : } 28 : 29 : @Override 30 : public void actionout(scene oldscene) { 31 : _Bitmap = null; 32 : } 33 : 34 : @Override 35 : protected void onstart(gameplatforminfo platforminfo) { 36 : _Canvas = platforminfo.getcanvas(); 37 : _Paint = platforminfo.getpaint(); 38 : } 39 : 40 : @Override 41 : protected void ondraw(gameplatforminfo platforminfo) { 42 : _DisplayTime = _DisplayTime - platforminfo.gettick(); 43 : if (_DisplayTime <= 0) { 44 : SceneManager.getInstance().main(null); 45 : return; 46 : } 47 : 48 : if (_Bitmap == null) { 49 : _Bitmap = BitmapFactory.decodeResource( 50 : platforminfo.getgameplatform().getcontext().getresources(), 51 : app.main.r.drawable.begin); 52 : } 53 : 54 : _Canvas.drawBitmap(_Bitmap, 0, 0, _Paint); 55 : } 56 : 57 : } 26: 표시될시갂을 2 초로설정합니다.

31: 현재화면이다른화면으로전홖될때 _Bitmap 객체참조를삭제합니다. 42-46: _DisplayTime 을화면표시갂격인 gettick() 맊큼씩줄여나가다가, 2 초가지난시점에서 main 화면으로전홖합니다. 48: _Bitmap 객체가 null 이면초기화면의이미지를불러들입니다. 54: 초기화면이미지를 [ 그림 3] 과같이표시합니다. 4. 메인화면표시 [ 그림 4] 메인화면 메인화면에서는 option, game, finish 화면으로이동할수있으며, 이를위해서버턴 3 개를통해 서이동하도록하였습니다. 버턴은 ryulib.game.imagebutton 클래스를사용합니다. [ 소스 5] SceneMain.java 1 : package app.scene; 2 : 3 : import ryulib.onnotifyeventlistener; 4 : import ryulib.valuelist; 5 : import ryulib.game.gamecontrolgroup; 6 : import ryulib.game.gameplatforminfo; 7 : import ryulib.game.imagebutton; 8 : import android.graphics.bitmap; 9 : import android.graphics.bitmapfactory;

10 : import android.graphics.canvas; 11 : import android.graphics.paint; 12 : import android.graphics.typeface; 13 : import app.main.r; 14 : 15 : public class SceneMain extends Scene { 16 : 17 : public SceneMain(GameControlGroup gamecontrolgroup) { 18 : super(gamecontrolgroup); 19 : 20 : gamecontrolgroup.addcontrol(this); 21 : } 22 : 23 : private Canvas _Canvas = null; 24 : private Paint _Paint = null; 25 : private Bitmap _Bitmap = null; 26 : 27 : private ImageButton _btoption = null; 28 : private ImageButton _btgame = null; 29 : private ImageButton _btexit = null; 30 : 31 : @Override 32 : public void actionin(scene oldscene, ValueList params) { 33 : _btoption = new ImageButton(getGameControlGroup()); 34 : _btoption.getpaint().settextsize(16); 35 : _btoption.getpaint().settypeface(typeface.default_bold); 36 : _btoption.setcaption("option"); 37 : _btoption.setposition(235, 24); 38 : _btoption.setimageup(r.drawable.btn_up); 39 : _btoption.setimagedown(r.drawable.btn_dn); 40 : _btoption.setonclick(_onoptionclick); 41 : 42 : _btgame = new ImageButton(getGameControlGroup()); 43 : _btgame.getpaint().settextsize(16); 44 : _btgame.getpaint().settypeface(typeface.default_bold); 45 : _btgame.setcaption("start Game"); 46 : _btgame.setposition(235, 24 + 80*1); 47 : _btgame.setimageup(r.drawable.btn_up); 48 : _btgame.setimagedown(r.drawable.btn_dn); 49 : _btgame.setonclick(_ongameclick); 50 : 51 : _btexit = new ImageButton(getGameControlGroup()); 52 : _btexit.getpaint().settextsize(16); 53 : _btexit.getpaint().settypeface(typeface.default_bold); 54 : _btexit.setcaption("exit"); 55 : _btexit.setposition(235, 24 + 80*2); 56 : _btexit.setimageup(r.drawable.btn_up); 57 : _btexit.setimagedown(r.drawable.btn_dn); 58 : _btexit.setonclick(_onexitclick); 59 : } 60 : 61 : @Override 62 : public void actionout(scene newscene) { 63 : _Bitmap = null; 64 : 65 : _btoption.delete(); 66 : _btoption = null; 67 : 68 : _btgame.delete(); 69 : _btgame = null;

70 : 71 : _btexit.delete(); 72 : _btexit = null; 73 : } 74 : 75 : @Override 76 : protected void onstart(gameplatforminfo platforminfo) { 77 : _Canvas = platforminfo.getcanvas(); 78 : _Paint = platforminfo.getpaint(); 79 : } 80 : 81 : @Override 82 : protected void ondraw(gameplatforminfo platforminfo) { 83 : if (_Bitmap == null) { 84 : _Bitmap = BitmapFactory.decodeResource( 85 : platforminfo.getgameplatform().getcontext().getresources(), 86 : app.main.r.drawable.main); 87 : } 88 : 89 : _Canvas.drawBitmap(_Bitmap, 0, 0, _Paint); 90 : } 91 : 92 : private OnNotifyEventListener _OnOptionClick = new OnNotifyEventListener() { 93 : @Override 94 : public void onnotify(object sender) { 95 : SceneManager.getInstance().option(null); 96 : } 97 : }; 98 : 99 : private OnNotifyEventListener _OnGameClick = new OnNotifyEventListener() { 100 : @Override 101 : public void onnotify(object sender) { 102 : SceneManager.getInstance().game(null); 103 : } 104 : }; 105 : 106 : private OnNotifyEventListener _OnExitClick = new OnNotifyEventListener() { 107 : @Override 108 : public void onnotify(object sender) { 109 : SceneManager.getInstance().finish(null); 110 : } 111 : }; 112 : 113 : } 31-59: 화면의초기화에서필요한버턴 3 개를생성하고있습니다. 38,47,56: 버턴은평상시에해당하는이미지와 39,48,57: 눌러졌을때사용하는이미지두개를지정하여사용합니다. 36,45,54: ImageButton 클래스의 setcaption(" 표시할문자열 ") 메소드는버턴위에표시될문자열 을지정할수있도록합니다.

61-73: 화면의종료처리에서는배경화면과버턴의참조를 null 로지정합니다. 사용하지않는리 소스를반홖하기위해서입니다. 92-97: _btoption 버턴이클릭되면 option 화면으로이동합니다. 99-104: _btgame 버턴이클릭되면 game 화면으로이동합니다. 106-111: _Exit 버턴이클릭되면 finish 화면으로이동합니다. [ 그림 5] 는 _ btoption 버턴이클릭됐을때의화면입니다. [ 그림 5] 버턴이눌러졌을때 ( 터치 ) 5. 게임화면표시 게임화면의경우에는자체적으로도레벨에따른화면관리가필요합니다. 따라서 [ 그림 6] 과같 이클래스를구성하도록하였습니다.

[ 그림 6] 게임화면에대한 Class Diagram [ 소스 6] SceneGame.java 1 : package app.scene; 2 : 3 : import ryulib.valuelist; 4 : import ryulib.game.gamecontrolgroup; 5 : import app.game.level.gamelevel; 6 : import app.game.level.gamelevel01; 7 : import app.game.level.gamelevel02; 8 : import app.game.level.gamelevel03; 9 : 10 : public class SceneGame extends Scene { 11 : 12 : private static SceneGame _MyObject = null; 13 : 14 : public SceneGame(GameControlGroup gamecontrolgroup) { 15 : super(gamecontrolgroup); 16 : 17 : _MyObject = this; 18 : 19 : gamecontrolgroup.addcontrol(this); 20 : } 21 : 22 : public static SceneGame getinstance() { 23 : return _MyObject; 24 : } 25 : 26 : private GameLevel _GameLevel = null; 27 : 28 : public void setgamelevel(int level) { 29 : if (_GameLevel!= null) { 30 : _GameLevel.delete(); 31 : _GameLevel = null; 32 : } 33 : 34 : switch (level) { 35 : case 1: _GameLevel = new

GameLevel01(getGameControlGroup()); break; 36 : case 2: _GameLevel = new GameLevel02(getGameControlGroup()); break; 37 : case 3: _GameLevel = new GameLevel03(getGameControlGroup()); break; 38 : default: ; // TODO : raise Exception 39 : } 40 : 41 : getgamecontrolgroup().addcontrol(_gamelevel); 42 : } 43 : 44 : @Override 45 : public void actionin(scene oldscene, ValueList params) { 46 : setgamelevel(1); 47 : } 48 : 49 : @Override 50 : public void actionout(scene newscene) { 51 : if (_GameLevel!= null) { 52 : _GameLevel.delete(); 53 : _GameLevel = null; 54 : } 55 : } 56 : 57 : } 22-24: SceneGame의경우에는싱글톤패턴을응용하여 static 메소드를통해서참조하는것과변수를통해서접근하는두가지를모두허용하는형태입니다. 모듞화면의객체가 SceneManager 내부에서변수를통해서참조되고있기때문에 SceneGame도변수를통해서접근하도록하였습니다. 하지맊, 복수의 GameLevel에서접근할때, SceneManager를경유하는것보다직접 SceneGame의객체를참조하는것이직관적이라고판단하여 static 메소드를통해서참조할수있도록하였습니다. 28-42: 지정된번호 (level) 에따라서 GameLevel 을전홖해주는메소드입니다. 29-32: 현재레벨의객체를삭제합니다. 34-39: 지정된번호에맞춰그에상응하는 GameLevel 객체를생성합니다. 41: 생성된객체를 GameControlGroup 에포함시킵니다. 이로써 GameLevel 객체가화면에표시 될준비가됩니다. 44-47: 게임화면이표시될때초기화처리입니다. 첫번째 GameLevel 을표시합니다. 49-55: 게임화면의종료처리입니다. 생성된 GameLevel 객체를삭제합니다. 아래의 [ 소스 7] 은첫번째 GameLevel 에해당하는소스입니다. 38: 라인에서보듯이, 화면이터 치되면바로두번째 GameLevlel 로이동하도록되어있습니다. GameLevel02.java 의경우도똑같

은원리로 GameLevel03으로이동하도록되어있습니다. GameLevel03에서화면이터치되면, result 화면으로이동하여게임결과를화면에표시합니다. 이부분은다음연재에서구체적으로다룰예정이며, 실제로는어느레벨에서듞지게임이종료되면바로 result 화면으로이동하도록할예정입니다. 현재는전체화면의전홖을다루고있기때문에게임의구체적인내용은흉내맊내어테스트가가능하도록하였습니다. [ 소스 7] GameLevel01.java 1 : package app.game.level; 2 : 3 : import android.graphics.canvas; 4 : import android.graphics.paint; 5 : import android.view.motionevent; 6 : import app.scene.scenegame; 7 : import ryulib.game.gamecontrolgroup; 8 : import ryulib.game.gameplatforminfo; 9 : 10 : public class GameLevel01 extends GameLevel { 11 : 12 : public GameLevel01(GameControlGroup gamecontrolgroup) { 13 : super(gamecontrolgroup); 14 : // TODO Auto-generated constructor stub 15 : } 16 : 17 : private Canvas _Canvas = null; 18 : private Paint _Paint = null; 19 : 20 : @Override 21 : protected void onstart(gameplatforminfo platforminfo) { 22 : _Canvas = platforminfo.getcanvas(); 23 : _Paint = platforminfo.getpaint(); 24 : } 25 : 26 : @Override 27 : protected void ondraw(gameplatforminfo platforminfo) { 28 : _Paint.setARGB(255, 0, 0, 0); 29 : _Canvas.drawRect(0, 0, _Canvas.getWidth(), _Canvas.getHeight(), _Paint); 30 : 31 : _Paint.setARGB(255, 255, 255, 255); 32 : _Canvas.drawText("GameLevel01...", 100, 100, _Paint); 33 : } 34 : 35 : @Override 36 : protected boolean ontouchevent(gameplatforminfo platforminfo, MotionEvent event) { 37 : if (event.getaction() == MotionEvent.ACTION_DOWN) { 38 : SceneGame.getInstance().setGameLevel(2); 39 : } 40 : 41 : return true; 42 : } 43 : 44 : }

6. 마무리 [ 그림 6] 종료화면, 2 초갂표시되고어플리케이션이종료됩니다. 설명되지않은 option 과 finish 화면은각각 main 과 intro 화면과유사한소스이기때문에생략하 였습니다. 예제소스는 http://ryulib.tistory.com/126 에서다운받으실수있습니다. 실행동영상도같이있으니참고하시기바랍니다. 다음마지막연재에서는실제게임에해당하는부분을구현하여슈팅게임구현을완성하도록하겠습니다.