[ [[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 | Перейдем к следующему уроку]].