Translate

вторник, 22 мая 2012 г.

Пишем игру "виселица" на android. Взаимодействие с экраном.

  Продолжаем писать игру на андроид смартон/планшет. Вот Первая часть программирования "виселицы", а вот Вторая.
  Сейчас мы разберемся, как осуществить взаимодействие с экраном - по нажатию должен отправляться сигнал на проверку выбранной буквы и рассчитываться результат попытки.



 Если буква неправильная, она должна быть занесена в список неправильных и выделиться особым образом. Аналогично и с правильными буквами.
  Мы пока еще не выводили слово и количество жизней в вверху экрана, поэтому ограничимся только определением буквы и вызовом ненаписанного пока метода checkLetter().

  Чтобы обрабатывать события нажатия на экран, надо определить метод OnTouchEvent(). Он принимает один параметр - event, содержащий значения атрибутов нажатия на экран: координаты нажатия, тип, силу и другие. Нам понадобятся только координаты:



  Есть одна неприятная особенность у этого метода: он будет вызываться дважды при одном - визуально - нажатии на экран. Поэтому придется каким-то образом нейтрализовать эффект второго нажатия. Повторный выбор буквы, конечно, влиять ни на что не будет, но как быть с окончанием игры? Нам придется вывести сообщение пользователю и начать новую игру - при этом будет выбрана уже в новой игре старая буква. Этого нельзя допустить, и придется заблокировать следующим способом:
 
  -объявим поле класса last_click_time - оно будет отвечать за время окончания игры
  -поставим ограничитель по времени между выбором буквы и началом новой игры -  in_time_between_clicks = 1000 мс.
  -будем проверять в onTouchEvent() выражение (System.currentTimeMillis()-last_click_time>min_time_between_clicks) - если только что закончилась игра, оно будет ложным.
 -при начале новой игры ставить last_click_time=System.currentTimeMillis();

  Код обработки нажатия на экран:

@Override
    public boolean onTouchEvent(MotionEvent event){
        if(System.currentTimeMillis()-last_click_time>min_time_between_clicks){
      
           int x;//колонка выбранной буквы
           int y;//строка выбранной буквы
      
           double red_height=(1-off_const)*height;//знакомая уже нам переменная
      
           x=(int) Math.floor( (event.getX()/((width/(double)rows))) );//Вот так. Сначала мы взяли X нажатия, потом поделили его на длину столбца, а потом округлили в меньшую сторону
           y=(int) Math.floor( ((event.getY()-off_const*height)/(red_height/(double)columns)) );//Аналогично, только с учетом отступа от верхнего края
      
      
           String letter;//Определяем букву
      
           try{
               letter=alphabet.charAt(y*rows+x)+"";//Пытаемся взять букву по ее координтам
           }
           catch(Exception e){
               letter="";//Может быть, пользователь кликнул не по панели с буквами. Тогда ничего делать не надо
           }
      
           if (letter.length()==1){
               checkLetter(letter);//Проверяем букву
           }
         
         
        }
        return true; 
}
Скачать исходник игры

Комментариев нет:

Отправить комментарий

Related Posts Plugin for WordPress, Blogger...