모바일 게임 개발

Posted at 2009. 4. 14. 23:41 | Posted in 프로그래밍
모바일 게임 개발

반응형
1. 모바일 게임 플랫폼 종류
  • BREW 
    - C, C++ 을 기반으로 한 플랫폼   
      장점 : 속도가 빠르며 메모리 관리가 용이하다.  
      단점 : 플랫폼 지불 비용이 비싸다.
  • GVM&GNEX
    - C 를 기반으로 한 플랫폼
      장점 : 속도가 빠르며 메모리 관리가 용이하다.
      단점 : 상용화시 신지소프트사에 수입에 일정부분을 지불해야 한다.   
  • WIPI(C)
     - C, C++ 을 기반으로 한 플랫폼
       장점 : 속도가 빠르며 메모리 관리가 용이하다.
       단점 : 통신사에 WIPI(C)를 써야 하는 이유를 밝혀야 한다.
  • WIPI(JAVA)
    - JAVA 를 기반으로 한 플렛폼
       장점 : 플랫폼 비용이 들지 않는다.
       단점 : 메모리 관리가 어렵다.
                COD 컴파일을 해야 한다.
  • SK-VM, MIDP
    - JAVA 를 기반으로 한 플랫폼
      장점 : 플랫폼 비용이 들지 않는다.
      단점 : 속도가 느리고 메모리 관리가 어렵다.


2. 모바일 게임 개발 프로세스

 

개발순서

개발단계

내용

1

아이디어 제안

게임의 아이디어를 제안한다

2

팀구성

개발자, 디자이너로 팀구성을 한다.

3

기획단계

기획서

- 세부게임기획서 작성

이벤트제안

- 게임판매촉진을 위한 홍보방안

게임평가

- 제안된 게임의 게임성을 평가 보완점 작성

디자인컨셉

- 게임의 디자인 컨셉을 작성

프로젝트 계획서를 작성한다.

프로젝트의 개요, 대상타겟, 통신사, 기간 등을 작성

4

데모버젼 개발

(필요시)

게임성을 판독 가능한 데모버젼을 개발
통과 : 5번으로
불가 : 프로젝트 포기
수정 : 3번으로

5

게임개발

1. 디폴트게임개발단계
1-1.
내부 평가후 1차 리뉴얼
1-2.
클로즈/오픈 베타후 2차 리뉴얼
2.
디폴트완성 후 사이즈 작업

6

게임제안

통신사에 개임을 제안한다.

7

게임리뉴얼

제안후 변경사항이 있을 경우 리뉴얼작업 후
4
번으로

8

완료보고서작성

프로젝트 완료후 보고서를 작성한다.



3. 모바일 게임 필수 사이즈

 

SKT MIDP 완료 용량/힙 WIPI 완료 용량/힙
120 x 112

300/500 128 x 128


128 x 144

300/500 120 x 146


160 x 128

400/800 176 x 202


176 x 178

400/800 240 x 294


240 x 294

500/1M 320 x 220


320 x 240

500/1M



** 군별로 나눠진게 없으며 용량과 힙은 통신사에서 정한게 없기 때문에 보편적인 내용을 적은 것임. **
KTF BREW 완료
WIPI

120 x 117 1군(선택)
400/350 120 x 160 1군(필수) WIPI 1.0 800/1.1M
120 x 146 2군(선택)
400/500 176 x 220 2군(필수) WIPI 1.1 800/1.1M
120 x 146 3군(필수)
400/500 176 x 220 3군(필수) WIPI 1.2 800/1.1M
120 x 133 4군(선택)
400/500 240 x 320 4군(필수) WIPI 1.2 800/1.1M
176 x 202 5군(필수)
400/700 220 x 176 5군(선택) WIPI 1.2 800/1.1M
176 x 202 6군(선택)
400/700



BREW 의 힙과 용량은 통신사에서 정한게 없기 때문에 보편적인 내용을 적은 것이고 위피의 용량은 COD 컴파일후의 용량을 뜻함
LGT MIDP 완료
WIPI 완료
120 x 133 1군(선택)

