На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> обработка нажатий кнопок в GameCanvas'e как в Canvas'e , как реализовать?
    Насколько я понимаю,для этого в GameCanvas'e нужно переопределить Canvas-метод keyPressed()?Или как-то по-другому? Можно небольшой пример с исходником?
      Что конкретно имеется ввиду? Какая такая обработка?
        В GameCanvas'e для обработки нажатых кнопок есть метод getKeyStates().
        Вот небольшая функция которая по нажатии левой клавиши управления вызывает функцию left_povorot(), а по нажатии правой - right_povorot(). Ясное дело функции left_povorot(), right_povorot() нужно реализовать в приложении самостоятельно. Конечно же есть константы и для всех других кнопок на клавиатуре телефона. Погугли.

        ExpandedWrap disabled
          private void inputkey() {
                  
                 int keyState = getKeyStates();
                 if ((keyState & LEFT_PRESSED)!=0){
                 left_povorot();
                 }
                 if ((keyState & RIGHT_PRESSED)!=0){
                 right_povorot();
                 }
              }
          Да,я знаю,что в GameCanvas есть метод getKeyStates() и константы LEFT_PRESSED,RIGHT_PRESSED и т.д. Но,допустим,мне нужно обработать,например,клавиши "*" или "#".Для этого в Canvas'e нужно написать такой метод:
          ExpandedWrap disabled
            public void keyPressed(int keyCode)
             {
                int action = getGameAction(keyCode);
                
                if (action == KEY_STAR)
                    
                {
                     //bla bla bla...
                }

          Так вот,как мне воспользоваться этим же методом в GameCanvas'e? В поисках ответа облазил несколько форумов и ,вообщем,вырисовывается следующая логика решения: GameCanvas есть наследник Canvas'a,а значит,чтобы воспользоваться методом keyPressed,нужно его переопределить в наследнике.
          Вопрос №1:как это реализовать на практике?
          Я делаю так - объявляю public class MyGameCanvas extends GameCanvas implements Runnable,в коем объявляю описанный выше метод keyPressed.Далее вызываю его в теле метода run().С вызовом keyPressed в методе run() тоже непонятки.С каким в данном случае аргументом нужно вызывать? Я вызываю так keyPressed(KEY_STAR).Но таким макаром не работает,хотя компилятор не ругается.Но люди это реализовывают,только почему-то не приводят наглядных примеров.
          Вопрос №2.Я не знаток ява,но насколько мне известно переопределять возможно только абстрактные методы? Если это так,то как это можно сделать с канвасовскими keyPressed и иже с ним,если они таковыми не являются,то есть не обязательны к реализации?
          Кого не затруднит - объясните,пожалуйста логику решения данной задачи и выложите демонстрационный исходник.
            Мне не надо гуглить, я эти классы ещё хорошо помню. Собственно, GameCanvas для того и расширяет Canvas, чтобы внести туда несколько методов: даблбуфер (см. flushGraphics) и getKeyStates. Больше по сути там и нет ничего. Какой смысл использовать Canvas, если есть потребность именно в этом функционале? Но зачем переопределять в наследнике неабстрактные методы предка, чтобы ими воспользоваться? :ph34r: Они и так там доступны и работают.

            Цитата spaik @
            Я не знаток ява,но насколько мне известно переопределять возможно только абстрактные методы?

            Конечно же, это не так. И ява тут непричём. Это основы ООП. Переопределять можно любые виртуальные методы, которыми в Java являются все (за исключением опционально отдельно указываемых).

            В данном случае о том и вопрос - зачем для решения этой задачи вообще что-то переопределять? Если в GameCanvas есть всё что есть в Canvas.
            Сообщение отредактировано: dark_barker -
              Вы же сами написали:
              Цитата
              GameCanvas есть наследник Canvas'a

              Это значит что в GameCanvas есть все методы которые доступны в Canvas, в том числе и getGameAction.

              Цитата
              В данном случае о том и вопрос - зачем для решения этой задачи вообще что-то переопределять?

              Поддерживаю. :good:
                Ну хорошо, если вам нужен этот метод попробуем вам помочь. Первое, что бросается в глаза в вашем коде:
                ExpandedWrap disabled
                  public void keyPressed(int keyCode)
                   {
                      int action = getGameAction(keyCode);
                   
                      if (action == KEY_STAR)
                   
                      {
                           //bla bla bla...
                      }

                это то, что вы используете сравнение
                ExpandedWrap disabled
                  action == KEY_STAR
                . Но константа KEY_STAR определена внутри класса Canvas поэтому попробуйте использовать
                ExpandedWrap disabled
                  action == Canvas.KEY_STAR
                  Решил вашу проблему. Для того чтобы использовать метод keyPressed() нужно чтобы конструктор класса начинался с super(false); Если использовать super(true) - метод просто никогда не сработает. Отпишитесь если помогло. :rolleyes:
                    Спасибо,studentus.Помогло. :D Вот только не все канвасовские коды кнопок в гейм канве пашут.В частности не работают "*" & "#".Надо дальше экспериментировать.Чем дальше в лес,тем больше вопросов.Да вот только чё-то эмуль в эклипс уже битый час какзапустить не могу >:(
                      Цитата
                      Вот только не все канвасовские коды кнопок в гейм канве пашут

                      Это точно! Я вместе с keyPressed использую getKeyStates. У каждого свои преимущества и недостатки. Например с помощью getKeyStates можно реализовать нажатие средней кнопки джойстика, но при этом надо самому следить чтобы пользователь успел отпустить кнопку прежде чем метод сработает второй раз. А вот метод keyPressed срабатывает один раз сколько не держать кнопку, но увы -
                      Цитата
                      Вот только не все канвасовские коды кнопок в гейм канве пашут


                      Добавлено
                      Цитата
                      Да вот только чё-то эмуль в эклипс уже битый час какзапустить не могу

                      Проверь файрвол, возможно заблокирован порт который назначен в эмуляторе как Internal RMI registry port.
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0315 ]   [ 16 queries used ]   [ Generated: 25.04.24, 00:28 GMT ]