Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > keyPressed & keyReleased


Автор: Majesty 14.7.2008, 13:08
Нужно сделать следующее: при нажатии на стрелку "вправо" шарик на экране едет вправо, при отпускании стрелки - останавливается. Пытался сделать так:
Код
   public void keyPressed(int keyCode) {
      if(pos_x < (width-ball_w) && keyCode == getKeyCode(Canvas.RIGHT)) {
         StartRun("right");
      }

      if(pos_x > 0 && keyCode == getKeyCode(Canvas.LEFT)) {
         StartRun("left");
      }  
   }

   public void keyReleased(int keyCode) {
      isRunning = false;
   }

   public void StartRun(String direction) {
      isRunning = true;
      while(isRunning) {
         if(direction == "left") {
            pos_x-=speed;
         }
         else {
            pos_x+=speed;
         }
         repaint();
         serviceRepaints();
         try {
            parent.thread.sleep(10);
         }
         catch(Exception e) {
         }
      }
   }
И естественно, шарик не останавливается при отпускании стрелки (т.к. методы keyPressed && keyReleased блокирующие и дожидаются завершения друг-друга, отрисовки и т.п.)... А как сделать правильно? smile 

Автор: W0LF 14.7.2008, 13:16
создать отдельный поток

Автор: W0LF 14.7.2008, 13:39
Код

public class aaa {
    boolean running = false;
    boolean stopping = false;
    String[] directions = {"left", "right"};
    String currentDirection;
    static final Object objectMonitor = new Object(); 
    Thread t = new Thread() {
        public void run() {
            while(!stopping) {
                synchronized (objectMonitor) {
                    while (!running) {
                        try {
                            objectMonitor.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();  
                        }
                    }
                    if(currentDirection == directions[0]) {

                    }
                    else {

                    }
                    repaint();
                    serviceRepaints();
                    try {
                        Thread.sleep(10);
                    }
                    catch(Exception e) {
                    }
                }
            }
        }
    };
    public void keyPressed(int keyCode) {
        running = false;
        synchronized (objectMonitor) {
          if(pos_x < (width-ball_w) && keyCode == getKeyCode(Canvas.RIGHT)) {
                currentDirection = directions[1];                
          }
          if(pos_x > 0 && keyCode == getKeyCode(Canvas.LEFT)) {
                currentDirection = directions[0];

          }
           running = true;                
           objectMonitor.notify();
        }
    }
    public void keyReleased(int keyCode) {
        running = false;
    }


}

Попробуй так, правда переделать надо будет, ибо keyPressed - главный поток, если дето в потоке t забочинится что-то - будет висеть приложение.
Теперь пара советов - строки сравнивай через equals и в подобный случаях желательно юзат GameCanvas.
Ах, да, еще надо t.start() сделать

Автор: Majesty 14.7.2008, 13:43
Эхх... Так и знал, что придётся в поток это дело выбрасывать :( Спасибо! А за советы - отдельное спасибо smile smile 

Автор: Majesty 15.7.2008, 06:39
Так, всё прекрасно получилось smile А можно как-нибудь сделать, чтобы телефон не издавал звуков при нажатии кнопки? Получается зажимаешь стрелку, а он попискивает, пока шарик катится. Так мало того, ещё и притормаживает в момент писка smile 

Автор: Samuil 17.7.2008, 10:45
Majesty, поставь режим без звука smile

Автор: Majesty 18.7.2008, 13:42
Ето как ето? smile

Автор: eugine_s 18.7.2008, 14:00
Цитата(Majesty @  15.7.2008,  06:39 Найти цитируемый пост)
Так, всё прекрасно получилось smile А можно как-нибудь сделать, чтобы телефон не издавал звуков при нажатии кнопки? Получается зажимаешь стрелку, а он попискивает, пока шарик катится. Так мало того, ещё и притормаживает в момент писка smile  


Звук от нажатия кнопки телефона издает не Java-мидлет, а ОС телефона. Поэтому отключается звук в настройках телефона.

Например в SE W810i вот так это делается: Menu - Settings - Sounds & alerts - Key sound - Silent

Автор: Majesty 18.7.2008, 15:04
Ну блин, а как игрушки делают? smile Там же не пищить! smile 

Автор: eugine_s 18.7.2008, 15:43
Цитата(Majesty @  18.7.2008,  15:04 Найти цитируемый пост)
Ну блин, а как игрушки делают? smile Там же не пищить! smile  


Прочитай еще раз: 

Цитата(eugine_s @  18.7.2008,  14:00 Найти цитируемый пост)
Звук от нажатия кнопки телефона издает не Java-мидлет, а ОС телефона. 


Или ты сам звук воспроизводишь при нажатии на кнопку? Нет - тогда не думай об этом и отключай системные звуки.

Автор: Majesty 21.7.2008, 06:55
Ну из мидлета же я звуки не отключу smile 
Как сделать, чтобы в моей игре перемещения персонажа не озвучивались? smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)