Каковы основы работы с событиями пользовательского ввода в Android? - PullRequest
7 голосов
/ 13 апреля 2010

Я думал, что понял этот вопрос, но здесь что-то не так.Когда пользователь (я пока) пытаюсь нажать клавиши, на самом деле ничего не происходит, и у меня возникают большие проблемы с пониманием того, что я пропустил.

Подумайте об этом, прежде чем представить какой-то кодпомогите прояснить мою проблему: я использую пример Android Lunar Lander для создания своей первой «настоящей» программы для Android.В этом примере, конечно, существует класс LunarView, и класс вложен в него LunarThread.В моем коде эквивалентами этих классов являются Graphics и GraphicsThread соответственно.

Также я могу сделать спрайт анимации в 2D просто отлично на Android.У меня есть класс Player, и предположим, что GraphicsThread имеет элемент Player, называемый «игрок».Этот класс имеет четыре координаты - x1, y1, x2 и y2 - и они определяют прямоугольник, в котором должен быть нарисован спрайт.Я разработал это, чтобы я мог справиться с этим отлично.Всякий раз, когда вызывается метод doDraw (Canvas canvas), он просто смотрит на значения этих координат и соответственно рисует спрайт.

Теперь скажем - и это не совсем то, что я пытаюсьделать с программой - я пытаюсь сделать программу, в которой все, что она делает, это отображать спрайт Player в одном месте экрана, ДО первого раза, когда пользователь нажимает левую кнопку Dpad.Затем местоположение будет изменено на другое заданное положение на экране, и спрайт будет неизменно отображаться в этой позиции для остальной части программы.

Также обратите внимание, что элемент GraphicsThread в Graphics называется "thread"и что член SurfaceHolder в GraphicsThread называется «mSurfaceHolder».

Поэтому рассмотрите этот метод в классе Graphics:

@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: Left?

Спасибо!

Ответы [ 2 ]

1 голос
/ 21 мая 2010

Прежде чем беспокоиться о реальном движении и тому подобном, я бы рассмотрел журнал ...

Что-то вроде:

Log.d("lunar", "keyCode = ["+String.valueOf(keyCode)+"] // msg = ["+String.valueOf(msg)+"]");

При этом я могу почувствовать, что регистрирует система, прежде чем беспокоиться о том, что я делаю с указанными зарегистрированными данными ... После этого вы можете решить, отправляете ли вы даже правильные данные, и можете потом о работе с нитками и т. д.

Надеюсь, что это поможет диагностировать и т. Д. (Все это было написано от руки, могут содержать ошибки)

0 голосов
/ 03 мая 2010

Выбросьте LunarLander и используйте реальное руководство: Игра с графикой в ​​Android

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...