[ Введение | Основы | if/else | Циклы | Массивы | Графика | Анимация | Мышь | Клавиатура | Математика | Методы | Текст | Задачи ]


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;
        }
        // Заканчиваем цикл
    }
}

Упражнения:

  • Измените программу так, чтобы шарик, дойдя до нижнего края экрана, поворачивал назад и двигался вверх. Затем, дойдя до верхнего края экрана, снова поворачивал и двигался вниз.
  • Добавьте еще одну возможность: пусть при нажатии правой кнопки мыши шарик ничинает двигаться не вверх-вниз, а вправо-влево.

Перейдем к следующему уроку.

 
proj/lang/judo/tutorial-ru-008.txt · Последние изменения: 2007/03/10 04:28
 
Copyright (C) 1996-2013 Serge Vakulenko
serge@vak.ru