|
MID 프로필 | ||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES All Classes | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--javax.microedition.lcdui.Displayable | +--javax.microedition.lcdui.Canvas | +--javax.microedition.lcdui.game.GameCanvas
GameCanvas 클래스는 게임 사용자 인터페이스 기반을 제공합니다. Canvas(명령, 입력 이벤트 등)로부터 상속된 기능 이외에 오프스크린 그래픽 버퍼 및 키 상태 쿼리 기능 같은 게임 관련 기능도 제공합니다.
각 GameCanvas 인스턴스에 대해 전용 버퍼가 만들어집니다. 각 GameCanvas 인스턴스에 대해 고유한 버퍼가 제공되므로 힙 사용을 최소화하기 위해 단일 GameCanvas 인스턴스를 다시 사용하는 것이 좋습니다. 개발자는 GameCanvas 인스턴스로부터 얻은 Graphics 객체에 대한 호출에 의해서만 이 버퍼의 내용이 수정된다고 가정할 수 있습니다. 다른 MIDlet이나 시스템 수준 알림 같은 외부 소스에 의해서는 수정되지 않습니다. 버퍼는 초기에 흰색 픽셀로 채워집니다.
버퍼 크기는 GameCanvas의 최대 치수로 설정됩니다.
하지만 플러시가 요청되면 플러시될 영역은 GameCanvas의 현재
치수(티커, 명령 등의 존재 여부에 따라)의 제한을 받습니다.
GameCanvas의 현재 치수는
getWidth
와
getHeight
를
호출하여 얻을 수 있습니다.
게임은 게임 루프를 실행하기 위해 고유 스레드를 제공합니다.
일반 루프는 입력을 검사하고 게임 논리를 구현한 다음 업데이트된 사용자
인터페이스를 렌더링합니다. 다음 코드는 일반 게임 루프의
구조를 설명합니다.
// Get the Graphics object for the off-screen buffer
Graphics g = getGraphics();
while (true) {
// Check user input and update positions if necessary
int keyState = getKeyStates();
if ((keyState & LEFT_PRESSED) != 0) {
sprite.move(-1, 0);
}
else if ((keyState & RIGHT_PRESSED) != 0) {
sprite.move(1, 0);
}
// Clear the background to white
g.setColor(0xFFFFFF);
g.fillRect(0,0,getWidth(), getHeight());
// Draw the Sprite
sprite.paint(g);
// Flush the off-screen buffer
flushGraphics();
}
Field Summary | |
static int |
DOWN_PRESSED
DOWN 키를 나타내는 비트. |
static int |
FIRE_PRESSED
FIRE 키를 나타내는 비트. |
static int |
GAME_A_PRESSED
GAME_A 키를 나타내는 비트(일부 장치에서 지원하지 않을 수 있음). |
static int |
GAME_B_PRESSED
GAME_B 키를 나타내는 비트(일부 장치에서 지원하지 않을 수 있음). |
static int |
GAME_C_PRESSED
GAME_C 키를 나타내는 비트(일부 장치에서 지원하지 않을 수 있음). |
static int |
GAME_D_PRESSED
GAME_D 키를 나타내는 비트(일부 장치에서 지원하지 않을 수 있음). |
static int |
LEFT_PRESSED
LEFT 키를 나타내는 비트. |
static int |
RIGHT_PRESSED
RIGHT 키를 나타내는 비트. |
static int |
UP_PRESSED
UP 키를 나타내는 비트. |
Fields inherited from class javax.microedition.lcdui.Canvas |
DOWN, FIRE, GAME_A, GAME_B, GAME_C, GAME_D, KEY_NUM0, KEY_NUM1, KEY_NUM2, KEY_NUM3, KEY_NUM4, KEY_NUM5, KEY_NUM6, KEY_NUM7, KEY_NUM8, KEY_NUM9, KEY_POUND, KEY_STAR, LEFT, RIGHT, UP |
Constructor Summary | |
protected |
GameCanvas(boolean suppressKeyEvents)
GameCanvas의 새 인스턴스를 만듭니다. |
Method Summary | |
void |
flushGraphics()
오프스크린 버퍼를 디스플레이에 플러시합니다. |
void |
flushGraphics(int x,
int y,
int width,
int height)
오프스크린 버퍼의 지정된 영역을 디스플레이로 플러시합니다. |
protected Graphics |
getGraphics()
GameCanvas를 렌더링하기 위한 Graphics 객체를 얻습니다. |
int |
getKeyStates()
물리적 게임 키의 상태를 가져옵니다. |
void |
paint(Graphics g)
이 GameCanvas를 그립니다. |
Methods inherited from class javax.microedition.lcdui.Canvas |
getGameAction, getHeight, getKeyCode, getKeyName, getWidth, hasPointerEvents, hasPointerMotionEvents, hasRepeatEvents, hideNotify, isDoubleBuffered, keyPressed, keyReleased, keyRepeated, pointerDragged, pointerPressed, pointerReleased, repaint, repaint, serviceRepaints, setFullScreenMode, showNotify, sizeChanged |
Methods inherited from class javax.microedition.lcdui.Displayable |
addCommand, getTicker, getTitle, isShown, removeCommand, setCommandListener, setTicker, setTitle |
Methods inherited from class java.lang.Object |
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Field Detail |
public static final int UP_PRESSED
0x0002
(1 << Canvas.UP)입니다.
public static final int DOWN_PRESSED
0x0040
(1 << Canvas.DOWN)입니다.
public static final int LEFT_PRESSED
0x0004
(1 << Canvas.LEFT)입니다.
public static final int RIGHT_PRESSED
0x0020
(1 << Canvas.RIGHT)입니다.
public static final int FIRE_PRESSED
0x0100
(1 << Canvas.FIRE)입니다.
public static final int GAME_A_PRESSED
0x0200
(1 << Canvas.GAME_A)입니다.
public static final int GAME_B_PRESSED
0x0400
(1 << Canvas.GAME_B)입니다.
public static final int GAME_C_PRESSED
0x0800
(1 << Canvas.GAME_C)입니다.
public static final int GAME_D_PRESSED
0x1000
(1 << Canvas.GAME_D)입니다.
Constructor Detail |
protected GameCanvas(boolean suppressKeyEvents)
개발자가 getKeyStates 메소드를 사용하여 키 상태만 쿼리하면 되는 경우 이 GameCanvas가 표시되는 동안 게임 키에 대해 표준 키 이벤트 기법을 억제할 수 있습니다. 응용 프로그램에서 필요한 경우가 아니라면 키 이벤트 억제는 keyPressed, keyRepeated 및 keyReleased 메소드에 대한 불필요한 시스템 호출을 제거하여 성능을 향상시킬 수 있습니다.
요청하는 경우 GameCanvas가 표시되면(showNotify가 호출되면) 지정된 GameCanvas에 대한 키 이벤트 억제가 시작되며, 숨겨지면(hideNotify가 호출되면) 중지됩니다. 화면 표시 및 숨기기는 이벤트 대기열을 사용하여 일련화되므로 이러한 정렬은 억제가 해당 GameCanvas용 키 이벤트에 대해서만 영향을 미치도록 합니다. 따라서 다른 화면이 아직 표시되는 동안 키 이벤트가 생성된 경우 해당 화면이 숨겨지고 GameCanvas로 대체될 때까지 이러한 키 이벤트는 계속 대기열에 있으며 디스패치됩니다.
정의된 게임 키(UP, DOWN, FIRE 등)에 대해서만 키 이벤트가 억제되고 다른 모든 키에 대해서는 항상 키 이벤트가 생성됩니다.
suppressKeyEvents
- 게임 키에 대해 일반 키 이벤트 기법을 억제하는 경우 true
,
그렇지 않은 경우 false
Method Detail |
protected Graphics getGraphics()
flushGraphics()가 호출될 때까지 렌더링 작업은 디스플레이에 나타나지 않습니다. 플러시 작업의 결과로 픽셀이 지워지지 않으므로 버퍼 플러시로 인해 버퍼 내용이 변경되지 않습니다.
이 메소드를 호출할 때마다 새 Graphics 객체가 만들어져 반환됩니다. 따라서 게임이 시작되기 전에 필요한 Graphics 객체를 가져와서 게임이 실행 중일 때 다시 사용해야 합니다. 각 GameCanvas 인스턴스에 대해 제공된 모든 그래픽 객체는 같은 오프스크린 버퍼로 렌더링됩니다.
새로 만든 Graphics 객체에는 다음 특성이 있습니다.
Font.getDefaultFont()
에서 반환된 글꼴과 같습니다.
SOLID
입니다.
flushGraphics()
,
flushGraphics(int, int, int, int)
public int getKeyStates()
예를 들면 다음과 같습니다.
// Get the key state and store it
int keyState = getKeyStates();
if ((keyState & LEFT_KEY) != 0) {
positionX--;
}
else if ((keyState & RIGHT_KEY) != 0) {
positionX++;
}
이 메소드를 호출하면 래치된 상태를 지우는 부작용이 생깁니다. 따라서 이전 호출 바로 다음에 다른 getKeyStates를 호출하면 시스템에서 키의 현재 상태를 가장 잘 파악하여 보고하며 래치된 비트는 첫 번째 호출에 의해 지워집니다.
일부 장치는 키패드 하드웨어를 직접 쿼리하지 못할 수 있으므로 대신 키 눌렀다 놓기 이벤트를 모니터하여 이 메소드를 구현할 수 있습니다. 따라서 키 정보의 적시성은 각 장치의 기능에 따라 달라지므로 getKeyStates에서 보고한 상태는 물리적 키의 실제 상태를 지연시킬 수 있습니다. 또한 일부 장치는 여러 키를 동시에 누르는 것을 감지하지 못할 수도 있습니다.
Displayable.isShown()
에서
보고한 대로 GameCanvas가 현재 표시되어 있지 않은 경우
이 메소드는 0을 반환합니다. GameCanvas는 표시되자 마자
최초로 모든 키가 눌러지지 않았음(0)을 표시합니다.
GameCanvas가 표시되는 동안 키를 누르면 GameCanvas에서 키 누름을
보고하기 위해 키를 먼저 놓은 다음 눌러야 합니다.
UP_PRESSED
,
DOWN_PRESSED
,
LEFT_PRESSED
,
RIGHT_PRESSED
,
FIRE_PRESSED
,
GAME_A_PRESSED
,
GAME_B_PRESSED
,
GAME_C_PRESSED
,
GAME_D_PRESSED
public void paint(Graphics g)
paint
in class Canvas
g
- 화면을 렌더링할 때 사용할 Graphics 객체.
NullPointerException
- g
가 null
인 경우public void flushGraphics(int x, int y, int width, int height)
지정된 영역이 GameCanvas의 현재 범위를 초과하지 않는 경우 교차 영역만 플러시됩니다. 지정된 너비나 높이가 1보다 작은 경우에는 픽셀이 플러시되지 않습니다.
GameCanvas가 현재 표시되지 않거나 시스템이 사용 중이라 플러시 요청을 적용할 수 없는 경우 이 메소드는 어떤 작업도 수행하지 않고 바로 반환합니다.
x
- 플러시되는 영역의 왼쪽 가장자리y
- 플러시되는 영역의 위쪽 가장자리width
- 플러시되는 영역의 너비height
- 플러시되는 영역의 높이flushGraphics()
public void flushGraphics()
GameCanvas가 현재 표시되지 않거나 시스템이 사용 중이라 플러시 요청을 적용할 수 없는 경우 이 메소드는 어떤 작업도 수행하지 않고 바로 반환합니다.
flushGraphics(int,int,int,int)
|
MID 프로필 | ||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES All Classes | ||||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |