Модераторы: javastic, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Game Canvas некорректная обработка нажатий клавиш 
V
    Опции темы
Metalex
Дата 13.8.2011, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Здравствуйте, господа. 
Я пытаюсь создать простенькую игру. Скелет готов, но сразу же возникли проблемы.
Дело в том, что у меня всегда возвращается MOVE_NONE независимо от того, какую клавишу я нажимаю, поэтому спрайт не двигается + ко всему, когда я ничего не нажимаю (а поток выполняется) в качестве направления движения передается MOVE_NONE, который равен нулю и поэтому возбуждется эксепшн NullPointerException (и мне непонятно почему, ведь 0 это же не null)..
Выложу участки кода, к которым все это имеет отношение:
В методе run потока:
Код

//myCanvas - экземпляр класса, унаследованного от GameCanvas
myCanvas.checkKeys();

Метод checkKeys класса MyGameCanvas:
Код

public void checkKeys() {
        if (!myGameOver) {
            int keyState = getKeyStates();
//myManager - экземпляр класса, унаследованного от LayerManager
            myManager.requestMove(keyState);
        }
    }

Метод класса MyLayerManager
Код

public void requestMove(int keyState) {
        // получаем направление движения
        int move = 0;
        try {
            System.out.println(keyState);
            move = myPlayer1.move(keyState);
        } catch (NullPointerException npex) {
            System.out.println("FUCKFUCKFUCK");
        }
//если направления нет - возврат
        if (move == MOVE_NONE) {
            System.out.println("return");
            return;
        }

и метод move класса MyPlayer
Код

 public int move(int keyState) {
        if ((keyState & GameCanvas.LEFT_PRESSED) != 0) {
            return MyLayerManager.MOVE_LEFT;
        } else if ((keyState & GameCanvas.RIGHT_PRESSED) != 0) {
            return MyLayerManager.MOVE_RIGHT;
        } else if ((keyState & GameCanvas.UP_PRESSED) != 0) {
            return MyLayerManager.MOVE_UP;
        } else if ((keyState & GameCanvas.DOWN_PRESSED) != 0) {
            return MyLayerManager.MOVE_DOWN;
        }
        return MyLayerManager.MOVE_NONE;
    }

При простое у меня такой вывод:
Цитата

0
FUCKFUCKFUCK
return

При нажатии клавиши вверх/вниз и т.д.:
Цитата

4
FUCKFUCKFUCK
return


Подскажите, пожалуйста, это я что-то не так делаю.. или что тогда?

Добавлено через 2 минуты и 27 секунд
Простите, если сумбурно выражаюсь.


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
newinfo2005
Дата 14.8.2011, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 12.6.2008
Где: где-то тут

Репутация: нет
Всего: нет



myPlayer1 вероятно равен null, где он у тебя определен? как?
PM MAIL ICQ   Вверх
Metalex
Дата 15.8.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Метод run класса потока
Код

    public void run() {
        try {
            myCanvas.init();
            myCanvas.start();
        } catch (Exception e) {
            myMidlet.errorMsg(e);
        }

        // flush any keystrokes that occurred before the game started
        myCanvas.flushKeys();
        // start game cycle
//........................................


Метод init
Код

public void init() throws IOException {
        myManager.init();
    }


Еще один метод init
Код

 public void init() throws IOException {
  //.....................................

        //инициализируем игроков
        initPlayers();
//...........................................


И наконец:
Код

private void initPlayers() {
        myGameInfo = new GameInfoImpl();

        // init player 1
        myPlayer1 = new OwnerPlayer(pacmanSprite, pacmanSpriteAnimator, myGameInfo);
        // init player 2
        myPlayer2 = new PhonePlayer(thomasSprite, thomasSpriteAnimator, pacmanSprite, myGameInfo);

    }


Если надо, могу и дальше выложить..


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
Metalex
Дата 15.8.2011, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

Репутация: нет
Всего: нет



Эта проблема решена. Оказалось, когда я создавал 2го спрайта, я скопировал строку создания 1го и забыл поменять имя.. Копипаст - это зло! smile


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




[ Время генерации скрипта: 0.0648 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.