Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Создаем шар. Завершаем проект






Модуль класса 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).

· Я не знаю, как поведет себя шар, попавший точно в угол. По идее, он должен там застрять. Но у меня так ни разу не было.

· Постоянными нажатиями на клавиши направления мы можем передвигать ловца за пределами стола. Ни к чему это. Надо бы запретить.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.