Студопедия

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

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

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






  • Как продвинуть сайт на первые места?
    Вы создали или только планируете создать свой сайт, но не знаете, как продвигать? Продвижение сайта – это не просто процесс, а целый комплекс мероприятий, направленных на увеличение его посещаемости и повышение его позиций в поисковых системах.
    Ускорение продвижения
    Если вам трудно попасть на первые места в поиске самостоятельно, попробуйте технологию Буст, она ускоряет продвижение в десятки раз, а первые результаты появляются уже в течение первых 7 дней. Если ни один запрос у вас не продвинется в Топ10 за месяц, то в SeoHammer за бустер вернут деньги.
    Начать продвижение сайта
  • Создаем шар. Завершаем проект






    Модуль класса 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 :: Мои Лекции
    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
    Копирование текстов разрешено только с указанием индексируемой ссылки на источник.