Мегаобучалка Главная | О нас | Обратная связь


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



2015-11-11 638 Обсуждений (0)
Первая часть – рисуем поле для гонки 0.00 из 5.00 0 оценок




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

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 = Картинка 'Придаем полю картинку, нарисованную в памяти

Me.Refresh()

End Sub

 

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

Гр.FillRectangle(Brushes.White, Отступ, Отступ, Размер_поля, Размер_поля) 'Асфальт на поле белый

End Sub

 

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

X_старта = Отступ + Размер_поля - Размер_старта 'Чтобы старт находился у правой кромки поля

Y_старта = Отступ + Размер_поля / 2 'Чтобы старт по высоте находился посредине поля

Гр.FillRectangle(Brushes.Blue, X_старта, Y_старта, Размер_старта, Размер_старта)

End Sub

 

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

X_финиша = Отступ 'Чтобы финиш находился у левой кромки поля

Y_финиша = Y_старта 'Чтобы финиш по высоте находился на одном уровне со стартом

Гр.FillRectangle(Brushes.Red, X_финиша, Y_финиша, Размер_финиша, Размер_финиша)

End Sub

 

Sub Рисуем_газоны() 'Каждый газон - это прямоугольник случайного размера в случайном месте

Const Число_газонов As Short = 30

Dim Макс_размер_газона As Short = Размер_поля / 6

Dim X_газона, Y_газона As Short 'Горизонтальная и верт. координаты верхнего левого угла газона

Dim i As Short

For i = 1 To Число_газонов 'Числа в формулах подобраны на опыте:

X_газона = Отступ + 2 * Размер_финиша + Размер_поля * Rnd() * 3 / 5

Y_газона = Отступ + Размер_финиша + (Размер_поля - Размер_финиша - Макс_размер_газона) * Rnd()

Гр.FillRectangle(Brushes.Green, X_газона, Y_газона, Макс_размер_газона * Rnd(), _

Макс_размер_газона * Rnd())

Next

End Sub

 

Определяем размеры. Взгляните на первые 6 строчек кода. Числа 20, 500, 4, 10, 40 подобраны мной, исходя из возможностей компьютера и моих вкусов. У вас они вполне могут быть другими. Объявления многих констант и переменных в первых 7 строках я вполне мог бы упрятать внутрь процедур, но не стал этого делать в надежде, что в будущем, при развитии проекта, они могут понадобиться многим процедурам.

Рисуем в памяти. Что рисовать – понятно, а вот где рисовать – это вопрос. Вы скажете: Что за вопрос? Ясно, что на форме! – На форме-то – на форме, да вот сразу же или сперва в памяти, а уж потом перенести рисунок на форму? Есть у меня такая мысль: Когда наш автомобиль будет разъезжать по полю, нам надо будет в каждый момент времени знать, где он находится: на асфальте, на газоне, на финише или уткнулся в ограждение. Проще всего это сделать, анализируя цвет под колесами автомобиля: белый асфальт, зеленые газоны, красный финиш или серое ограждение. Для этого удобно анализировать методом GetPixel цвет пикселя в объекте Bitmap. Значит рисовать придется сначала в памяти.

Будем действовать, как сказано в 12.4. Организуем в памяти «пустой лист для рисования». Для этого предназначены строки 8-10.

Загружаем форму. Содержимое процедуры Form1_Load ясно без пояснений. В эту процедуру программисты всегда вставляют то, что должно быть сделано один раз за все время выполнения проекта, причем в самом начале. После загрузки формы мы ничего на ней не видим, кроме кнопки. Эта процедура у нас еще будет расти.

Кнопка_начинай_сначала. Процедура Кнопка_начинай_сначала_Click начинается с того, что мы заполняем картинку в памяти светло-серым цветом. Это цвет ограждения в наших гонках. Дальше идет обращение к процедуре Рисуем_поле, которая просто рисует на этом сером фоне белый квадрат поля для гонки. Дальше идет обращение к трем процедурам рисования старта, финиша и газонов. Картинка в памяти готова. Предпоследняя строка процедуры делает эту картинку значением свойства формы BackgroundImage, то есть она становится «фоном» этой формы. Я мог поступить по-другому и перенести эту картинку на поверхность формы методом DrawImage класса Graphics, но в этом случае мне не удалось бы привычными средствами сделать PictureBox с изображением машины прозрачным, ведь так называемая «прозрачность» работает только по отношению к BackgroundImage. К тому же я предпочел не заботиться о перерисовке. Запустив проект, растяните форму и вы увидите, что картинка покрывает форму мозаикой. Последняя строка процедуры «проявляет» новый «фон» на форме, перерисовав ее оператором Me.Refresh().

Рисуем поле, старт и финиш. Содержимое соответствующих процедур очевидно. В формулах, определяющих координаты старта и финиша, вы легко разберетесь самостоятельно.

Рисуем газоны. Здесь в цикле рисуется 30 газонов, в каждой итерации по одному. Вы видите, что некоторые константы и переменные я объявил внутри процедуры. Так поступают, когда знают, что их значения нигде, кроме как в этой процедуре, не нужны. Значения чисел и вид формул для X_газона и Y_газона я выбрал так, чтобы газоны получались не слишком большие и не накладывались ни на ограждения, ни на старт с финишем. К тому же слишком большие газоны сольются в один большой газон и между ними нельзя будет проехать. Вид формул не принципиален, и если вам не хочется разбираться в них, можете их просто списать или придумать свои.

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



2015-11-11 638 Обсуждений (0)
Первая часть – рисуем поле для гонки 0.00 из 5.00 0 оценок









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

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...



©2015-2020 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (638)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)