120 x 143 1군(필수)
300/1M
120 x 133 2군(선택)
150/280 176 x 200 QCIF(선택)
500/1M
120 x 143 3군(필수)
300/350 240 x 290 QVGA(선택)
500/1M
176 x 200 4군(필수)
300/1M



240 x 290 5군(필수)
300/1M



위피의 용량은 COD 컴파일 후의 용량을 뜻함.


4. 모바일 게임 UI

 

1) 이용안내
    어플 구동시 화면에 표시되어야 함


2) 인트로

  ※ 인트로 페이지 작성시 ※

  이용등급표시 삽입(전체/12/15/18)
  반드시 영상등급위원회에서 권고한 이미지를 우측상단에 삽입


  WIPI : 네트워크 접속시 반드시 안테나 영역을 보여 주어야 함.




3) 메인메뉴

  ※ 메인메뉴 페이지 작성시 ※

  * 각메뉴 항목은 방향키로 이동가능하며 ez-i키와 숫자키로 선택가능하게 구현
  * 현재 포커스가 위치한 항목의 식별이 가능토록 함
     (네비게이션 이미지 사용 혹은 텍스트 색을 다르게 구성 등)
  * 메뉴 목록의 포커스는 사이클링 되어야 함 1>2>…7>1
  * 필수항목 : 게임시작/이어하기, 게임방법, 환경설정, 게임문의, 게임종료



메뉴명은 업체의 자율임(영문가능)

필수항목은 반드시 포함 되어야 함.
순서는 게임종료를 맨 하단에 둠 그외는 자율임
메뉴목록의 핫키는 협의를 통해 삭제할 수 있음
협의시 컨텐츠명, 스샷, 불가이유를 명시하여 업무지원 사이트 요청게시판에 협의요청

4) 게임 중 메뉴
    -화면에 키정보를 디스플레이 불가할 경우 기능 구현은 하고 게임방법에 명시하면 게임
      화면에서는 삭제 가능함.
    -게임중메뉴 호출시 배경음 정지되어야 함.
    -게임중메뉴가 호출되었을 때는 게임이 일시정지되어야 함.

  ※ 게임중메뉴 페이지 작성시 ※

  * 각메뉴 항목은 방향키로 이동가능하며 ez-i키와 숫자키로 선택가능하게 구현
  * 현재 포커스가 위치한 항목의 식별이 가능토록 함
     (네비게이션 이미지 사용 혹은 텍스트 색을 다르게 구성 등)
  * 메뉴 목록의 포커스는 사이클링 되어야 함 1>2>…7>1





5. 모바일 게임 개발 개요

 


  • 모든 MIDlet 응용프로그램은 javax.microedition.midlet.MIDlet class를 상속받아서 작성되어야한다. 
  • MIDlet은 위  그림처럼 3 가지  상태를  가지며  각  상태를  이동하기  위해 pauseApp()와 resumeApp(), startApp(), destroyApp()의 4가지 함수를 사용한다. 
  • 따라서 모든 Jlet App들은 이 4가지 함수를 전부 구현해야한다.


6. 모바일 게임 개발 소스

 

mport javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Display;

public class mainMIDlet extends MIDlet
{
     enginCanvas canvas;
     public Display display = null;

     public mainMIDlet() {}
 
 public void startApp()
 {
     display = Display.getDisplay(this);
 
     canvas = new enginCanvas(this);
 
     BackLight.on(0);
       
     display.setCurrent(canvas);
 }
// 프로그램의 일시적으로 정지시키는 경우에 호출됨
public void pauseApp()
 {
 }

// 프로그램이 종료하는 경우에 호출됨
 public void destroyApp(boolean parm1)
 {
 }
 
// 일시적으로 정지된 프로그램을 재개할 때 호출됨
 public void resumeApp()
 {
 }
}

import java.io.InputStream;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Image;
Import jvax.microedition.lcdui.Graphics;

public class enginCanvas extends Canvas implements Runnable
{
    mainMIDlet mmid;
    Thread thread;
 
