Продолжаем писать игру на андроид смартон/планшет. Вот Первая часть программирования "виселицы", а вот Вторая.
Сейчас мы разберемся, как осуществить взаимодействие с экраном - по нажатию должен отправляться сигнал на проверку выбранной буквы и рассчитываться результат попытки.
Если буква неправильная, она должна быть занесена в список неправильных и выделиться особым образом. Аналогично и с правильными буквами.
Мы пока еще не выводили слово и количество жизней в вверху экрана, поэтому ограничимся только определением буквы и вызовом ненаписанного пока метода 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();
Код обработки нажатия на экран:
Сейчас мы разберемся, как осуществить взаимодействие с экраном - по нажатию должен отправляться сигнал на проверку выбранной буквы и рассчитываться результат попытки.
Если буква неправильная, она должна быть занесена в список неправильных и выделиться особым образом. Аналогично и с правильными буквами.
Мы пока еще не выводили слово и количество жизней в вверху экрана, поэтому ограничимся только определением буквы и вызовом ненаписанного пока метода 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; }Скачать исходник игры
Комментариев нет:
Отправить комментарий