[ [[tutorial-ru-001 | Введение]] | [[tutorial-ru-002 | Основы]] | [[tutorial-ru-003 | if/else]] | [[tutorial-ru-004 | Циклы]] | [[tutorial-ru-005 | Массивы]] | [[tutorial-ru-006 | Графика]] | [[tutorial-ru-007 | Анимация]] | [[tutorial-ru-008 | Мышь]] | [[tutorial-ru-009 | Клавиатура]] | [[tutorial-ru-010 | Математика]] | [[tutorial-ru-011 | Методы]] | [[tutorial-ru-012 | Текст]] | [[tutorial-ru-013 | Задачи]] ] ---- == Java для школьников: урок 8 == ====== Работа с мышью ====== Методы: ^ Возвращаемое значение ^ Имя метода и параметры ^ Описание ^ | boolean | getMouseEvent() | Возвращает true если есть событие от мыши (кнопка мыши нажата, кнопка мыши отпущена, мышь переместилась) | | int | getMouseX() | Возвращает координату X положения мыши | | int | getMouseY() | Возвращает координату Y положения мыши | | boolean | getMouseButton(int buttonNumber) | Возвращает true, если соответствующая кнопка мыши в данный момент нажата | Методы getMouseX(), getMouseY() и getMouseButton() имеет смысл вызывать только после того, как метод getMouseEvent() вернул значение true. ====== Движение мыши ====== Отслеживание движения мыши основано на периодическом вызове метода getMouseEvent(). Если мышь переместилась, этот метод вернет значение true. Затем мы получаем координату X курсора мыши вызовом getMouseX(). И наконец координату Y определяем вызовом getMouseY(). Построим алгоритм, который будет отслеживать положение мыши и печатать координаты в виде чисел. // Объявляем переменные // Начинаем бесконечный цикл // Проверяем, что есть движение мыши // Определяем координаты мыши // Печатаем положение мыши // Продолжаем бесконечный цикл Теперь оживим алгоритм, добавив программный код: void main() { // Объявляем переменные int x, y; // Начинаем бесконечный цикл while (true) { // Проверяем, что есть движение мыши if (getMouseEvent()) { // Определяем координаты мыши x = getMouseX(); y = getMouseY(); // Печатаем положение мыши printLine("x = " + x + ", y = " + y); } // Продолжаем бесконечный цикл } } Прекрасно. Запустите программу. Вы видите циферки, бегущие в нижней части окна? Это выдаются координаты положения мышиного курсора. Теперь давайте будем рисовать круг в том месте, где находится мышиный курсор. Вместо печати координат x, y используем их для рисования круга. Просто заменим строку "printline(...)" на: setColor(red); fillCircle(x, y, 20); Что получилось?... Наверное, нам нужен только один круг, а не целая куча? Хорошо, нам нужно добавить стирание окна. Вспомните, как мы стирали окно между кадрами на прошлом занятии по анимации. Здесь то же самое. Добавим перед строкой "fillCircle(...)": clearDrawing(); Теперь это работает, но нужна одна маленькая правка. Курсор мыши расположен выше и левее красного шарика, а мы хотим, чтобы он был в центре. Где-то что-то надо вычесть? Вычесть радиус шарика из значения координат x, y. Поправим вызов fillCircle: fillCircle(x - 20, y - 20, 20); Вот законченный код программы. void main() { // Объявляем переменные int x, y; // Начинаем бесконечный цикл while (true) { // Проверяем, что есть движение мыши if (getMouseEvent()) { // Определяем координаты мыши x = getMouseX(); y = getMouseY(); clearDrawing(); setColor(red); fillCircle(x - 20, y - 20, 20); } // Продолжаем бесконечный цикл } } ====== Кнопки мыши ====== Для отслеживания нажатий на кнопки мыши используется метод ** getMouseButton(int buttonNumber) **. Этот метод возвращает true, если соответствующая кнопка мыши в данный момент нажата. * 1 - Нажата левая кнопка мыши * 2 - Нажата средняя кнопка мыши * 3 - Нажата правая кнопка мыши Давайте попробуем! void main() { int x, y; // Начинаем бесконечный цикл while (true) { if (getMouseEvent()) { // Определяем положение мыши x = getMouseX(); y = getMouseY(); // Нажата ли левая кнопка if (getMouseButton(1)) { printLine("Левая кнопка нажата: " + x + " " + y); } // Нажата ли правая кнопка if (getMouseButton(3)) { printLine("Правая кнопка нажата: " + x + " " + y); } } } } Хорошо! Теперь попробуем использовать мышь для управления красным шариком, который мы катали на прошлом занятии. Сначала опишем алгоритм: // Объявляем переменные x и y // Начинаем цикл // Проверяем движение мыши или нажатие кнопки // Передвигаем красный шарик в позицию мыши, если нажата кнопка // Заканчиваем цикл Скопируйте алгоритм в редактор Judo и составьте текст программы. Попробуйте... Что у Вас получилось? Что-то похожее на это? void main() { // Объявляем переменные x и y int x, y; // Начинаем цикл while (true) { // Проверяем движение мыши или нажатие кнопки if (getMouseEvent()) { // Нажата ли левая кнопка if (getMouseButton(1)) { // Передвигаем красный шарик в позицию мыши x = getMouseX() - 20; y = getMouseY() - 20; // Рисуем шарик clearDrawing(); setColor(red); fillCircle(x, y, 20); } } // Заканчиваем цикл } } Шарик послушно перепрыгивает на место, указанное мышью. Теперь мы ходим, чтобы шарик двигался. Для этого нам понадобится новый метод getTimerEvent() - отслеживание времени. ====== Анимация посредством таймера ====== Для своевременной отрисовки кадров нам понадобится метод getTimerEvent(). ^ Возвращаемое значение ^ Имя метода и параметры ^ Описание ^ | boolean | getTimerEvent(double seconds) | Возвращает true, когда проходит указанное количество времени. Возвращает false, если есть события от мыши или клавиатуры. | Этот метод возвращает true, когда проходит указанное количество времени. Время задается в секундах в виде вещественного числа. Вот как обычно выглядит цикл обработки событий: while (true) { if (getMouseEvent()) { // Обрабатываем движение мыши или нажатие кнопки } if (getTimerEvent(0.05)) { // Рисуем изменения, которые появились за это время } } Переделаем программу с использованием метода getTimerEvent(). Пусть шарик вначале находится в верхнем левом углу экрана, а затем движется вниз. void main() { // Объявляем переменные x и y int x = 0; int y = 0; // Начинаем цикл while (true) { // Проверяем движение мыши или нажатие кнопки if (getMouseEvent()) { // Передвигаем красный шарик в позицию мыши, если нажата кнопка if (getMouseButton(1)) { x = getMouseX() - 20; y = getMouseY() - 20; } } // Если прошло достаточно времени, передвигаем шарик if (getTimerEvent(0.05)) { // Рисуем шарик clearDrawing(); setColor(red); fillCircle(x, y, 20); // Смещаем каждый раз вниз на 5 точек y = y + 5; } // Заканчиваем цикл } } ** Упражнения: ** * Измените программу так, чтобы шарик, дойдя до нижнего края экрана, поворачивал назад и двигался вверх. Затем, дойдя до верхнего края экрана, снова поворачивал и двигался вниз. * Добавьте еще одну возможность: пусть при нажатии правой кнопки мыши шарик ничинает двигаться не вверх-вниз, а вправо-влево. ---- [[tutorial-ru-009 | Перейдем к следующему уроку]].