Читайте также:
|
|
Модуль класса clsЛовец остается прежним. Приведу в окончательном виде все остальное, а именно: модуль класса clsШар, модуль кода и модуль (окно кода) формы.
Модуль кода
Public Const Число_шаров = 10
Public Const Размер_шара = 200
Public Const Размер_ловца = 500
Public Const Дальность = 200 'Это расстояние, на котором ловец достает шар
Public Ловец As clsЛовец 'Объявляем объект Ловец класса clsЛовец
Public Шар(1 To Число_шаров) As clsШар 'Объявляем массив объектов Шар класса clsШар
Модуль формы
Public intЧисло_пойманных_шаров As Integer
Private Sub Form_Load() 'Эта процедура выполняется один раз при запуске проекта
Dim i As Integer
Randomize 'Шары должны разлетаться со случайной скоростью и в случайном направлении
'Настраиваем размеры изображений шара и ловца:
imgШар(1).Height = Размер_шара
imgШар(1).Width = Размер_шара
imgЛовец.Height = Размер_ловца
imgЛовец.Width = Размер_ловца
'Порождаем массив изображений шара:
For i = 2 To Число_шаров
Load imgШар(i)
imgШар(i).Visible = True
Next i
'Порождаем объект Ловец и массив объектов-шаров:
Set Ловец = New clsЛовец
For i = 1 To Число_шаров
Set Шар(i) = New clsШар
Next i
Начальная_установка
KeyPreview = True 'Чтобы форма реагировала на клавиатуру
txtСчетчик_времени.Locked = True 'Чтобы в процессе игры нельзя было вручную менять показания счетчика
End Sub
Private Sub cmd_Начинай_сначала_Click() 'Что происходит при нажатии кнопки НАЧИНАЙ СНАЧАЛА
Начальная_установка
txtСчетчик_времени.SetFocus 'Чтобы фокус ушел с кнопки, иначе первое нажатие на стрелки клавиатуры не вызывает движения ловца
End Sub
Private Sub Начальная_установка() 'Все объекты встают в исходную позицию и настраиваются на новую игру
Dim i As Integer
txtСчетчик_времени.Text = 0 'Обнуляем счетчик времени
intЧисло_пойманных_шаров = 0 'Обнуляем число пойманных шаров
Ловец.Начальная_установка 'Ловец встает в исходную позицию и настраивается на новую игру
For i = 1 To Число_шаров 'Все шары встают в исходную позицию и настраиваются на новую игру
Шар(i).Начальная_установка
Next i
End Sub
Private Sub Timer1_Timer() 'Главная_процедура игры, выполняется один раз на каждом импульсе таймера
Dim i As Integer
'Действуют все шары:
For i = 1 To Число_шаров
Шар(i).Действие 'Сначала объект Шар вычисляет свои координаты,
imgШар(i).Left = Шар(i).x 'Затем изображение шара сдвигается на вычисленные координаты
imgШар(i).Top = Шар(i).y
Next i
'Действует ловец:
Ловец.Действие 'Сначала объект Ловец вычисляет свои координаты,
imgЛовец.Left = Ловец.x 'Затем изображение Ловца сдвигается на вычисленные координаты
imgЛовец.Top = Ловец.y
'Действует счетчик времени на форме, увеличивая свои показания на 1:
If intЧисло_пойманных_шаров <> Число_шаров Then txtСчетчик_времени.Text = txtСчетчик_времени.Text + 1
End Sub
'Обработка события - нажатия клавиши на клавиатуре для управления ловцом:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKeyUp Ловец.Руль = вверх
Case vbKeyLeft Ловец.Руль = влево
Case vbKeyDown Ловец.Руль = вниз
Case vbKeyRight: Ловец.Руль = вправо
Case vbKeyControl: Ловец.Руль = стоп
End Select
End Sub
Модуль clsШар
Public x As Long 'Координаты шара
Public y As Long
Private dx As Long 'Шаг шара по горизонтали и вертикали между двумя импульсами таймера
Private dy As Long
Private Макс_шаг As Long 'Максимально возможное значение шага шара
Private Sub Class_Initialize() 'Процедура, выполняющаяся при рождении шара
Макс_шаг = 100
End Sub
Public Sub Начальная_установка() 'Шар встает в исходную позицию и настраивается на новую игру
'Ставим шар на исходную позицию:
x = f.shpБортик.Left + f.shpБортик.Width * 3 / 4 'Она отстоит по горизонтали на четверть ширины поля от правого его края
y = f.shpБортик.Top + f.shpБортик.Height / 2 'Она по вертикали расположена посредине поля
'Вычисление шага:
dx = Макс_шаг * (1 - 2 * Rnd) 'Шаг по горизонтали случаен и не превосходит Макс_шаг
dy = Макс_шаг * (1 - 2 * Rnd) 'Шаг по вертикали случаен и не превосходит Макс_шаг
End Sub
Public Sub Действие() 'Главная_процедура шара, выполняется один раз на каждом импульсе таймера
If Поймали Then Выход_шара_из_игры 'Сначала шар определяет, не поймали ли его,
Отскакивать_или_нет 'затем, если бортик рядом, реагирует на него,
Шаг 'и наконец делает шаг
End Sub
Private Sub Отскакивать_или_нет() 'Реакция на бортик
If Шар_у_пола_или_потолка Then
dy = -dy 'Отскок от пола или потолка
ElseIf Шар_у_стен Then
dx = -dx 'Отскок от стен
End If
End Sub
Private Sub Шаг()
x = x + dx
y = y + dy
End Sub
Private Function Шар_у_пола_или_потолка() As Boolean
If y < f.shpБортик.Top Or y + Размер_шара > f.shpБортик.Top + f.shpБортик.Height Then
Шар_у_пола_или_потолка = True
Else
Шар_у_пола_или_потолка = False
End If
End Function
Private Function Шар_у_стен() As Boolean
If x < f.shpБортик.Left Or x + Размер_шара > f.shpБортик.Left + f.shpБортик.Width Then
Шар_у_стен = True
Else
Шар_у_стен = False
End If
End Function
Private Function Поймали() As Boolean
'ЕСЛИ расстояние по горизонтали между центрами шара и ловца меньше Дальности
'И если расстояние по вертикали между центрами шара и ловца меньше Дальности, ТО
If Abs(x - Ловец.x - ((Размер_ловца - Размер_шара) / 2)) < Дальность _
And Abs(y - Ловец.y - ((Размер_ловца - Размер_шара) / 2)) < Дальность _
Then
Поймали = True
Else
Поймали = False
End If
End Function
Private Sub Выход_шара_из_игры()
x = -10000: y = -10000: dx = 0: dy = 0 'Убрать шар подальше с глаз долой и чтоб не двигался
f.intЧисло_пойманных_шаров = f.intЧисло_пойманных_шаров + 1
End Sub
Запустите проект. Проверьте, правильно ли он работает. Поиграйте значениями шагов ловца и шара, их размерами, числом шаров и другими величинами, подберите наиболее удобные для себя.
Пояснения. Обратите внимание, что в обоих классах много одноименных переменных и процедур. Как я уже говорил чуть выше, никакой путаницы здесь произойти не может. Иметь одинаковые имена для элементов одинакового смысла удобно и правильно.
В модуле формы разберитесь самостоятельно. Я думаю, что комментариев достаточно. Поговорим подробнее о модуле шара. Совершенно аналогично модулю ловца здесь имеется два метода - Начальная_установка и Действие. Метод Действие главный, он определяет, что должен делать шар в каждое мгновение своего полета. Он должен знать, поймали его или нет, и пора ли отскакивать от бортика. Этому и посвящены первые две из трех строк процедуры Действие. Эти две строки вычисляют нужным образом dx и dy, а третья строка - Шаг - изменяет в соответствии с этими значениями координаты x и y. Все, больше ничего во время движения шара делать не нужно.
Теперь посмотрим, что происходит при нажатии на кнопку "Начинай сначала". Выполняется процедура cmd_Начинай_сначала_Click и после пары прыжков по процедурам Visual Basic передает управление процедуре Начальная_установка каждого шара. Здесь трудности у вас может вызвать вычисление dx и dy. Поскольку значение Rnd есть случайное число в диапазоне от 0 до 1, то легко видеть, что как dx, так и dy будут случайными числами в диапазоне от -100 до 100. Этого достаточно, чтобы шар полетел со случайной скоростью в случайном направлении.
Теперь насчет отскока. Возможно, тем, кто не очень силен в математике и физике, покажется удивительным, что для отскока от горизонтальной преграды достаточно выполнить оператор dy = -dy, то есть поменять вертикальную составляющую шага на ее противоположное значение. "Но это действительно так!" Аналогично, достаточно выполнить оператор dx = -dx для отскока от вертикальной преграды. Чтобы лучше понять этот факт, запустите пошаговый режим при Макс_шаг=1000 и Число_шаров=1. При этом проследите внимательно за dx и dy, x и y.
Недоработки проекта
Замеченные мной недоработки проекта вызваны нежеланием усложнять и увеличивать в объеме его код. Вот они:
· Иногда шар, вместо того, чтобы отскочить от борта, начинает двигаться скачками вдоль него. Возьмем к примеру левый бортик. Почти наверняка это связано с неточностью обработки вещественных чисел в операторе x=x+dx, в результате чего после отскока опять выполняется условие x < f.shpБортик.Left и шарик опять выполняет оператор dx = -dx. Рискну посоветовать (сам не проверял): в момент отскока незначительно увеличьте абсоютное значение шага: dx = -(dx+0.001).
· Я не знаю, как поведет себя шар, попавший точно в угол. По идее, он должен там застрять. Но у меня так ни разу не было.
· Постоянными нажатиями на клавиши направления мы можем передвигать ловца за пределами стола. Ни к чему это. Надо бы запретить.
Дата добавления: 2015-11-16; просмотров: 53 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Создаем ловца | | | Еще об объектах |