При изучении наук примеры полезнее, чем правила. Иссак Ньютон.
Предлагаемые вниманию коллег практические работы по программированию игр целесообразно использовать после изучения следующих тем: «Создание массива управляющих элементов», «Обработка массивов», «Графические возможности Visual Basic». После непосредственного изучения темы «Обработка событий мыши. Технология Drag-and-Drop» мы выполняем несколько практических работ по программированию несложных игр, основная цель которых – обобщение, систематизация и закрепление на практике изученного ранее материала.
При объяснении нового материала удобно использовать распечатки с изложением теории и примерами, либо методические пособия для каждого студента (мы используем оба варианта).
Приведённые практические работы рассчитаны на 3 занятия по 2 часа.
Теоретический материал
Обработка событий мыши. Технология Drag-and-Drop.
Для перетаскивания различных объектов при помощи мыши используется технология Drag-and-Drop (перетащить и бросить). Перемещаемый элемент называется источником (source), а объект, в котором он будет после этого находиться, носит название адресата (target). Объект становится адресатом в том случае, когда при завершении операции перетаскивания указатель мыши находится в его границах.
Для перемещения объекта необходимо наличие в программе соответствующих процедур. К элементу управления может применяться описанная технология только в том случае, если он не имеет фокус в этот момент. Для запрещения получения фокуса элементом необходимо для него задать свойство TabStop = False.
Свойства, события и методы технологии Drag-and-Drop.
Название | Описание |
DragDrop | Событие, возникающее по окончании операции перетаскивания элемента. |
DragOver | Событие, которое выполняется в случае, когда элемент находится над объектом-адресатом (при этом операция перетаскивания еще не завершена). |
DragMode | Свойство устанавливает режим перетаскивания
элемента:
|
Draglcon | Свойство задаёт изображение элемента при его перетаскивании. |
Drag | Метод, используемый для начала и окончания операции перетаскивания (перед этим необходимо установить DragMode = 0). |
Если установлен ручной режим перемещения (DragMode = 0), то в этом случае операция может быть выполнена только при помощи метода Drag. При автоматическом режиме возможно перетаскивание элемента без использования Drag.
Событие DragDrop, возникающее при завершении операции, имеет следующие параметры:
- DragDrop (Source As Control, X As Single, Y As Single), где Source As Control - ссылка на элемент-источник;
- X As Single, Y As Single - координаты точки объекта-адресата, в которой отпускается кнопка мыши по окончании операции.
Метод Drag имеет один параметр - Action, определяющий то или иное состояние выполняемого перетаскивания. В таблице приведены значения параметра Action метода Drag:
Константа | Значение | Описание |
vbCancel | 0 | Отмена операции |
vbBeginDrag | 1 | Начало перетаскивания |
vbEndDrag | 2 | Окончание операции |
Пример 1: Имитация действия Корзины путём перетаскивания в неё объекта. Восстановление объекта происходит при двойном щелчке по корзине.
В качестве корзины и объекта будем использовать элементы управления Image. В качестве рисунков пустой и полной корзины можно использовать файлы с расширением.ICO, в качестве объекта для перемещения – рисунок мяча. Соответствующие рисунки нужно скопировать в папку с данным проектом. При запуске приложения корзина изображена пустой, затем в Image будет загружен рисунок с изображением полной корзины методом LoadPicture <Рисунок1>.
Рисунок 1
Интерфейс проекта:
На форме разместить метку Label1 (Положи мяч в корзину), кнопку Command1 (Выход), 2 элемента управления Image (в один поместить изображение мяча, в другой – пустой корзины).
Обозначения:
- Mx, My – координаты перемещаемого объекта;
- P – переменная логического типа, определяющая, пустая корзина или полная.
Dim Mx, My As Single, P As Boolean
Private Sub Form_Load() ‘загрузка формы
P = False ‘признак пустой корзины
End Sub
Private Sub Image1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then ‘если нажата левая кнопка мыши
Call Image1.Drag(vbBeginDrag) ‘начало перетаскивания
Mx = X
My = Y
End If
End Sub
Private Sub Image2_DragDrop(Source As Control, X As Single, Y As Single) ‘завершение перетаскивания объекта в корзину
Source.Visible = False ‘мяч стал невидим
P = True ‘признак полной корзины
Image2.Picture = LoadPicture("LEO4.ICO") ‘рисунок полной корзины
Label1.Caption = "Достань мяч из корзины!!!" ‘изменили надпись в метке
End Sub
Private Sub Image2_DblClick() 'извлечение объекта из корзины
Image1.Visible = True ‘мяч стал видимым
P = False ‘признак пустой корзины
Image2.Picture = LoadPicture("LEO3.ICO") ‘загрузить рисунок пустой корзины
Label1.Caption = "Положи мяч в корзину!" ‘изменить надпись в метке
End Sub
‘Завершение перетаскивания объекта на форме с учётом поправки (необязательная процедура)
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)
SourceMove (X - Mx), (Y - My)
End Sub
При автоматическом перетаскивании элемента по форме при завершении операции его левый верхний угол будет находиться в той точке, где располагался указатель при отпускании кнопки мыши, независимо от того, где он находился на элементе в начале перетаскивания. Для того, чтобы конечное расположение совпадало с контуром, который отображается по умолчанию при перетаскивании (или с изображением, установленным в свойстве DragIcon), необходимо ввести поправку. После установления ручного режима становится возможным определение координат точки, в которой находился указатель в начале перетаскивания путём обработки события MouseDown для соответствующего элемента, что позволяет откорректировать параметры метода Move. [1]
Задания:
- Добавьте в проект изображения ещё двух объектов, которые также можно перемещать в корзину и возвращать на место.
- Измените проект таким образом, чтобы объекты можно было перемещать в любое место на форме (т.е. приёмником становится сама форма).
Практическая работа 1
Проект «Пазлы». <Приложение 1>
Предварительная подготовка к работе (может быть выполнена дома): в любом графическом редакторе разбить произвольный рисунок на 4 части и сохранить в разных файлах (Ris1.bmp, Ris2.bmp, Ris3.bmp, Ris4.bmp). Например, в Paint можно использовать команду ПРАВКА – Копировать в файл. Не изменяйте пропорций рисунков. Создайте ещё один рисунок Ris5.bmp – квадрат с однотонной заливкой (будем использовать его в качестве фона, когда необходимо скрыть предыдущие рисунки).
Задание. Разработать проект «Пазлы». Исходный рисунок разбит на 4 части. Необходимо сложить его на пустом поле, разбитом на 4 части. Исходный вид формы показан на рисунке <Рисунок2>.
Интерфейс проекта. На форме разместить следующие элементы управления:
- метка Label1 (Собери картинку по образцу!);
- 4 командные кнопки: Command1 (Выход), Command12 (Проверка), Command3 (Сброс), Command4 (Справка);
- поле Image1 – поместить исходный рисунок для образца;
- поля Image2 и Image3 - создать как массивы из 4-х элементов каждый (с индексами 0, 1, 2, 3), установить у каждого свойство Strech = True. В поле Image2 необходимо будет собрать рисунок. Первоначально там загружен пустой фон, поэтому в свойстве Picture полей Image2 нужно указать путь к фоновому рисунку Ris5.bmp. В свойстве Picture полей Image3 указать путь к рисункам (Ris1.bmp, Ris2.bmp, Ris3.bmp, Ris4.bmp). Файлы с рисунками скопируйте предварительно в папку с вашим проектом, тогда не нужно будет указывать полный путь к файлам, достаточно указать имя файла;
- метка Label2 – для вывода справки (установите свойство Visible= True, чтобы при запуске проекта метка была невидима);
- таймер Timer1 – первоначально таймер выключен. Он будет включаться по кнопке «Справка» и через заданный интервал времени скрывать текст, который выведен в метке Label2 (установите свойства таймера Interval = 8000, Enabled = False).
Рисунок 2
Программный код.
Dim Mx, My As Single, Path As String, k, i, j, t As Integer, A(0 To 3) As Integer
‘Массив А - для хранения номеров перемещённых картинок;
‘Mx, My – координаты объекта при перемещении; Path – путь к файлу с рисунком;
‘k - количество верных ответов; t - номер рисунка, который нужно вернуть на место
Private Sub Form_Load() ‘загрузка формы
For i = 0 To 3
A(i) = -1 ‘заполнение массива -1 – признак того, что соответствующие поля Image2 пустые
Next
End Sub
Private Sub Command1_Click() ‘Выход
End
End Sub
Private Sub Command2_Click() 'Проверка
k = 0 ‘количество верных ответов
For i = 0 To 3
If Image2(i).Index = A(i) Then k = k + 1 'индекс в массиве рисунков должен совпадать с номером рисунка
Next
If k = 4 Then
Label1.Caption = "Игра завершена!!! Верных ответов - " & Str(k)
Else
Label1.Caption = "Попробуй еще раз!!! Верных ответов - " & Str(k)
End If
End Sub
Private Sub Command3_Click() 'Сброс
Label2.Visible = False
For i = 0 To 3
Image3(i).Visible = True ‘восстанавливаем все рисунки
Image2(i).Picture = LoadPicture("Ris5.bmp") ‘загружаем пустой фон
A(i) = -1 ‘в массив заносим -1 - признак пустого поля
Next
Label1.Caption = "Собери картинку"
End Sub
Private Sub Command4_Click() 'Справка
Label2.Visible = True ‘метка становится видимой и появляется текст справки
Label2.Caption = "Перемещайте картинки при нажатой левой кнопке мыши в нужные клетки. При двойном щелчке по картинке она вернётся на прежнее место!"
Timer1.Enabled = True ‘включаем таймер
End Sub
Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single) 'Поправка
SourceMove (X - Mx), (Y - My)
End Sub
Private Sub Image2_DblClick(Index As Integer) 'Возвратить картинку на место по двойному щелчку по рисунку
Image2(Index).Picture = LoadPicture("Ris5.bmp") ‘загружаем пустой фон
t = A(Index) ‘запоминаем номер рисунка, который нужно вернуть на место
Image3(t).Visible = True ‘делаем рисунок с номером t видимым
End Sub
Private Sub Image2_DragDrop(Index As Integer, Source As Control, X As Single, Y As Single) 'завершение перетаскивания
Source.Visible = False
Image2(Index).Picture = LoadPicture(Path)
j = Index: A(j) = Val(Mid$(Path, 4, 1)) - 1 'запомнить номер перемещённого рисунка в массиве А
End Sub
Private Sub Image3_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
Call Image3(Index).Drag(vbBeginDrag) 'начало перетаскивания рисунка
Mx = X
My = Y
End If
i = Index ‘запоминаем индекс поля в Image3, из которого перемещаем рисунок
If i = 0 Then Path = "Ris1.bmp" 'путь к рисунку
If i = 1 Then Path = "Ris2.bmp"
If i = 2 Then Path = "Ris3.bmp"
If i = 3 Then Path = "Ris4.bmp"
End Sub
Private Sub Timer1_Timer() 'Таймер
Label2.Visible = False ‘скрыть текст справки
End Sub
Задания:
- Добавьте в проект 2 новые формы. На первой (заставка) разместите переключатели (Option) для выбора уровня сложности игры. При выборе 1-го уровня загружается соответствующая форма (рисунок разбит на 4 части).
- Реализуйте 2-й уровень сложности игры на третьей форме. Исходный рисунок разбит на 9 частей.
Практическая работа 2
Проект «Расположить объекты в хронологическом порядке». <Приложение 2>
В данной задаче мы работаем с массивами меток. Перемещаемыми объектами здесь являются метки с надписями. При первоначальной загрузке должны быть доступны только кнопки «Пуск» и «Выход». После нажатия на «Пуск» становятся доступны все кнопки. По кнопке «Проверка» выводится количество правильных ответов. Кнопки должны быть снабжены всплывающими подсказками. Исходный вид формы приведён на рисунке <Рисунок3>.
Рисунок 3
Рассмотренные в данных работах методы обработки событий мыши при перемещении объектов мы используем в дальнейшем при создании тестовых и игровых программ («Пятнашки», «Морской бой», «Электронные кроссворды», «Переводчик», «Интеллектуальный марафон», «Эрудит», «Тесты на внимание», «Информатика в играх и задачах» и других). Несомненно, что выполнение таких заданий способствует не только развитию творческих и умственных способностей учащихся, но и повышает интерес к самому процессу программирования. В процессе работы над проектами возникает множество предложений по усовершенствованию программы и вопросов, для решения которых имеющихся знаний уже недостаточно. Таким образом поддерживается непрерывная связь теории с практикой, постоянно вводятся новые элементы познания.
С некоторыми проектами можно познакомиться на сайте ПОРТФОЛИО 2006/2007 г. («Информатика в играх и задачах», «Компьютерный тест Умник»), 2007/08 г. («Электронные кроссворды по информатике», проект «Компьютерная графика»).
Литература:
- Глушаков С.В.,Мельников В.В., Сурядный А.С Программирование в среде Windows: Учебный курс. – Харьков: Фолио, 2001