Download presentation
Presentation is loading. Please wait.
1
실전 사운드 처리 프로그래밍 Lecture #11
2
강의 목차 게임 개발에서 실제로 활용할 수 있도록 사운드를 처리하는 방법을 알아본다. Mobile Programming
3
사운드 처리 개요 (1) 모바일 게임의 주요 화면 중에 사운드 처리 화면
(c) 게임 타이틀, (d) 메인 메뉴, (f~h) 게임 화면 등 (a) 로고 (b) 공지사항 (c) 게임 타이틀 (d) 메인 메뉴 (e) 게임 로딩 (f) 게임 시작 I (g) 게임 시작 II (h) 게임 시작 III Mobile Programming
4
게임 타이틀 화면 제작 (1) 타이틀 화면 만드는 과정 주요 기능과 리소스 사운드 처리 이미지 그리기
리소스 title.wav bg_img.png title1.png title2.png title3.png Mobile Programming
5
게임 타이틀 화면 제작 (2) 게임 타이틀 사운드 처리하기 ➊ 사운드 파일 생성 ➋ 사운드 관리자 생성 ➌ 사운드 재생
➊ InputStream in = getClass().getResourceAsStream("/title.wav"); ➋ mPlayer = Manager.createPlayer(in, "audio/x-wav"); ➌ mPlayer.start( ); Mobile Programming
6
게임 타이틀 화면 제작 (3) 게임 타이틀 사운드 처리하기 사운드 파일 생성
public InputStream getResourceAsStream(String name) 사운드 관리자 생성 public static Player createPlayer(InputStream stream, String type) 사운드 파일의 MIME 타입 Mobile Programming
7
게임 타이틀 화면 제작 (4) 사운드 재생 및 종료 프로그램 사운드 재생 사운드 종료 try {
Player p = Manager.createPlayer(Manager.TONE_DEVICE_LOCATOR); p.start( ); p.stop( ); } catch(MediaException me) { } } catch(IOException ioe) { } 사운드 종료 final public void soundStop( ) { if(mPlayer != null) { mPlayer.stop( ); mPlayer = null; } catch(Exception e) { } } Mobile Programming
8
게임 타이틀 화면 제작 (5) 게임 타이틀 처리 코드 변수 선언 생성자 paint( ) 메소드 추가 & 수정 부분
/* 타이틀 이미지 */ private Image title1, title2, title3; /* 사운드 처리 */ private Player mPlayer; private boolean sound; 생성자 /* try ~ catch 문에 추가 */ title1 = Image.createImage“( /images/title/title1.png”); // 삼국지 title2 = Image.createImage“( /images/title/title2.png”); // 아이 title3 = Image.createImage“( /images/title/title3.png”); // 플러스 paint( ) 메소드 public void paint(Graphics g) { if(gameState == g_LOGO) { draw_logo(g); } else if(gameState == g_NOTICE) { draw_notice(g); } else if(gameState == g_TITLE) { if(!sound) soundPlay“( title”); draw_title(g); } Mobile Programming
9
게임 타이틀 화면 제작 (6) 게임 타이틀 처리 코드 draw_title( ) 추가 & 수정 부분
01 public void draw_title(Graphics g) { g.drawImage(bg_img, 0, 0, Graphics.TOP | Graphics.LEFT); g.drawImage(title1, 0, 0, Graphics.TOP | Graphics.LEFT); g.drawImage(title2, getWidth()/2, title1.getHeight()+10, Graphics.TOP | Graphics.HCENTER); g.drawImage(title3, getWidth()/2+50, title1.getHeight()+50, 06 } Mobile Programming
10
게임 타이틀 화면 제작 (7) 게임 타이틀 처리 코드 soundPaly( ) soundStop( ) 메소드 추가 부분
01 public void soundPlay(String name) { soundStop(); try { InputStream in = getClass().getResourceAsStream“( /”+name+“.wav”); mPlayer = Manager.createPlayer(in, “audio/x-wav”); mPlayer.start(); } catch(Exception e) { } sound = true; 09 } soundStop( ) 01 final public void soundStop() { if(mPlayer != null) { try { mPlayer.stop(); mPlayer = null; sound = false; } catch(Exception e) { } } Mobile Programming
11
[예제 9-1] TitleCanvas.java
게임 타이틀 화면 제작 (8) 01 import javax.microedition.lcdui.*; 02 import javax.microedition.media.*; 03 04 import java.io.*; 05 06 public class TitleCanvas extends Canvas implements Runnable { 07 private Thread thread; 08 private Image bg_img; 09 /* 타이틀 이미지 */ 10 private Image title1, title2, title3; 11 /* 사운드 처리 */ 12 private Player mPlayer; 13 private boolean sound; 14 15 public TitleCanvas( ) { try { bg_img = Image.createImage("/bg_img.png"); // 배경 title1 = Image.createImage("/title1.png"); // 삼국지 title2 = Image.createImage("/title2.png"); // 아이 title3 = Image.createImage("/title3.png"); // 플러스 } catch (IOException e) { System.out.println("이미지 파일을 생성할 수 없습니다."); } thread = new Thread(this); thread.start( ); // run( ) 호출 26 } [예제 9-1] TitleCanvas.java Mobile Programming
12
[예제 9-1] TitleCanvas.java
게임 타이틀 화면 제작 (9) 27 public void run( ) { while(true) { try { Thread.sleep(200); } catch(InterruptedException e) { System.out.println(e); } repaint( ); // paint( ) 호출 } 36 } 37 public void paint(Graphics g) { if(!sound) soundPlay("title"); draw_title(g); 40 } 41 public void draw_title(Graphics g) { g.setColor(255,255,255); // 흰색 g.fillRect(0, 0, getWidth( ), getHeight( )); // 전체 화면을 흰색으로 g.drawImage(bg_img,0, 0, Graphics.TOP | Graphics.LEFT); // 배경 g.drawImage(title1,0, 0, Graphics.TOP | Graphics.LEFT); g.drawImage(title2, getWidth( )/2, title1.getHeight( )+ 10, Graphics.TOP | Graphics.HCENTER); g.drawImage(title3, getWidth( )/2+50, title1.getHeight( )+50, Graphics.TOP | Graphics.HCENTER); 48 } [예제 9-1] TitleCanvas.java Mobile Programming
13
[예제 9-1] TitleCanvas.java
게임 타이틀 화면 제작 (10) 49 public void soundPlay(String name) { soundStop( ); try { InputStream in = getClass( ).getResourceAsStream("/"+name+".wav"); mPlayer = Manager.createPlayer(in, "audio/x-wav"); mPlayer.start( ); } catch(Exception e) { } sound = true; 57 } 58 final public void soundStop( ) { if(mPlayer != null) { try { mPlayer.stop( ); mPlayer = null; sound = false; } catch(Exception e) { } } 66 } 67 } [예제 9-1] TitleCanvas.java Mobile Programming
14
메인 메뉴 화면 제작 (1) 메인 메뉴 화면 구성 주요 기능과 리소스 이미지 그리기
<UP>, <Down> 키를 이용한 메뉴 항목 선택 클리핑 리소스 bg_img.png main/00.png main/01.png main/02.png menumov.wav Mobile Programming
15
메인 메뉴 화면 제작 (2) 메인 메뉴 화면에 클리핑 적용하기
사각형 모양의 특정 부분만 화면에 출력할 때 이용 setClip(int x, int y, int width, int height); Mobile Programming
16
메인 메뉴 화면 제작 (3) 메뉴 항목의 클리핑 적용 예 적용 결과
int tempH[] = {32, 30, 30, 32, 32, 34, 32}; ... for(byte i=0; i < tempH.length; i++) { if(menuSelect == i) { g.setClip(width/2-(menu_img2.getWidth() >> 1 ), tempY, menu_img2.getWidth(), tempH[i]); g.drawImage(menu_img2, width/2, height/2, Graphics.VCENTER | Graphics.HCENTER); 적용 결과 Mobile Programming
17
메인 메뉴 화면 제작 (4) 메인 메뉴 처리 코드 변수 선언 생성자 추가 & 수정 부분 /* 메뉴 처리 */
static final byte g_MENU = 4; static final byte g_LOADING = 5; private Image menu_img1, menu_img2, cursor; private byte menuSelect; private int width, height; 생성자 width = getWidth(); height = getHeight(); /* try ~ catch 문에 추가 */ menu_img1 = Image.createImage“( /images/menu/00.png”); menu_img2 = Image.createImage“( /images/menu/01.png”); cursor = Image.createImage“( /images/menu/02.png”); Mobile Programming
18
메인 메뉴 화면 제작 (5) 메인 메뉴 처리 코드 paint( ) 메소드 draw_title( ) 추가 & 수정 부분
public void paint(Graphics g) { if(gameState == g_LOGO) { draw_logo(g); } else if(gameState == g_NOTICE) { draw_notice(g); } else if(gameState == g_TITLE) { if(!sound) soundPlay“( title”); draw_title(g); } } else if(gameState == g_MENU) { soundStop(); draw_background_img(g); // 배경 화면 초기화 draw_menu(g); draw_title( ) if(isKeyPressed) { switch(getGameAction(keyCode)) { default: gameState = g_MENU; isKeyPressed = false; Mobile Programming
19
메인 메뉴 화면 제작 (6) 메인 메뉴 처리 코드 draw_menu() 메소드 추가 부분
01 public void draw_menu(Graphics g) { 02 int tempY = height/2- (menu_img2.getHeight()/2 ); 03 int tempH[] = {32, 30, 30, 32, 32, 34, 32}; 04 g.drawImage(menu_img1, width/2, height/2, Graphics.VCENTER | Graphics.HCENTER); 05 06 for(byte i=0; i < tempH.length; i++) { if(menuSelect == i) { g.setClip(width/2-(menu_img2.getWidth() >> 1), tempY, menu_img2.getWidth(), tempH[i]); g.drawImage(menu_img2, width/2, height/2, Graphics.VCENTER | Graphics.HCENTER); g.setClip(0, 0, width, height); g.drawImage(cursor, width/2-(menu_img2.getWidth() >> 1),tempY-3, Graphics.TOP | Graphics.RIGHT); } tempY += tempH[i]; 14 } 15 if(isKeyPressed) { switch(getGameAction(keyCode)) { case UP: menuSelect--; if(menuSelect<0) menuSelect=6; soundPlay“( menumov”); break; Mobile Programming
20
draw_backgr ound_img()
메인 메뉴 화면 제작 (7) 메인 메뉴 처리 코드 메소드 추가 부분 draw_menu() case DOWN: menuSelect++; if(menuSelect>6) menuSelect=0; soundPlay“( menumov”); break; case FIRE: if(menuSelect == 0) { // 게임 시작 gameState = g_LOADING; logoCount = 0; } break; } 34 } 35 isKeyPressed = false; 36 } 메소드 추가 부분 draw_backgr ound_img() public void draw_background_img(Graphics g) { g.drawImage(bg_img, 0, 0, Graphics.TOP | Graphics.LEFT); } Mobile Programming
21
메인 메뉴 화면 제작 (8) [예제 9-2] MenuCanvas.java
001 import javax.microedition.lcdui.*; 002 import javax.microedition.media.*; 003 004 import java.io.*; 005 006 public class MenuCanvas extends Canvas implements Runnable { /* 로고 */ private int logoCount; private byte gameState; private Thread thread; private Image bg_img; private Image loading_img; /* 이벤트 처리 */ private boolean isKeyPressed = false; private int keyCode; /* 사운드 처리 */ private Player mPlayer; private boolean sound; /* 메뉴 처리 */ static final byte g_MENU = 4; static final byte g_LOADING = 5; private Image menu_img1, menu_img2, cursor; private byte menuSelect; private int width, height; 025 [예제 9-2] MenuCanvas.java Mobile Programming
22
메인 메뉴 화면 제작 (9) [예제 9-2] MenuCanvas.java 026 public MenuCanvas( ) {
width = getWidth( ); height = getHeight( ); try { bg_img = Image.createImage("/bg_img.png"); // 배경 loading_img = Image.createImage("/loading.png"); // 로딩 menu_img1 = Image.createImage("/00.png"); // 메뉴1 menu_img2 = Image.createImage("/01.png"); // 메뉴2 cursor = Image.createImage("/02.png"); // 메뉴 커서 } catch(IOException e) { System.out.println("이미지 파일을 생성할 수 없습니다."); } gameState = g_MENU; thread = new Thread(this); thread.start( ); // run( ) 호출 } public void run( ) { while(true) { try { Thread.sleep(200); } catch(InterruptedException e) { System.out.println(e); } repaint( ); // paint( ) 호출 } } [예제 9-2] MenuCanvas.java Mobile Programming
23
메인 메뉴 화면 제작 (10) [예제 9-2] MenuCanvas.java
public void paint(Graphics g) { if(gameState == g_MENU) { soundStop( ); draw_background_img(g); // 배경 화면 초기화 draw_menu(g); } else if(gameState == g_LOADING) { draw_loading(g); } } public void draw_menu(Graphics g) { int tempY = height/2 - (menu_img2.getHeight( )/2 ); int tempH[] = {32, 30, 30, 32, 32, 34, 32}; g.drawImage(menu_img1, width/2, height/2, Graphics.VCENTER | Graphics.HCENTER); 065 for(byte i=0; i < tempH.length; i++) { if(menuSelect == i) { g.setClip(width/2 - (menu_img2.getWidth( ) >> 1 ), tempY, menu_img2.getWidth( ), tempH[i]); g.drawImage(menu_img2, width/2, height/2, Graphics.VCENTER|Graphics.HCENTER); g.setClip(0, 0, width, height); g.drawImage(cursor, width/2 - (menu_img2.getWidth( ) >> 1), tempY-3, Graphics.TOP|Graphics.RIGHT); } tempY += tempH[i]; } [예제 9-2] MenuCanvas.java Mobile Programming
24
메인 메뉴 화면 제작 (11) [예제 9-2] MenuCanvas.java 075 if(isKeyPressed) {
switch(getGameAction(keyCode)) { case UP: menuSelect--; if(menuSelect<0) menuSelect=6; soundPlay("menumov"); break; case DOWN: menuSelect++; if(menuSelect > 6) menuSelect=0; soundPlay("menumov"); break; case FIRE : if(menuSelect == 0) { // 게임 시작 gameState = g_LOADING; logoCount = 0; } break; } } isKeyPressed = false; } [예제 9-2] MenuCanvas.java Mobile Programming
25
메인 메뉴 화면 제작 (12) [예제 9-2] MenuCanvas.java
public void draw_loading(Graphics g) { g.setColor(0, 255, 0); g.fillRect(0, 0, width, height); g.drawImage(loading_img, width/2, height/2, Graphics.VCENTER|Graphics.HCENTER); int x = width/2 - loading_img.getWidth( )/2; int y = height/2 - loading_img.getHeight( )/2; g.fillRect(x, y, loading_img.getWidth( ), loading_img.getHeight( )/2 - logoCount); g.fillRect(x, height/2 + logoCount, loading_img.getWidth( ), loading_img.getHeight( )/2 - logoCount); if(logoCount < 7) logoCount += 1; else logoCount+=2; if(logoCount >= 18) { gameState = g_MENU; logoCount = 0; } } public void draw_background_img(Graphics g) { g.drawImage(bg_img, 0, 0, Graphics.TOP | Graphics.LEFT); } [예제 9-2] MenuCanvas.java Mobile Programming
26
메인 메뉴 화면 제작 (13) [예제 9-2] MenuCanvas.java
public void keyPressed(int keyCode) { isKeyPressed = true; this.keyCode = keyCode; } public void soundPlay(String name) { soundStop( ); try { InputStream in = getClass( ).getResourceAsStream("/"+name+".wav"); mPlayer = Manager.createPlayer(in, "audio/x-wav"); mPlayer.start( ); } catch (Exception e) { } sound = true; } final public void soundStop( ) { if(mPlayer != null) { try { mPlayer.stop( ); mPlayer = null; sound = false; } catch(Exception e) { } } } 137 } [예제 9-2] MenuCanvas.java Mobile Programming
27
게임 시작 화면 제작 (1) 게임 시작 화면 만드는 과정 주요 기능과 리소스 이미지 그리기 효과음 재생 클리핑
리소스 readyGo.png bigNum/04.png smallNum/00.png smallNum/01.png smallNum/03.png back/00.png back/01.png back/02.png back/03.png back/04.png ready.wav go.wav Mobile Programming
28
게임 시작 화면 제작 (2) 게임 시작 화면 처리 코드 변수 선언 생성자 paint() 메소드 추가 & 수정 부분
/* 게임 시작 */ private int stage, life, score, hidden, hint; private int showCnt = 0; private int flow = 0; private Image readyGo_img; private Image BACK_IMG[] = null; private Image SMALLNUM_IMG[] = null; private Image BIGNUM_IMG[] = null; private Image ORIGINAL_IMG = null; static final byte g_GAME_RUN = 7; 생성자 /* try ~ catch 문에 추가 */ readyGo_img = Image.createImage“( /images/menu/readyGo.png”); paint() 메소드 ... } else if(gameState == g_READY_GO) { draw_back(g); draw_readyGo(g); } Mobile Programming
29
게임 시작 화면 제작 (3) 게임 시작 화면 처리 코드 draw_loading() 메 소드 추가 & 수정 부분 ...
09 if(logoCount == 1) { commonGameInit(); 12 } 13 if(logoCount < 7) logoCount += 1; 14 else logoCount += 2; 15 if(logoCount >= 18) { gameState = g_READY_GO; logoCount = 0; 18 } 19 } Mobile Programming
30
게임 시작 화면 제작 (4) 게임 시작 화면 처리 코드 commonGameInit () 메소드 메소드 추가 부분
메소드 추가 부분 commonGameInit () 메소드 01 public void commonGameInit() { 02 hint = 3; 03 life = 3; 04 hidden = 4; 05 showCnt = 0; 06 stage = 1; 07 score = 0; 08 BACK_IMG = createImg“( back”, 8); 09 SMALLNUM_IMG = createImg“( smallNum”, 10); 10 BIGNUM_IMG = createImg“( bigNum”, 5); 11 ORIGINAL_IMG = createImg“( original”,“ stage”); 12 System.gc(); 13 logoCount = 2; 14 } Mobile Programming
31
게임 시작 화면 제작 (5) 게임 시작 화면 처리 코드 draw_readyGo() 메소드 메소드 추가 부분
메소드 추가 부분 draw_readyGo() 메소드 01 public void draw_readyGo(Graphics g) { 02 showCnt++; 03 if(showCnt < 5) { if(flow == 0) { soundPlay“( ready”); flow = 1; } g.setClip(width/2-(readyGo_img.getWidth()/2), height/2-16,readyGo_img.getWidth(), readyGo_img.getHeight()/2); g.drawImage(readyGo_img, width/2, height/2+16,Graphics.VCENTER | Graphics.HCENTER); 10 } 11 else if(showCnt < 10) { if(flow == 1) { soundPlay“( go”); flow = 2; } g.setClip(width/2-(readyGo_img.getWidth()/2), height/2-16,readyGo_img.getWidth(), readyGo_img.getHeight()/2); g.drawImage(readyGo_img, width/2, height/2-16,Graphics.VCENTER | Graphics.HCENTER); 18 } 19 else if(showCnt >= 10) { gameState = g_GAME_RUN; showCnt = 0; 22 } 23 g.setClip(0, 0, width, height); 24 } Mobile Programming
32
게임 시작 화면 제작 (6) 게임 시작 화면 처리 코드 draw_back() 메소드 메소드 추가 부분
메소드 추가 부분 draw_back() 메소드 01 public void draw_back(Graphics g) { 02 // 경계선( 상 하 ) 03 for(int i=0; i<width; i = BACK_IMG[4].getWidth()+i) { 04 g.drawImage(BACK_IMG[4], i, 44, Graphics.TOP | Graphics.LEFT); 05 g.drawImage(BACK_IMG[4], i, 244, Graphics.TOP | Graphics.LEFT); 06 } 07 // 경계선 가운데(가로) 08 for(int i=0; i< width; i = BACK_IMG[4].getWidth()+i) { g.drawImage(BACK_IMG[4], i, 144, Graphics.TOP | Graphics.LEFT); 10 } 11 g.setColor(181, 181, 255); 12 for(byte i=0; i<= width/10; i++) g.fillRect((10*i), 0, 5, 44); 13 for(byte i=0; i<= width/10; i++) g.fillRect((10*i), 248, 5, 43); 14 g.setColor(222, 222, 255); 15 for(byte i=0; i<= width/10; i++) g.fillRect((10*i)+5, 0, 5, 44); 16 for(byte i=0; i<= width/10; i++) g.fillRect((10*i)+5, 248, 5, 43); 17 g.drawImage(BACK_IMG[0], 1, 0, Graphics.TOP | Graphics.LEFT); 18 // hidden 19 if(hidden >= 0) 20 g.drawImage(BIGNUM_IMG[hidden], width/2-1, 3,Graphics.TOP | Graphics.HCENTER); 21 g.drawImage(SMALLNUM_IMG[stage/10], 28, 22, Graphics.TOP | Graphics.LEFT); g.drawImage(SMALLNUM_IMG[stage%10], 44, 22, Graphics.TOP | Graphics.LEFT); 23 // score 24 int tempX = 164; String str = Integer.toString(score); 26 if(str.length() < 5 ) { for(byte i=0; i< 5 - str.length(); i++) { Mobile Programming
33
게임 시작 화면 제작 (7) 게임 시작 화면 처리 코드 draw_back() 메소드 메소드 추가 부분
메소드 추가 부분 draw_back() 메소드 g.drawImage(SMALLNUM_IMG[0], tempX, 22, Graphics.TOP | Graphics.LEFT); tempX += 14; } 31 } 32 for(byte i=0; i< str.length(); i++) { int a = Integer.parseInt(str.substring(i, i+1)); g.drawImage(SMALLNUM_IMG[a], tempX, 22, Graphics.TOP | Graphics.LEFT); tempX += 14; 36 } 37 // time 38 g.drawImage(BACK_IMG[1], 1, 244, Graphics.TOP | Graphics.LEFT); 39 // life 40 g.drawImage(BACK_IMG[2], 1, height-1, Graphics.BOTTOM | Graphics.LEFT); 41 g.drawImage(SMALLNUM_IMG[life], BACK_IMG[2].getWidth()+4, height-8, Graphics.BOTTOM | Graphics.LEFT); 42 // hint 43 g.drawImage(BACK_IMG[3], BACK_IMG[2].getWidth()+4+SMALLNUM_IMG[life].getWidth()+6, height-2, Graphics.BOTTOM | Graphics.LEFT); 44 g.drawImage(SMALLNUM_IMG[hint], BACK_IMG[2].getWidth()+4+SMALLNUM_IMG[life].getWidth()+6+BACK_IMG[3].getWidth()+8, height-8, Graphics.BOTTOM | Graphics.HCENTER); 45 // power 46 g.drawImage(BACK_IMG[6], width-(BACK_IMG[6].getWidth()/2), height-4, Graphics.BOTTOM | Graphics.LEFT); 47 // image 48 g.drawImage(ORIGINAL_IMG,0, 48, Graphics.TOP | Graphics.LEFT); 49 g.drawImage(ORIGINAL_IMG,0, 148, Graphics.TOP | Graphics.LEFT); 50 } Mobile Programming
34
[예제 9-3] ReadyGoCanvas.java
게임 시작 화면 제작 (8) 001 import javax.microedition.lcdui.*; 002 import javax.microedition.media.*; 003 import java.io.*; 004 005 public class ReadyGoCanvas extends Canvas implements Runnable { private byte gameState; private Thread thread; private Player mPlayer; private boolean sound; private int width, height; /* Ready Go */ private int stage, life, score, hidden, hint; private int showCnt = 0; private int flow = 0; private Image readyGo_img; private Image BACK_IMG[] = null; private Image SMALLNUM_IMG[] = null; private Image BIGNUM_IMG[] = null; private Image ORIGINAL_IMG = null; 020 public ReadyGoCanvas( ) { width = getWidth( ); height = getHeight( ); [예제 9-3] ReadyGoCanvas.java Mobile Programming
35
[예제 9-3] ReadyGoCanvas.java
게임 시작 화면 제작 (9) try { readyGo_img = Image.createImage("/readyGo.png"); } catch (IOException e) { System.out.println("이미지 파일을 생성할 수 없습니다."); } commonGameInit( ); thread = new Thread(this); thread.start( ); // run( ) 호출 } public void run( ) { while(true) { try { Thread.sleep(200); } catch(InterruptedException e) { System.out.println(e); } repaint( ); // paint( ) 호출 } } public void paint(Graphics g) { if(flow <= 2) { draw_back(g); draw_readyGo(g); } } [예제 9-3] ReadyGoCanvas.java Mobile Programming
36
[예제 9-3] ReadyGoCanvas.java
게임 시작 화면 제작 (10) public void commonGameInit( ) { hint = 3; life = 3; hidden = 4; showCnt = 0; stage = 1; score = 0; BACK_IMG = createImg("back", 8); SMALLNUM_IMG = createImg("smallNum", 10); BIGNUM_IMG = createImg("bigNum", 5); ORIGINAL_IMG = createImg("original", "stage"); System.gc( ); } public void draw_readyGo(Graphics g) { showCnt++; if(showCnt < 5) { if(flow == 0) { soundPlay("ready"); flow = 1; } g.setClip(width/2-(readyGo_img.getWidth( )/2), height/2-16, readyGo_img.getWidth( ), readyGo_img.getHeight( )/2); g.drawImage(readyGo_img, width/2, height/2+16,Graphics.VCENTER|Graphics.HCENTER); } [예제 9-3] ReadyGoCanvas.java Mobile Programming
37
[예제 9-3] ReadyGoCanvas.java
게임 시작 화면 제작 (11) else if(showCnt < 10) { if(flow == 1) { soundPlay("go"); flow = 2; } g.setClip(width/2-(readyGo_img.getWidth( )/2), height/2-16, readyGo_img.getWidth( ), readyGo_img.getHeight( )/2); g.drawImage(readyGo_img, width/2, height/2-16, Graphics.VCENTER|Graphics.HCENTER); } else if(showCnt >= 10) { showCnt = 0; flow = 3; } g.setClip(0,0,width, height); } public void draw_back(Graphics g) { // 경계선(상하) for(int i=0; i< width; i = BACK_IMG[4].getWidth( )+i) { g.drawImage(BACK_IMG[4], i, 44, Graphics.TOP | Graphics.LEFT); g.drawImage(BACK_IMG[4], i, 244,Graphics.TOP | Graphics.LEFT); } // 경계선 가운데(가로) for(int i=0; i< width; i = BACK_IMG[4].getWidth( )+i) { g.drawImage(BACK_IMG[4], i, 144, Graphics.TOP|Graphics.LEFT); } [예제 9-3] ReadyGoCanvas.java Mobile Programming
38
[예제 9-3] ReadyGoCanvas.java
게임 시작 화면 제작 (12) g.setColor(181, 181, 255); for(byte i=0; i<= width/10; i++) g.fillRect((10*i), 0, 5, 44); for(byte i=0; i<= width/10; i++) g.fillRect((10*i), 248, 5, 43); g.setColor(222, 222, 255); 099 for(byte i=0; i<= width/10; i++) g.fillRect((10*i)+5, 0, 5, 44); for(byte i=0; i<= width/10; i++) g.fillRect((10*i)+5, 248, 5, 43); g.drawImage(BACK_IMG[0], 1, 0, Graphics.TOP|Graphics.LEFT); 103 // hidden if(hidden >= 0) g.drawImage(BIGNUM_IMG[hidden], width/2-1, 3, Graphics.TOP|Graphics.HCENTER); g.drawImage(SMALLNUM_IMG[stage/10], 28, 22, Graphics.TOP|Graphics.LEFT); g.drawImage(SMALLNUM_IMG[stage%10], 44, 22, Graphics.TOP|Graphics.LEFT); 109 // score int tempX = 164; String str = Integer.toString(score); if(str.length( ) < 5) { for(byte i=0; i< 5 - str.length( ); i++) { g.drawImage(SMALLNUM_IMG[0], tempX, 22, Graphics.TOP|Graphics.LEFT); tempX += 14; } } [예제 9-3] ReadyGoCanvas.java Mobile Programming
39
[예제 9-3] ReadyGoCanvas.java
게임 시작 화면 제작 (13) for(byte i=0; i< str.length( ); i++) { int a = Integer.parseInt(str.substring(i,i+1)); g.drawImage(SMALLNUM_IMG[a], tempX, 22, Graphics.TOP|Graphics.LEFT); tempX += 14; } // time g.drawImage(BACK_IMG[1], 1, 244, Graphics.TOP|Graphics.LEFT); // life g.drawImage(BACK_IMG[2], 1, height-1, Graphics.BOTTOM | Graphics.LEFT); g.drawImage(SMALLNUM_IMG[life], BACK_IMG[2].getWidth( )+4, height-8 , Graphics.BOTTOM|Graphics.LEFT); // hint g.drawImage(BACK_IMG[3], BACK_IMG[2].getWidth( )+ 4+SMALLNUM_IMG[life].getWidth( )+6, height-2, Graphics.BOTTOM|Graphics.LEFT); g.drawImage(SMALLNUM_IMG[hint], BACK_IMG[2].getWidth( )+4+ SMALLNUM_IMG[life].getWidth( )+6+BACK_IMG[3].getWidth( )+8, height-8, Graphics.BOTTOM|Graphics.HCENTER); // power g.drawImage(BACK_IMG[6], width-(BACK_IMG[6].getWidth( )/2), height-4, Graphics.BOTTOM|Graphics.LEFT); // image g.drawImage(ORIGINAL_IMG,0, 48, Graphics.TOP|Graphics.LEFT); g.drawImage(ORIGINAL_IMG,0, 148, Graphics.TOP|Graphics.LEFT); } [예제 9-3] ReadyGoCanvas.java Mobile Programming
40
[예제 9-3] ReadyGoCanvas.java
게임 시작 화면 제작 (14) public void soundPlay(String name) { soundStop( ); try { InputStream in = getClass( ).getResourceAsStream("/"+name+".wav"); mPlayer = Manager.createPlayer(in, "audio/x-wav"); mPlayer.start( ); } catch(Exception e) { } sound = true; } final public void soundStop( ) { if(mPlayer != null) { try { mPlayer.stop( ); mPlayer = null; sound = false; } catch(Exception e) { } } } public Image[] createImg(String add, int size) { Image img[] = null; try { img = new Image[size]; for(byte i=0; i<size; i++) img[i] = Image.createImage("/images/"+add+"/0"+i+".png"); [예제 9-3] ReadyGoCanvas.java Mobile Programming
41
[예제 9-3] ReadyGoCanvas.java
게임 시작 화면 제작 (15) } catch(Exception e) { System.out.println("Exception:" + e + "("+add+")"); } catch(OutOfMemoryError omError) { System.out.println(add + "out" + Runtime.getRuntime( ).freeMemory( )); } return img; } public Image createImg(String add, String name) { Image img = null; try { if(name.equals("stage")) img = Image.createImage("/images/"+add+"/stage"+stage+".png"); else img = Image.createImage ("/images/"+add+"/"+name+".png"); } catch(IOException e) { System.out.println(add+ " createImg 이미지 없다."); } catch (OutOfMemoryError omError) { System.out.println(add+ " out "); } return img; } 183 } [예제 9-3] ReadyGoCanvas.java Mobile Programming
Similar presentations