    public static final int UP     = 141;
    public static final int LEFT    = 142;
    public static final int RIGHT    = 145;
    public static final int DOWN    = 146;
    public static final int FIRE    = 148;  //KEY_OK
    public static final int KEY_SOFTKEY1  = 129; //KEY_SOFTL
    public static final int KEY_OK    = 131; //KEY_SOFTR
    public static final int KEY_CLR   = 8;
   
    static int offWidth, offHeight, offWidth_half, offHeight_half;

 
    int mx=0, my=0;
    Image moveImage;
 
 public enginCanvas(mainMIDlet mmid)
 {
     this.mmid = mmid;
 
     offWidth = getWidth();
     offHeight = getHeight()+16;
 
     offWidth_half = offWidth >> 1;
     offHeight_half = offHeight >> 1;
 
  try
  {
     moveImage = Image.createImage("/img/move.png");
  }catch(Exception e){};
 
  thread = new Thread(this);
  thread.start();
 }
public void keyPressed(int keyCod)
 {
  if(keyCod == RIGHT || keyCod == KEY_NUM6)
  {
   mx+=5;
  }
  else if(keyCod == LEFT || keyCod == KEY_NUM4)
  {
   mx -= 5;
  }
  else if(keyCod == UP || keyCod == KEY_NUM2)
  {
   my -= 5;
  }
  else if(keyCod == DOWN || keyCod == KEY_NUM8)
  {
   my += 5;
  }
 }
 
 public void keyReleased(int keyCod){}
public void paint(Graphics g)
 { 
  g.setColor(0xffffff);
  g.fillRect(0,0,offWidth, offHeight);

  g.drawImage(moveImage, offWidth_half+mx, offHeight_half+my, Graphics.HCENTER|Graphics.VCENTER);
 }
 
 public void run()
 {
   while(true)
   {
    try
   {
    repaint(0,0,offWidth,offHeight);
    Thread.sleep(100);
   }
   catch (Exception ex){}
   }
 }
}


7. 메모리 관리

 

※ 모든 변수를 static으로 변환한다.
    - 변수 생성시 자바에서는 클래스 메모리로 32바이트(비트가 아닙니다.)가 생성되지만 static으로 생
      성하
면 8-16 사이로 생성 된다.

    - 여기서 특이한 점은 변수 한개를 static으로 바꾸면 20바이트정도 여유가 생기지만 3개정도 바꾸면
      150
바이트 30개정도 바꾸면 4000바이트정도 메모리 사용량이 줄어든다.


*** 주의사항 ***
     - 배열의 경우는 final, static을 사용시 용량이 늘어나는 경우가 있으니 가급적 사용하지 않음

 ※ 변수를 붙여서 정의한다.
    - int a; int b; int c; 보다 int a,b,c로 계속 이어서 정의하시면 여유 메모리가 늘어 난다.

 ※ 자바 최적화 툴을 사용한다.(가장 최고!)
    장점 :
        - SKVM같은 경우 속도가 GVM만큼 빨라진다.
        - 메모리 사용량이 20-50K정도 여유가 생긴다.
        - class 사이즈도 3-50k정도 줄어든다.
    단점 :
        - 상용화 툴이고 비싸다.
        - 구하기 힘들다.


8. J2ME 자바의 단점

 

  • 언어적인 측면에서 자바의 장점(객체지향 등)을 이용하지 못한다.
  • 메모리 사용량이 많고, 실행속도가 느리다
  • 가비지 컬렉션을 통한 메모리 관리는 임베디드 환경에 부적합하다
  • 크로스 플랫폼 호환성이 실제로는 유용하지 않다.

PS. 1. 이 내용이 PPT 로 필요하신 분이면 댓글로 메일을 남겨 주시면 보내 드리도록 하겠습니다.
     2. 이 문서는 2007년경 작성한 내용으로 문서내 규정사항이 변경되었을수 있습니다.




'프로그래밍' 카테고리의 다른 글

[C#]DataGridView Data를 Excel 파일로 저장(Export)  (22) 2010.01.14
[C#] Ping Test Code  (0) 2009.12.15
C# Content-Transfer-Encoding 설정 코드  (0) 2009.07.04
Effective C# 정리  (0) 2009.04.08