Я думал, что понял этот вопрос, но что-то довольно неправильно здесь. Когда пользователь (меня, до сих пор) пытается нажать клавиши, ничего действительно не происходит, и я испытываю много затруднений, понимающих, чем случается так, что я отсутствовал.
Рассмотрите это, прежде чем я представлю некоторый код, чтобы помочь разъяснить мою проблему: Я использую Лунный пример Высаживающегося на берег Android для создания моей первой "реальной" программы Android. В том примере, конечно, там существуют класс LunarView и класс, вложенный там LunarThread. В моем коде эквиваленты этих классов являются Графикой и GraphicsThread, соответственно.
Также я могу сделать анимации спрайта в 2D очень хорошо на Android. У меня есть класс Плеера, и скажем, GraphicsThread имеет участника Плеера, называемого "плеером". Этот класс имеет четыре координаты - x1, y1, x2, и y2 - и они определяют прямоугольник, в котором должен быть оттянут спрайт. Я разработал его так, чтобы я мог обработать это отлично. Каждый раз, когда doDraw (Холст холста) метод вызывается, он просто посмотрит на значения тех координат и потянет спрайт соответственно.
Теперь скажем, - и это не действительно, что я пытаюсь сделать с программой - я пытаюсь сделать программу, где все, что она делает, отобразить спрайт Плеера в одном местоположении экрана ДО ПЕРВОГО раза, когда пользователь нажимает левую кнопку Dpad. Затем местоположение будет изменено к другой позиции набора по экрану, и спрайт будет оттянут в том положении для остальной части программы неизменно.
Также обратите внимание, что члена GraphicsThread в Графике называют "потоком", и что члена SurfaceHolder в GraphicsThread называют "mSurfaceHolder".
Поэтому рассмотрите этот метод в классе Графика:
@Override
public boolean onKeyDown(int keyCode, KeyEvent msg) {
return thread.keyDownHandler(keyCode, msg);
}
Также считайте этот метод в классе GraphicsThread:
boolean keyDownHandler(int keyCode, KeyEvent msg) {
synchronized (mSurfaceHolder) {
if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {
player.x1 = 100;
player.y1 = 100;
player.x2 = 120;
player.y2 = 150;
}
}
return true;
}
Теперь затем предполагая, что координаты игрока начинаются как (200, 200, 220, 250), почему не будет, он делает что-либо различное, когда я нажимаю Dpad: Левый?
Спасибо!
Выбросьте LunarLander и используйте настоящее руководство: Игра с графикой в Android
Прежде чем беспокоиться о реальном движении и тому подобном, я бы рассмотрел журнал ...
Что-то вроде:
Log.d("lunar", "keyCode = ["+String.valueOf(keyCode)+"] // msg = ["+String.valueOf(msg)+"]");
При этом я могу почувствовать, что регистрирует система прежде чем я буду беспокоиться о том, что я делаю с указанными зарегистрированными данными ... После этого вы можете решить, отправляете ли вы его правильные данные, а затем можете беспокоиться о работе потоков и т. д.
Надеюсь, это поможет в диагностике и т. д. (Все из этого написано от руки, может содержать ошибки)