Всем привет, и добро пожаловать в "Страну Монстров" - игру, которую я делаю по мотивам статьи в журнале "Техника-Молодёжи".
Зовут меня Алёна, я изучаю программирование, и в качестве учебного задания воссоздаю эту игру на Visual Basic.
На канале уже есть несколько публикаций по Visual Basic (VB) и Visual Studio (VS), да и про "Страну монстров" тоже писала не раз. К статье прикреплён видеоролик, где я наглядно демонстрирую свои успехи.
Чтобы не впадать в "заумь", как в предыдущей статье, я лучше сразу порекомендую вам свой самоучитель, автор которого объяснит всё гораздо лучше меня. Знакомьтесь: С. Н. Лукин, "Понятно о Visual Basic. NET". Самоучитель в трёх томах. На мой взгляд - просто идеальный самоучитель, но, к сожалению, он ориентирован на VS 2003 года, но, по словам автора, подходит и к VS 2005.
По моему опыту - к VS 2008 тоже подходит, хотя и не во всех случаях. Кое-что приходится выяснять самой.
Ну а теперь перехожу к игре! Задача следующая - создать игровое поле 20х20 клеток, игрока и его противника. Нанести на игровое поле координатную сетку, нарисовать реку, и сделать так, чтобы игрок не мог ходить по воде. Для переправы через реку сделать мост.
И для интереса - установить ограничение в 100 ходов для игрока, после чего игра закончится. Но, если игрок догонит противника, количество ходов увеличится на 50. Противник при этом исчезнет - но снова появится в случайном месте карты.
И, кстати! Противнику я тоже поставила ограничение 100 ходов, но когда они заканчиваются, он просто пропадает в одном месте, но появляется в другом. А вот и видео, как это всё работает, и как сделано. Код прокручивается в конце ролика, в него добавлены комментарии для пояснений.
Ну а теперь расскажу о проблемах. Первое, с чем я ошиблась - размер игрового поля. Клетку я решила сделать 40х40 пикселей, стало быть, поле должно быть 800х800. А не тут то было, у формы ведь есть ещё бордюры, так что наружный размер должен быть больше внутреннего. И чтобы не заморачиваться с "методом научного тыка", я сделала два дополнительных окошка, в которых показывалось значения х, у - положение игрока на карте. И после запуска, передвигая игрока, просто записывала координаты, которые потом использовала - как для задания размеров формы, так и для рисования реки. Эти окошки есть до сих пор, но теперь они показывают координаты противника.
Далее, в качестве игрока я использую метку, с помещённой на неё картинкой - картинку пришлось уменьшить до размера 40х40. Картинка такого же размера используется для метки противника. Все картинки я сразу размещаю в папке Image своего проекта. А к меткам я их прикрепляю в окне дизайна, через свойство Image.
Ещё одна сложность - необычное положение осей координат. Начало отсчёта - левый верхний угол. И если ось Х, как и положено, идёт слева направо, то ось У направлена вертикально вниз. Можно, конечно, переключиться на более привычный вид, но такое положение осей координат является общепринятым, так что лучше привыкать сразу. Вот поэтому игрок и появляется у меня в левом верхнем углу, в точке с координатами 0,0. На эти координаты и ориентируется компьютер, когда я нажимаю клавиши управления, оценивая возможность перемещения игрока, наличие препятствия (река) и противника. Операторов If пришлось использовать очень много😊.
И немного о рисовании. В VB нет готового инструмента рисования, вроде кнопки или метки. Графический объект необходимо сначала объявить, как переменную, затем создать, а уже потом использовать. И для каждого элемента нужен свой графический объект - то есть, если я собираюсь рисовать не только на форме, но и на метках, мне придётся создать три графических объекта. Но пока мне этого не надо, так что обойдусь одним.
Dim Pero As Graphics
В этом выражении объявляется графический объект Pero. Заметьте, я объявляю объект Pero в самой верхней части программы, в процедуре Public Class Form1. А создавать и использовать его я буду в другой процедуре. Почему именно так - расскажу в посте об области видимости переменных.
Pero = Me.CreateGraphics -
вот так объект Pero создаётся.
Pero.FillRectangle (Brushes.Aquamarine, 0, 360, 800, 40) - так рисуется закрашенный прямоугольник (FillRectangle) кистью (Brushes) аквамаринового цвета (Aquamarine) левый верхний угол которого расположен в точке х=0, у=360, длиной 800 а шириной 40 пикселей. В программе вместо абсолютных значений, как здесь, я буду использовать переменные, чтобы положение реки можно было изменить. И таких выражений понадобится три - два рисуют мелководье, более светлого цвета, а одно - более тёмный центральный поток.
Мост рисуется по такому же принципу. А вот координатная сетка - нет. Я также использую Pero, но метод рисования будет DrawLine, рисование линий.
Pero.DrawLine(Pens.Black, 0, 40, 800, 40)
Будет нарисована линия чёрного цвета с началом в точке х=0, у=40 и концом в точке х=800, у=40. И таких линий нужно провести 19 по горизонтали и 19 по вертикали. Чтобы не писать почти 40 выражений в программном коде, я использую 2 цикла For - Next, которые рисуют координатную сетку сами.
Вот такое оно, рисование в VB.😊 Есть ещё одна тонкость - если рисовать в процедуре загрузки, изображение долго не протянет. Передвигая игрока, я обнаружила, что линии сетки координат стираются. И если форму перетащить за край экрана, а потом вытащить обратно - изображение с неё тоже пропадёт. Поэтому рисовать нужно в процедуре обработки события Paint, связанном с формой. При этом отрисовка происходит несколько раз в секунду, и стёртые элементы восстанавливаются.
Вот, пожалуй, на сегодня и всё. Добавлю только, что это лишь начало. И многое придётся переделывать - уменьшить количество переменных, создать пользовательские процедуры обработки событий, ну и поработать над географией, флорой и фауной "Страны..."
Пока я нарисовала только скалу и дерево. Так что всё ещё впереди.