Эй, я только начал изучать разработку Android и столкнулся с проблемой.
Элементы управления в игре Я делаю работу на виртуальном устройстве, но не на телефоне:
- У меня Xperia X10 Mini Pro
- Я делаю основную игру в понг, чтобы изучить разработку программного обеспечения для дроидов
- Игра отлично работает на моем виртуальном устройстве Android, вы можете плавно перемещать весла вверх и вниз
- На моем телефоне я понял, что событие onKeyDown не запускается до тех пор, пока я не отпущу кнопку или не удерживаю кнопку в течение секунды или двух, но затем регистрирует его только как короткое нажатие кнопки. Кнопка, не так, как если бы я удерживал ее
- Я считаю, что функция моего телефона - быстрый доступ к специальным символам, поскольку некоторые клавиши регистрируют разные коды клавиш при быстром нажатии и удерживании
- Проблемы, которые приводят к этому, заключаются в том, что я не могу перемещать весла, но я могу выполнять такие действия одним нажатием, как пауза в игре
Я также могу добавить:
- Игра построена вокруг примера приложения LunarLander из SDK
- Лунный аппарат отлично работает в виртуальном устройстве, но при подключении к телефону у меня возникают те же проблемы, что и у моего понга
Как я могу заставить свой телефон регистрировать события onKeyDown, как и должно? (Или хотя бы как виртуальное устройство?)
Код из моего класса просмотра, который расширяет SurfaceView:
@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
return thread.doKeyDown(keyCode, msg);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent msg) {
return thread.doKeyUp(keyCode, msg);
}
Код из потока:
boolean doKeyDown(int keyCode, KeyEvent msg) {
synchronized (mSurfaceHolder) {
mP1Score = keyCode;//For debugging
boolean okStart = false;
if (keyCode == KeyEvent.KEYCODE_SPACE) okStart = true;
if (mMode == STATE_PAUSE && okStart) {
setState(STATE_RUNNING);
return true;
} else if (mMode == STATE_READY && okStart) {
setState(STATE_RUNNING);
return true;
} else if (mMode == STATE_GOAL && okStart) {
return true;
}else if (mMode == STATE_END_GAME && okStart) {
doStart();
return true;
} else if (mMode == STATE_RUNNING) {
if (keyCode == KeyEvent.KEYCODE_Q) {
mP1dY = -PLAYER_SPEED;//Player 1 up
return true;
} else if (keyCode == KeyEvent.KEYCODE_A) {
mP1dY = PLAYER_SPEED;//Player 1 down
return true;
} else if (keyCode == KeyEvent.KEYCODE_O) {
mP2dY = -PLAYER_SPEED;//Player 2 up
return true;
} else if (keyCode == KeyEvent.KEYCODE_L) {
mP2dY = PLAYER_SPEED;//Player 2 down;
return true;
} else if (keyCode == KeyEvent.KEYCODE_SPACE) {
pause();//Space is pressed in game
return true;
}
}
return false;
}
}
boolean doKeyUp(int keyCode, KeyEvent msg) {
boolean handled = false;
mP2Score = keyCode;//For debugging
synchronized (mSurfaceHolder) {
if (mMode == STATE_RUNNING) {
if (keyCode == KeyEvent.KEYCODE_Q
|| keyCode == KeyEvent.KEYCODE_A) {
mP1dY = 0;
handled = true;
} else if (keyCode == KeyEvent.KEYCODE_O
|| keyCode == KeyEvent.KEYCODE_L) {
mP2dY = 0;
handled = true;
}
}
}
return handled;
}
Полный источник доступен здесь