반응형
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 |
게임개발 |
1. 디폴트게임개발단계 |
6 |
게임제안 |
통신사에 개임을 제안한다. |
7 |
게임리뉴얼 |
제안후 변경사항이 있을 경우 리뉴얼작업 후 |
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
어플 구동시 화면에 표시되어야 함
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 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){}
}
}
}
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. 메모리 관리
- 변수 생성시 자바에서는 클래스 메모리로 32바이트(비트가 아닙니다.)가 생성되지만 static으로 생
성하면 8-16 사이로 생성 된다.
- 여기서 특이한 점은 변수 한개를 static으로 바꾸면 20바이트정도 여유가 생기지만 3개정도 바꾸면
150바이트 30개정도 바꾸면 4000바이트정도 메모리 사용량이 줄어든다.
*** 주의사항 ***
- 배열의 경우는 final, static을 사용시 용량이 늘어나는 경우가 있으니 가급적 사용하지 않음
- 배열의 경우는 final, static을 사용시 용량이 늘어나는 경우가 있으니 가급적 사용하지 않음
※ 변수를 붙여서 정의한다.
- int a; int b; int c; 보다 int a,b,c로 계속 이어서 정의하시면 여유 메모리가 늘어 난다.
※ 자바 최적화 툴을 사용한다.(가장 최고!)
장점 :
- SKVM같은 경우 속도가 GVM만큼 빨라진다.
- 메모리 사용량이 20-50K정도 여유가 생긴다.
- class 사이즈도 3-50k정도 줄어든다.
단점 :
- 상용화 툴이고 비싸다.
- 구하기 힘들다.
장점 :
- 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 |