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

         

Первая часть – рисуем поле для гонки


Что рисовать.

1.       Сначала рисуем сам квадрат поля

2.       Затем старт и финиш

3.       Затем газоны

Код первой части. Разместите на форме кнопку. Дайте ей имя Кнопка_начинай_сначала. Приведу работающую версию первой части программы, а вслед за ней – пояснения.

Const Отступ As Short = 20                        'Имеется в виду отступ поля от края формы слева и сверху

Const Размер_поля As Short = 500           'Поле - квадрат, это сторона квадрата

Const Высота_формы As Short = Размер_поля + 4 * Отступ       'Оставляем отступ снизу    

Const Ширина_формы As Short = Размер_поля + 10 * Отступ    'Оставляем справа место для кнопок и меток

Const Размер_старта As Short = 40                                        'Старт - квадрат, это сторона квадрата

Const Размер_финиша As Short = 40                                     'Финиш - квадрат, это сторона квадрата

Dim X_старта, Y_старта, X_финиша, Y_финиша As Short   'Координаты старта и финиша

'Создаем пустую поверхность величиной с форму:



Dim Картинка As New Bitmap(Ширина_формы, Высота_формы)                      

Dim Гр As Graphics = Graphics.FromImage(Картинка)           'Создаем над ней объект класса Graphics

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    Me.Width = Ширина_формы

    Me.Height = Высота_формы

    Randomize()                                                                            'Нам придется рисовать случайные газоны

End Sub

Private Sub Кнопка_начинай_сначала_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)  _

Handles Кнопка_начинай_сначала.Click

    Гр.Clear(Color.LightGray)                      'Стираем светло-серым цветом предыдущую картинку, если была

    Рисуем_поле()

    Рисуем_старт()

    Рисуем_финиш()

    Рисуем_газоны()

    Me.BackgroundImage = Картинка                'Придаем полю картинку, нарисованную в памяти


Будем действовать, как сказано в 12.4. Организуем в памяти «пустой лист для рисования». Для этого предназначены строки 8-10.
Загружаем форму. Содержимое процедуры Form1_Load ясно без пояснений. В эту процедуру программисты всегда вставляют то, что должно быть сделано один раз за все время выполнения проекта, причем в самом начале. После загрузки формы мы ничего на ней не видим, кроме кнопки. Эта процедура у нас еще будет расти.
Кнопка_начинай_сначала. Процедура Кнопка_начинай_сначала_Click начинается с того, что мы заполняем картинку в памяти светло-серым цветом. Это цвет ограждения в наших гонках. Дальше идет обращение к процедуре Рисуем_поле, которая просто рисует на этом сером фоне белый квадрат поля для гонки. Дальше идет обращение к трем процедурам рисования старта, финиша и газонов. Картинка в памяти готова. Предпоследняя строка процедуры делает эту картинку значением свойства формы BackgroundImage, то есть она становится «фоном» этой формы. Я мог поступить по-другому и перенести эту картинку на поверхность формы методом DrawImage класса Graphics, но в этом случае мне не удалось бы привычными средствами сделать PictureBox с изображением машины прозрачным, ведь так называемая «прозрачность» работает только по отношению к BackgroundImage. К тому же я предпочел не заботиться о перерисовке. Запустив проект, растяните форму и вы увидите, что картинка покрывает форму мозаикой. Последняя строка процедуры «проявляет» новый «фон» на форме, перерисовав ее оператором Me.Refresh().
Рисуем поле, старт и финиш. Содержимое соответствующих процедур очевидно. В формулах, определяющих координаты старта и финиша, вы легко разберетесь самостоятельно.
Рисуем газоны. Здесь в цикле рисуется 30 газонов, в каждой итерации по одному. Вы видите, что некоторые константы и переменные я объявил внутри процедуры. Так поступают, когда знают, что их значения нигде, кроме как в этой процедуре, не нужны. Значения чисел и вид формул для X_газона и Y_газона я выбрал так, чтобы газоны получались не слишком большие и не накладывались ни на ограждения, ни на старт с финишем. К тому же слишком большие газоны сольются в один большой газон и между ними нельзя будет проехать. Вид формул не принципиален, и если вам не хочется разбираться в них, можете их просто списать или придумать свои.
Результат. После ввода всего вышеприведенного кода у вас при каждом нажатии на кнопку Начинаем сначала должны рисоваться поле, старт, финиш и новая конфигурация газонов.

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