이 보이는 미리
감사합니다.
자신의 keydown 메소드를 호출하려는 메인 루프에서 "handleInput()"과 같은 메소드를 호출해야합니다. 그런 다음 실제 Android keydown 메소드를 구현하면 이벤트 정보가 추가되어야합니다 (키 코드 등)를 큐 컬렉션에 추가합니다. 그런 다음 handleInput() 메서드는 루프를 마지막으로 수행 한 이후 발생한 모든 키 누르기 (대기열에 있음)를 처리합니다. 여기
는 게임의 예를 주요 루프입니다 :
private ConcurrentLinkedQueue<GameEvent> eventQueue = new ConcurrentLinkedQueue<GameEvent>();
은 "GameEvent :
public void run() {
initializeState();
while (stillRunning) { // stillRunning is a flag that signals the user wants to exit
while(isPaused() && stillRunning) { // isPaused is a flag that is set in the if the user selects pause
try {
sleep(100);
} catch (InterruptedException e) {
}
}
if(!stillRunning)
break;
Canvas c = null;
try {
c = surfaceHolder.lockCanvas(null); // the game uses a Surface view for drawing
synchronized (surfaceHolder) {
updateState(); // update game entities - such as remove explosions that are finished, etc.
handleInput(); // handle user input (key presses, screen touches, etc.)
updatePhysics(); // collision detection, speed changes due to gravity, etc.
updateAnimations(); // update which frames need to draw for animating entities
updateSound(); // start/stop any sounds required by new game state/events
updateVideo(c); // draw the next frame of video
}
} finally {
// do this in a finally so that if an exception is thrown
// during the above, we don't leave the Surface in an
// inconsistent state
if (c != null) {
surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
이 루프와 클래스 또한 플레이어에서 들어오는 모든 이벤트를 유지하는 큐를 가지고 "클래스에는 타임 스탬프 멤버가 있습니다 (이벤트 발생시).
public class KeyGameEvent extends GameEvent {
public int keyCode;
public KeyEvent keyEvt;
public boolean up;
public KeyGameEvent(int keyCode, boolean keyUp, KeyEvent evt) {
this.keyCode = keyCode;
this.up = keyUp;
this.keyEvt = evt;
}
}
이 GameEvent : 다음 예 (키보드 이벤트) KeyGameEvent 및 (스크린 터치에 대한) TouchGameEvent, ScrollGameEvent, LongPressGameEvent (TouchGameEvent의 서브 클래스 등) 여기서
같은 서브 클래스 일례가되어있다 이와 같은 인스턴스 표준 안드로이드 이벤트 핸들러 메서드에 큐에 배치받을 다음 클래스 :
public boolean onKeyDown(int keyCode, KeyEvent event) {
KeyGameEvent kge = new KeyGameEvent(keyCode, false, evt);
eventQueue.add(kge);
return true;
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
KeyGameEvent kge = new KeyGameEvent(keyCode, true, evt);
eventQueue.add(kge);
return true;
}
public void onLongPress(MotionEvent evt) {
LongPressGestureGameEvent lpe = new LongPressGestureGameEvent(evt);
eventQueue.add(lpe);
}
가 마지막으로 handleInput() 메소드는 다음과 같습니다
private void handleInput() {
while(true) {
GameEvent evt = eventQueue.poll();
if(evt == null)
break;
if(evt instanceof KeyGameEvent) {
processKeyGameEvent((KeyGameEvent)evt);
}
else if(evt instanceof TouchGameEvent) {
processTouchGameEvent((TouchGameEvent)evt);
}
// ... etc. for the different types of events.
}
}
handeInput()에 의해 호출되는 processKeyGameEvent()와 같은 메서드 내에서 분명히 (나는 희망한다.) 실제로 어떤 키가 눌렀다 놓았는지 검사하고, 게임 로직이 그러한 주요 보도/석방.
게임이 키보드 입력 이벤트 (터치가 아닌 등)에만 관심이있는 경우 GameEvent 클래스 계층 구조를 만들지 않고 onKeyDown()에서받은 KeyEvent를 대기열에 배치하면됩니다.
정말 여기 디자인 방법론에 의문이 있습니다. 나는 당신이 해결하려고하는 어떤 문제에 대해서도 더 우아한 해결책이 있다는 사실에 내기를 걸 것이다. 응답을위한 – user432209