ПОНЯТНО О Visual Basic NET (том 2)

Ряд фонарей и аллея


Ряд фонарей. Эта процедура строится совершенно аналогично процедуре Ряд_деревьев. Создайте ее самостоятельно. Вот что получилось у меня:

Sub Ряд_фонарей(ByVal x As Single, ByVal y As Single, ByVal Размер As Single, ByVal Число_фонарей  _

As Integer, ByVal Шаг_по_гориз As Single, ByVal Шаг_по_вертик As Single, ByVal Увеличение As Single)

        Dim i As Integer

        For i = 1 To Число_фонарей

            Фонарь(x, y, Размер)

            x = x + Шаг_по_гориз

            y = y + Шаг_по_вертик

            Размер = Размер + Увеличение

        Next

End Sub

Процедуры Ряд_деревьев и Ряд_фонарей до смешного одинаковы. Это значит, что если как следует подумать, процедуру Ряд_фонарей не надо было выдумывать, а надо было просто скопировать Ряд_деревьев и немного изменить.

Одинаковость наводит еще на одну мысль: а что, если сделать единую процедуру для рисования ряда деревьев или фонарей? Что именно рисовать, решают еще один строковый параметр и оператор If внутри процедуры. Но это упражнение я оставляю для энтузиастов.



Теперь добавьте в главную процедуру рисования вызов процедуры рисования ряда фонарей на горизонте:

        Ряд_фонарей (20,    Уровень_горизонта - 30,    70,    6,    25,    0,    0)                    'на горизонте

Кстати, ваше окно кода сильно выросло и доставляет вам неудобство тем, что для поиска нужной процедуры вам приходится его долго прокручивать вверх-вниз. Хотите избавиться от лишней прокрутки – перечтите 6.1.3 и щелкните по крохотным минусикам у заголовков ненужных пока процедур. Их тела скроются из вида, освободив дефицитное место. Чтобы их вернуть, щелкайте по плюсикам.

Аллея. Мы прекрасно понимаем, что вместо создания и вызова процедуры Аллея можно бы просто написать два вызова процедуры Ряд_деревьев и один вызов процедуры Ряд_фонарей. И мороки было бы меньше. Все это верно. Но в этом случае мы ослушались бы прохожего, а этого нельзя делать, потому что мы нарушили бы великий принцип простоты и наглядности. К тому же, кто знает, может быть в будущем наш парк украсится несколькими аллеями? А?


Пояснять процедуру Аллея излишне. Вот она:
Sub Аллея()
        Ряд_деревьев(220, Уровень_горизонта - 30, 30, 20, -22, 20, 10)                      'левый
        Ряд_деревьев(240, Уровень_горизонта - 30, 30, 20, 12, 20, 10)                       'правый
        Ряд_фонарей(220, Уровень_горизонта, 70, 20, -36, 64, 30)
End Sub
Обратите внимание, что значение первого параметра во всех трех обращениях почти одинаково. Это наводит на мысль превратить его в параметр процедуры Аллея. Вот так:
Sub Аллея(ByVal x As Single)
        Ряд_деревьев(x, Уровень_горизонта - 30, 30, 20, -22, 20, 10)                      'левый
        Ряд_деревьев(x + 20, Уровень_горизонта - 30, 30, 20, 12, 20, 10)               'правый
        Ряд_фонарей(x, Уровень_горизонта, 70, 20, -36, 64, 30)
End Sub
А вот окончательный вид главной процедуры рисования парка:
Private Sub Рисуем_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Рисуем.Click
        Гр = Me.CreateGraphics
        Звездное_небо()
        Месяц()
        Земля()
        Пруд()
        Три_одиночных_дерева()
        Два_одиночных_фонаря()
        Ряд_деревьев(400, Уровень_горизонта - 30, 30, 20, 15, 0, 0)                            'на горизонте
        Ряд_фонарей(20, Уровень_горизонта - 30, 70, 6, 25, 0, 0)                                 'на горизонте
        Аллея(220)
End Sub
Проект завершен.
Меняя параметр процедуры Аллея, мы сдвигаем всю аллею целиком влево-вправо. Ощущение могущества! Чем хорошо программирование: минимальные усилия, а результат меняется колоссально. Если бы мы рисовали вручную, сколько времени нам понадобилось бы, чтобы перерисовать всю аллею?
Попробуйте как следует понизить уровень горизонта. Вся земля сдвинулась, а пруд и окружающие его деревья и фонари остались на месте. В результате чего очутились на небе. Н-да-а … Это потому, что при их рисовании мы уровень горизонта не учитывали.

Содержание раздела