1 / 60

게임 API 프로그래밍

게임 API 프로그래밍. Lecture #12. 강의 목차. 모바일 게임 프로그래밍에 필요한 게임 API 의 개념을 이해한다 . 주요 게임 API 의 종류와 기본 사용법을 익힌다 . 게임 API 를 이용해 실제 게임 동작을 직접 구현해 본다. 게임 API 개요. 게임 API 클래스. GameCanvas 클래스 (1). GameCanvas 클래스 개요 게임용 사용자 인터페이스 제공 주요 제공 기능 Canvas( 명령 , 입력 이벤트 등 ) 에서 상속된 기능

izzy
Download Presentation

게임 API 프로그래밍

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 게임 API프로그래밍 Lecture #12

  2. 강의 목차 • 모바일 게임 프로그래밍에 필요한 게임 API의 개념을 이해한다. • 주요 게임 API의 종류와 기본 사용법을 익힌다. • 게임 API를 이용해 실제 게임 동작을 직접 구현해 본다. Mobile Programming

  3. 게임 API 개요 • 게임 API 클래스 Mobile Programming

  4. GameCanvas 클래스 (1) • GameCanvas 클래스 개요 • 게임용 사용자 인터페이스 제공 • 주요 제공 기능 • Canvas(명령, 입력 이벤트 등)에서 상속된 기능 • off-screen 그래픽 버퍼 기능 • 깜박임 현상 예방 • 키 상태 쿼리 기능 Mobile Programming

  5. GameCanvas 클래스 (2) • GameCanvas 클래스 생성자 • suppressKeyEvents • 일반 키 이벤트 기법의 억제 여부 결정 • suppressKeyEvents=true일 때 • 정의된 게임 키(UP, DOWN, LEFT, RIGHT, FIRE, 1, 3, 7, 9) • keyPressed, keyRepeated, keyReleased 메소드 호출 안함 • 시스템이 이벤트 처리 • 성능 향상 • suppressKeyEvents=false일 때 • 게임 키에 일반 키 이벤트 기법을 적용 • GameCanvas(boolean suppressKeyEvents) Mobile Programming

  6. GameCanvas 클래스 (3) • GameCanvas 클래스 메소드 Mobile Programming

  7. GameCanvas 클래스 (4) • flushGraphics() 메소드 • getGraphics() 메소드 • getKeyStates() 메소드 • paint() 메소드 • flushGraphics(int x, int y, int width, int height) • getGraphics( ) • getKeyStates( ) • paint(Graphics g) Mobile Programming

  8. GameCanvas 클래스 (5) • 볼 애니메이션 프로그램 상하 좌우 방향 키 클릭 (b) 시작 후 화면 (a) 초기 화면 Mobile Programming

  9. GameCanvas 클래스 (6) 01 import javax.microedition.midlet.*; 02 import javax.microedition.lcdui.*; 03 04 public class MyCanvasMIDlet extends MIDlet implements CommandListener { 05 private Display display; 06 private MyCanvas canvas; 07 private Command exit_cmd; 08 public MyCanvasMIDlet() { 09 exit_cmd = new Command("Exit", Command.EXIT, 1); 10 display = Display.getDisplay(this); 11 canvas = new MyCanvas(); 12 canvas.addCommand(exit_cmd); 13 canvas.setCommandListener(this); 14 } [예제 10-1] MyCanvasMIDlet.java Mobile Programming

  10. GameCanvas 클래스 (7) 15 public void startApp() { 16 display.setCurrent(canvas); 17 } 18 public void pauseApp() { } 19 public void destroyApp(boolean unconditional) { 20 if(canvas != null) { 21 canvas.stop(); 22 } 23 } 24 public void commandAction(Command cmd, Displayable disp) { 25 if(cmd == exit_cmd){ 26 destroyApp(true); 27 notifyDestroyed(); 28 } 29 } 30 } [예제 10-1] MyCanvasMIDlet.java Mobile Programming

  11. GameCanvas 클래스 (8) 01 import javax.microedition.lcdui.*; 02 03 class MyCanvas extends Canvas implements Runnable { 04 public static final int BALL_SIZE = 20; 05 private int ball_x; 06 private int ball_y; 07 private int move_x; 08 private int move_y; 09 private boolean running; 10 11 public MyCanvas(){ 12 ball_x = getWidth()/2; 13 ball_y = getHeight()/2; 14 move_x = 0; 15 move_y = 0; 16 running = true; 17 Thread t = new Thread(this); 18 t.start(); 19 } [예제 10-2] MyCanvas.java Mobile Programming

  12. GameCanvas 클래스 (9) 20 public void run(){ 21 while(running) { 22 bound_check(); 23 repaint(); 24 try { 25 Thread.sleep(200); 26 } catch(InterruptedException e) { 27 stop(); 28 } 29 } 30 } 31 public void paint(Graphics g) { 32 g.setColor(255, 255, 255); 33 g.drawRect(0, 0, getWidth(), getHeight()); 34 g.setColor(0, 255, 0); 35 ball_x += move_x; 36 ball_y += move_y; 37 g.fillArc(ball_x, ball_y, BALL_SIZE, BALL_SIZE, 0, 360); 38 } [예제 10-2] MyCanvas.java Mobile Programming

  13. GameCanvas 클래스 (10) 39 public void keyPressed(intkeycode) { 40 switch(getGameAction(keycode)) { 41 case LEFT: 42 move_x = -10; 43 move_y = 0; 44 break; 45 case RIGHT: 46 move_x = 10; 47 move_y = 0; 48 break; 49 case UP: 50 move_x = 0; 51 move_y = -10; 52 break; 53 case DOWN: 54 move_x = 0; 55 move_y = 10; 56 break; 57 default: 58 } 59 } [예제 10-2] MyCanvas.java Mobile Programming

  14. GameCanvas 클래스 (11) 60 private void bound_check() { 61 if(ball_x > getWidth()){ 62 ball_x = getWidth(); 63 } else if (ball_x < 0){ 64 ball_x = 0; 65 } 66 if(ball_y > getHeight()){ 67 ball_y = getHeight(); 68 } else if (ball_y < 0){ 69 ball_y = 0; 70 } 71 } 72 public void stop() { 73 running = false; 74 } 75 } [예제 10-2] MyCanvas.java Mobile Programming

  15. GameCanvas 클래스 (12) [예제 10-3] MyGameCanvas.java 01 import javax.microedition.lcdui.*; 02 import javax.microedition.lcdui.game.*; 03 04 class MyGameCanvas extends GameCanvas implements Runnable { 05 public static final int BALL_SIZE = 20; 06 private int ball_x; 07 private int ball_y; 08 private int move_x; 09 private int move_y; 10 private boolean running; 11 public MyGameCanvas() { 12 super(true); 13 ball_x = getWidth()/2; 14 ball_y = getHeight()/2; 15 move_x = 0; 16 move_y = 0; 17 running = true; 18 Thread t = new Thread(this); 19 t.start(); 20 } Mobile Programming

  16. GameCanvas 클래스 (13) [예제 10-3] MyGameCanvas.java 21 public void run() { 22 Graphics g = getGraphics(); 23 while(running) { 24 bound_check(); 25 g.setColor(255, 255, 255); 26 g.drawRect(0, 0, getWidth(), getHeight()); 27 g.setColor(0, 255, 0); 28 ball_x += move_x; 29 ball_y += move_y; 30 g.fillArc(ball_x, ball_y, BALL_SIZE, BALL_SIZE, 0, 360); 31 flushGraphics(); 32 intkeyStates = getKeyStates(); 33 if((keyStates & LEFT_PRESSED)!= 0) { 34 move_x = -10; 35 move_y = 0; 36 } else if((keyStates & RIGHT_PRESSED) != 0) { 37 move_x = 10; 38 move_y = 0; 39 } else if((keyStates & UP_PRESSED) != 0) { 40 move_x = 0; 41 move_y = -10; 42 } else if((keyStates & DOWN_PRESSED) != 0) { 43 move_x = 0; 44 move_y = 10; 45 } Mobile Programming

  17. GameCanvas 클래스 (14) 46 try { 47 Thread.sleep(200); 48 } catch(InterruptedException e) { 49 stop(); 50 } 51 } 52 } 53 private void bound_check() { 54 if(ball_x > getWidth()) { 55 ball_x = 0; 56 } else if (ball_x < 0) { 57 ball_x = getWidth(); 58 } 59 if(ball_y > getHeight()) { 60 ball_y = 0; 61 } else if(ball_y < 0){ 62 ball_y = getHeight(); 63 } 64 } 65 public void stop() { 66 running = false; 67 } 68 } [예제 10-3] MyGameCanvas.java Mobile Programming

  18. GameCanvas 클래스 (15) • MyCanvas 클래스와 MyGameCanvas 클래스의 차이 Mobile Programming

  19. GameCanvas 클래스 (16) • MyCanvas 클래스와 MyGameCanvas 클래스 비교 Thread Thread While 문 While 문 • Graphics( ); • ► flushGraphics( ); • getKeyStates( ); • Thread.sleep • repaint( ); • Thread.sleep paint( ) keyPressed( ) Mobile Programming

  20. Layer 클래스 (1) • Layer • 여러 이미지가 하나로 결합 • Layer로 이미지를 중첩한 화면 예 Mobile Programming

  21. Layer 클래스 (2) • Layer 클래스 • 각 레이어의 위치, 너비, 높이, 표시 여부를 선택할 수 있는 메소드 제공 Mobile Programming

  22. LayerManager 클래스 (1) • LayerManager 클래스 • 그래픽 레이어 관리 • 레이어를 추가, 삽입, 삭제, 유지, 관리하는 메소드 제공 • 레이어 순서 • Z축을 기준으로 추가(Append)할 때마다 0부터 1씩 증가 • 0은 사용자에게 가장 가까운 레이어 • 숫자가 높을수록 멀어진다. • 레이어 2인 sky.png를 레이어 0으로 만드는 경우 • hany.png, background_tiles 이미지 • 화면에 보이지 않음 • 하늘 이미지만 화면에 나타남 Mobile Programming

  23. LayerManager 클래스 (2) • 보기창 • 화면에 표시될 영역의 크기 • 좌표계 위치 조정 • setViewWindow() 메소드 • 화면에 출력되는 영역과 크기 설정 • setViewWindow(int x, int y, int width, int height) • x : LayerManager의 원점에서 상대적인 보기 창의 수평 위치 • y : LayerManager의 원점에서 상대적인 보기 창의 수직 위치 • width : 보기 창의 넓이 • height : 보기 창의 높이 Mobile Programming

  24. LayerManager 클래스 (3) • 보기창 • g : getGraphics() 메소드로 얻은 Graphics 객체 • x : Graphics의 변환 원점에서 상대적인 보기 창을 렌더링할 수평 위치 • y : Graphics의 변환 원점에서 상대적인 보기 창을 렌더링할 수직 위치 • paint(Graphics g, int x, int y) Mobile Programming

  25. LayerManager 클래스 (4) 01 import java.io.IOException; 02 import javax.microedition.lcdui.*; 03 import javax.microedition.lcdui.game.*; 04 05 class LayerManagerTest extends GameCanvas implements Runnable { 06 private LayerManagerlayer_manager; 07 private TiledLayerbg_img; 08 public LayerManagerTest() throws IOException { 09 super(true); 10 layer_manager.new LayerManager(); 11 layer_manager.setViewWindow(96, 0, w, h); 12 createBackground("/background_tiles.png"); 13 Thread t = new Thread(this); 14 t.start(); 15 } 16 private void createBackground(String background_img_file) throws IOException { 17 Image background = Image.createImage(background_img_file); 18 int[] map = { 19 0, 0, 0, 0, 0, 8, 0, 0, 20 1, 2, 0, 0, 8, 0, 0, 0, 21 3, 3, 2, 0, 0, 0, 5, 0, 22 3, 3, 3, 2, 4, 1, 3, 2, 23 6, 6, 6, 6, 6, 6, 6, 6, 24 6, 6, 6, 6, 6, 6, 6, 6 25 }; [예제 10-4] LayerManagerTest.java Mobile Programming

  26. LayerManager 클래스 (5) 26 bg_img = new TiledLayer(8, 6, background, 48, 48); 27 bg_img.setPosition(0, 0); 28 for(int i = 0; i < map.length; i++) { 29 int column = i % 8; 30 int row = (i - column) / 8; 31 bg_img.setCell(column, row, map[i]); 32 } 33 layer_manager.append(bg_img); 34 } 35 public void run() { 36 int w = getWidth(); 37 int h = getHeight(); 38 Graphics g = getGraphics(); 39 while (true) { 40 g.setColor(0xffffff); 41 g.fillRect(0, 0, w, h); 42 layer_manager.paint(g, 20, 20); 43 flushGraphics(); 44 try { 45 Thread.sleep(80); } 46 catch(InterruptedException ie) { } 47 } 48 } 49 } [예제 10-4] LayerManagerTest.java Mobile Programming

  27. LayerManager 클래스 (6) • 레이어 순서 • Z축을 기준으로 0부터 순차적으로 증가 • 색인 값이 가장 높은 레이어 • 사용자에게서 가장 멀리 있는 레이어 • 색인이 0인 레이어 • 사용자에게서 가장 가까이 위치 Y축 Layer 0 X축 Layer 1 Layer 2 Z축 Mobile Programming

  28. LayerManager 클래스 (7) • append() 메소드 • I : 추가되는 Layer • insert() 메소드 • I : 삽입되는 Layer • index : 새 Layer가 삽입되는 위치 • remove() 메소드 • I : 제거되는 Layer • public void append(Layer I) • public void insert(Layer I, int index) • public void remove(Layer I) Mobile Programming

  29. LayerManager 클래스 (7) • append() 메소드를 이용하여 레이어를 추가하는 방법 • 예제 10-5 참조 • 실행 결과 Mobile Programming

  30. LayerManager 클래스 (8) 01 import java.io.IOException; 02 import javax.microedition.lcdui.*; 03 import javax.microedition.lcdui.game.*; 04 class LayerManagerAppend extends GameCanvas implements Runnable { 05 private LayerManagerlayer_manager; 06 private TiledLayersky_img; 07 private TiledLayerbg_img; 08 private intani_idx; 09 private Sprite hany_img; 10 public LayerManagerAppend() throws IOException { 11 super(true); 12 layer_manager = new LayerManager(); 13 int w = getWidth(); 14 int h = getHeight(); 15 layer_manager.setViewWindow(96, 0, w, h); 16 createHany("/hanys.png"); 17 createBackground("/background_tiles.png"); 18 createSky("/sky.png"); 19 Thread t = new Thread(this); 20 t.start(); 21 } [예제 10-5] LayerManagerAppend.java Mobile Programming

  31. LayerManager 클래스 (9) 22 private void createHany(String hany_img_file) throws IOException { 23 Image hany = Image.createImage(hany_img_file); 24 hany_img = new Sprite(hany, 48, 48); 25 hany_img.setPosition(96 + (getWidth() - 48) / 2, 197); 26 layer_manager.append(hany_img); 27 } 28 private void createBackground(String background_img_file) throws IOException { 29 Image background = Image.createImage(background_img_file); 30 int[] map = { 31 0, 0, 0, 0, 0, 0, 0, 0, 32 1, 2, 0, 0, 0, 0, 0, 0, 33 3, 3, 2, 0, 0, 0, 5, 0, 34 3, 3, 3, 2, 4, 1, 3, 2, 35 6, 6, 6, 6, 6, 6, 6, 6, 36 6, 6, 6, 6, 6, 6, 6, 6 37 }; 38 bg_img = new TiledLayer(8, 6, background, 48, 48); 39 bg_img.setPosition(0, 0); 40 for (inti = 0; i < map.length; i++) { 41 int column = i % 8; 42 int row = (i - column) / 8; 43 bg_img.setCell(column, row, map[i]); 44 } [예제 10-5] LayerManagerAppend.java Mobile Programming

  32. LayerManager 클래스 (10) 45 ani_idx = bg_img.createAnimatedTile(8); 46 bg_img.setCell(4, 1, ani_idx); 47 bg_img.setCell(5, 0, ani_idx); 48 layer_manager.append(bg_img); 49 } 50 private void createSky(String sky_img_file) throws IOException { 51 Image sky = Image.createImage(sky_img_file); 52 sky_img = new TiledLayer(1, 1, sky, 53 sky.getWidth(), sky.getHeight()); 54 sky_img.fillCells(0, 0, 1, 1, 1); 55 sky_img.setPosition(0, 0); 56 layer_manager.append(sky_img); 57 } 58 public void run() { 59 int w = getWidth(); 60 int h = getHeight(); 61 Graphics g = getGraphics(); 62 while (true) { 63 g.setColor(0xffffff); 64 g.fillRect(0, 0, w, h); 65 layer_manager.paint(g, 0, 0); 66 flushGraphics(); 67 try { 68 Thread.sleep(80); 69 } catch (InterruptedExceptionie) {} 70 } 71 } 72 } [예제 10-5] LayerManagerAppend.java Mobile Programming

  33. Sprite 클래스 (1) • Sprite 클래스 • 하나의 이미지로 저장된 여러 프레임을 같은 크기의 프레임으로 분리하여 애니메이션 효과를 제공 • setFrame(), setPosition() 등의 메소드 이용 • 주요 기능 • 애니메이션 • 회전/대칭 • 충돌 체크 • Sprite 클래스 생성자 Mobile Programming

  34. Sprite 클래스 (2) • Sprite 클래스 메소드 Mobile Programming

  35. Sprite 클래스 (3) • 애니메이션 적용하기 • 프레임 여러 개로 구성된 하나의 이미지 파일 • 예제 10-6 참조 Mobile Programming

  36. Sprite 클래스 (4) 01 import javax.microedition.lcdui.*; 02 import javax.microedition.lcdui.game.*; 03 import java.io.IOException; 04 class SpriteSkiingCanvas extends GameCanvas implements Runnable { 05 private Sprite skiing; 06 private Image skiing_img; 07 private int skiing_img_idx; 08 private boolean running; 09 public SpriteSkiingCanvas() { 10 super(true); 11 try { 12 skiing_img = Image.createImage("/animation.png"); 13 } catch (IOException e){ 14 System.out.println("We can't read Image file"); 15 } 16 skiing = new Sprite(skiing_img, 66, 54); 17 running = true; 18 skiing_img_idx = 0; 19 Thread t = new Thread(this); 20 t.start(); 21 } [예제 10-6] SpriteSkiingCanvas.java Mobile Programming

  37. Sprite 클래스 (5) 22 public void run(){ 23 Graphics g = getGraphics(); 24 while(running) { 25 play_skiing(); 26 draw_skiing(g); 27 try { 28 Thread.sleep(200); 29 } catch(InterruptedException e) { 30 stop(); 31 } 32 } 33 } 34 private void play_skiing() { 35 skiing_img_idx = (skiing_img_idx + 1) % 10; 36 skiing.setFrame(skiing_img_idx); 37 skiing.setPosition(getWidth()/2, getHeight()/2); 38 } 39 private void draw_skiing(Graphics g) { 40 skiing.paint(g); 41 flushGraphics(); 42 } 43 public void stop() { 44 running = false; 45 } 46 } [예제 10-6] SpriteSkiingCanvas.java Mobile Programming

  38. Sprite 클래스 (6) • 객체 회전시키기 • Sprite 클래스 • 객체를 회전, 대칭시키는 메소드 제공 • setTransform(transform) • 90도의 배수로 회전또는 대칭 변환 가능 • setTransform(transform)에 적용할 수 있는 변환 종류 Mobile Programming

  39. Sprite 클래스 (7) • Sprite 변환 예 • 예제 10-7 참조 Mobile Programming

  40. Sprite 클래스 (8) [예제 10-7] SpriteTransCanvas.java 01 import javax.microedition.lcdui.*; 02 import javax.microedition.lcdui.game.*; 03 import java.io.IOException; 04 05 class SpriteTransCanvas extends GameCanvas implements Runnable { 06 private Sprite hany; 07 String trans_info = ""; 08 private Image hany_img; 09 private boolean running; 10 intarray_idx =0; 11 intmirror_idx =0; 12 private static final int [] transformArray = { 13 Sprite.TRANS_NONE, 14 Sprite.TRANS_ROT90, 15 Sprite.TRANS_ROT180, 16 Sprite.TRANS_ROT270 17 }; 18 private static final int [] transMirrorArray = { 19 Sprite.TRANS_MIRROR, 20 Sprite.TRANS_MIRROR_ROT90, 21 Sprite.TRANS_MIRROR_ROT180, 22 Sprite.TRANS_MIRROR_ROT270 23 }; Mobile Programming

  41. Sprite 클래스 (9) • 24 String transForm[] = new String[]{"Sprite.TRANS_NONE", • 25 "Sprite.TRANS_ROT90", • 26 "Sprite.TRANS_ROT180", • 27 "Sprite.TRANS_ROT270"}; • 28 String transMirror[] = new String[]{"Sprite.TRANS_MIRROR", • 29 "Sprite.TRANS_MIRROR_ROT90", • 30 "Sprite.TRANS_MIRROR_ROT180", • 31 "Sprite.TRANS_MIRROR_ROT270"}; • 32 public SpriteTransCanvas() { • 33 super(true); • 34 try { • 35 hany_img = Image.createImage("/hany.png"); • 36 } catch (IOException e){ • 37 System.out.println("We can't read Image file"); • 38 } • 39 hany = new Sprite(hany_img, 33, 40); • 40 running = true; • 41 play_hany(); • 42 Thread t = new Thread(this); • 43 t.start(); • } [예제 10-7] SpriteTransCanvas.java Mobile Programming

  42. Sprite 클래스 (10) 45 public void run() { 46 Graphics g = getGraphics(); 47 while(running) { 48 int keyStates = getKeyStates(); 49 if((keyStates & LEFT_PRESSED)!= 0) { 50 array_idx++; 51 array_idx = array_idx%4; 52 hany.setTransform(transformArray[array_idx]); 53 trans_info = transForm[array_idx]; 54 } else if((keyStates & RIGHT_PRESSED) != 0) { 55 if(array_idx == 0 ) array_idx = 3; 56 else array_idx--; 57 array_idx = array_idx%4; 58 hany.setTransform(transformArray[array_idx]); 59 trans_info = transForm[array_idx]; 60 } else if((keyStates & UP_PRESSED) != 0) { 61 mirror_idx++; 62 mirror_idx = mirror_idx%4; 63 hany.setTransform(transMirrorArray[mirror_idx]); 64 trans_info = transMirror[mirror_idx]; 65 } else if((keyStates & DOWN_PRESSED) != 0) { 66 if(mirror_idx == 0) mirror_idx = 3; 67 else mirror_idx--; 68 mirror_idx = mirror_idx %4; 69 hany.setTransform(transMirrorArray[mirror_idx]); [예제 10-7] SpriteTransCanvas.java Mobile Programming

  43. Sprite 클래스 (11) 70 trans_info = transMirror[mirror_idx]; 71 } 72 draw_hany(g); 73 try { 74 Thread.sleep(200); 75 } catch(InterruptedException e) { 76 stop(); 77 } 78 } 79 } 80 private void play_hany() { 81 hany.setTransform(Sprite.TRANS_NONE); 82 hany.setPosition(getWidth()/2, getHeight()/2); 83 } 84 private void draw_hany(Graphics g) { 85 g.setColor(255, 255, 255); 86 g.fillRect(0, 0, getWidth(), getHeight()); 87 g.setColor(0, 0, 0); 88 g.drawString(trans_info, 70, 200, Graphics.TOP | Graphics.LEFT); 89 hany.paint(g); 90 flushGraphics(); 91 } 92 public void stop(){ 93 running = false; 94 } 95 } [예제 10-7] SpriteTransCanvas.java Mobile Programming

  44. Sprite 클래스 (12) • 충돌 체크하기 • 충돌 체크 방법 • 직사각형 교차 충돌 • 픽셀 수준 충돌 Mobile Programming

  45. Sprite 클래스 (13) • 충돌 체크 관련 메소드 Mobile Programming

  46. Sprite 클래스 (14) • 충돌 체크 관련 메소드 • x : 변환되지 않은 Sprite의 좌측 모서리에서 충돌 직사각형의 수평 위치 • y : 변환되지 않은 Sprite의 상단 모서리에서 충돌 직사각형의 수직 위치 • width : 충돌 직사각형의 너비 • height : 충돌 직사각형의 높이 • image : 충돌을 체크할 Image • x : Image 좌측 상단 모서리의 수평 위치 • y : Image 좌측 상단 모서리의 수직 위치 • pixelLevel : 픽셀 단위로 충돌을 체크하려면 true, 단순한 경계 검사를 사용하여 체크하려면 false를 지정 • 반환 값 : Sprite가 Image와 충돌하면 true, 그렇지 않으면 false를 반환 • public void defineCollisionRectangle(int x, int y, int width, int height) • public final booleancollidesWith(Image image, int x, int y, booleanpixelLevel) Mobile Programming

  47. Sprite 클래스 (15) • 충돌 체크 관련 메소드 • s : 충돌을 체크할 Sprite • pixelLevel : 픽셀 단위로 충돌을 체크하려면 true, 간단한 경계 검사를 체크하려면 false를 정의 • 반환 값 : 두 Sprite가 충돌하면 true, 그렇지 않으면 false를 반환 • t : 충돌을 체크할 TiledLayer • pixelLevel : 픽셀 단위로 충돌을 체크하려면 true, 비어 있지 않은 셀의 간단한 경계를 체크하려면 false를 정의 • 반환 값 : 이 Sprite가 TiledLayer와 충돌하면 true, 그렇지 않으면 false를 반환 • public final booleancollidesWith(Sprite s, booleanpixelLevel) • public final booleancollidesWith(TiledLayer t, booleanpixelLevel) Mobile Programming

  48. Sprite 클래스 (16) • 충돌 체크 프로그램 Mobile Programming

  49. Sprite 클래스 (17) [예제 10-8] SpriteCollisionCanvas.java 01 import javax.microedition.lcdui.*; 02 import javax.microedition.lcdui.game.*; 03 import java.io.IOException; 04 05 class SpriteCollisionCanvas extends GameCanvas implements Runnable { 06 private MySprite rocket; 07 private MySprite stone; 08 private Image rocket_img; 09 private Image stone_img; 10 private intimg_idx; 11 private boolean running; 12 private final int MOVEING_SIZE = 5; 13 private LayerManagerlayerManager; 14 15 private boolean colliding = false; 16 17 public SpriteCollisionCanvas() { 18 super(true); 19 layerManager = new LayerManager(); 20 try { 21 rocket_img = Image.createImage("/rocket.png"); 22 stone_img = Image.createImage("/stone.png"); Mobile Programming

  50. Sprite 클래스 (18) 23 } catch (IOException e){ 24 System.out.println("We can't read Image file"); 25 } 26 rocket = new MySprite(rocket_img, 32, 32, getWidth(), getHeight()); 27 layerManager.append(rocket); 28 stone = new MySprite(stone_img, 24, 24, getWidth(), getHeight()); 29 layerManager.append(stone); 30 } 31 public void start() { 32 rocket.setRefPixelPosition(getWidth()/2, getHeight()/2); 33 stone.setRefPixelPosition(getWidth()/2, getHeight()/2); 34 rocket.setDirection(0, -MOVEING_SIZE); 35 running = true; 36 img_idx = 0; 37 Thread t = new Thread(this); 38 t.start(); 39 } 40 public void stop() { 41 running = false; 42 } 43 public void run() { 44 Graphics g = getGraphics(); [예제 10-8] SpriteCollisionCanvas.java Mobile Programming

More Related