Найти тему

Решение одной конкретной задачи на Game Maker

Оглавление

Добрый день, дорогие читатели! Не появлялся в Дзене более месяца и решил написать хоть что-то, чтобы вы не думали, что я слился окончательно. :-) Отсутствовал по причине праздников, плотной работы над основной игрой, подготовкой порта еще одной своей старой игры под ВК Плей и помощью новичкам с Game Maker. Вот как раз о последнем и хотел бы написать небольшую статью.

Скриншот из моей игры, которую сейчас готовлю для релиза в ВК Плей (для обложки статьи)
Скриншот из моей игры, которую сейчас готовлю для релиза в ВК Плей (для обложки статьи)

С чего все началось?

Я уже неоднократно писал, что по мере возможностей стараюсь иногда помогать новичкам, что-то подсказывать по движку и т.д. Не всегда конечно есть на это время, но иногда даже полезно отвлечься от разработки основной игры и переключиться на какую-нибудь небольшую стороннюю задачу.

Не так давно ко мне обратилась девушка (оставлю ее анонимной). В общении выяснилось, что она читает этот блог на Дзене и так же пробует себя в геймдеве. Для начала она пробует создать небольшую игру про кота и мышей, что несомненно правильное решение, так как самая распространенная ошибка начинающих - это браться сразу за крупный проект. На каком-то этапе у нее возникла проблема, которую и хотел бы разобрать в этой небольшой статье.

В чем была проблема и почему так важно уметь объяснять задачу?

Да, сама по себе задача очень простая, но для новичков даже такие моменты могут вызывать сложности. Задача была следующей (описал прям дословно):

Есть кот (игрок) и мышь.

Когда кот заходит в радиус видимости мыши, то мышь убегает в ближайшую нору. Но если нора закрыта, то она должна бежать до препятствия, увидеть его и после этого побежать в другую следующую ближайшую нору.

Вроде ничего сложного нет. Начали мыслить с добавлением всех нор в массив, сортировкой их по удаленности и т.д. Чтобы когда мышь, не добежав до какой-то нор из за препятствия, исключала эту нору из списка и выбирала целью следующую по приближенности нору. Но все придумывали из за того, что не было четкого понимания, как должна была выглядеть игра. Ведь я её сразу представил как-то так (с видом сверху и возможностью движения кота и мыши во всех направлениях):

Как я представил себе игру изначально
Как я представил себе игру изначально

Девушка скидывала объемные коды, которые мне показались совсем неуместными и тогда я попытался наводящими вопросами уточнить задачу. А для простоты понимания, вообще попросил нарисовать как это все должно выглядеть в игре. И что по итогу получилось? Девушка прислала вот такие рисунки:

Рисунок 1
Рисунок 1
Рисунок 2
Рисунок 2

Т.е., как выяснилось, вид в игре был сбоку, мышь может пробегать мимо кота и нор на уровне может быть всего 2, от силы 3. И это моментально все упростило!

Решение задачи

Когда появилось время, я решил написать небольшой прототипчик, и вот, что у меня получилось по итогу:

Наглядное видео работы созданного прототипа
Наглядное видео работы созданного прототипа

Т.е. у мыши получается всего несколько возможных вариантов действия:

1) Когда игрок-кот заходит в радиус обнаружения мыши (пометил в игре оранжевой окружностью), то мышь выбирает для себя самую ближайшую нору и бежит к ней.

2) Если на пути у мыши возникает препятствие, то она просто разворачивается, так как даже если следующая ближайшая нора будет за препятствием, то мышь все равно туда не проберется, у нее в этом случае лишь один вариант - развернуться и бежать назад (что и упростило код).

3) Если мышь добегает до норы, то она прячется в нее. Далее по задумке автора мышь должна там сидеть какое-то время (смеяться над котом) и выбегать. Я это не реализовывал, но это уже сделать не сложно.

Показав видео девушке, она подтвердила, что это именно то, что ей нужно. Тогда я подробно закомментировал весь код и скинул ей. Код не стал оптимизировать и как-то улучшать, можно было конечно сделать еще короче, но скинул как есть. Вот что получилось:

Код события создания объекты мыши (Create):

Код Create объекта мыши
Код Create объекта мыши

Код события шага объекта мыши (Step):

Код Step объекта мыши
Код Step объекта мыши

Код события рисования объекта мыши (Draw):

Код Draw объекта мыши
Код Draw объекта мыши

Вот и все! Код объекта кота уже показывать не стал, да там и нет чего-то такого необычного - просто движение влево-вправо по нажатию клавиш, да смена анимации кота с состояния покоя на бег. Кстати, спрайты кота и мыши я специально скачал с интернета, чтобы прототип получился нагляднее. ))

Заключение

К чему я написал эту статью?

Во-первых, чтобы донести до вас мысль, что нужно тренироваться объяснять свои задумки по игре, задачи другим людям! Это очень важно если вы планируете работать не одни, а в команде (тем более удаленно)! Если вы автор игры (вы ее придумали), но вы не пишите код, не рисуете графику, не создаете уровни, то общее видение игры только у вас в голове! Как люди поймут, что делать, если они даже не понимают как должна по итогу выглядеть игра? Именно для этих целей в геймдеве существует такое понятие как дизайн документ (или кратко диздок). Именно в нем геймдизайнер подробно описывает, зарисовывает схемы, наброски, объясняет работу всех объектов в игре и т.д. Т.е. совершенно посторонний человек, взяв этот документ и прочитав его, в идеале должен в своей голове получить аналогичную картинку игры, как ее видит изначально автор. На своей практике, повторюсь, это очень важно. К примеру, я работаю в команде с художником, и ставлю ему задачи на отрисовку того или иного объекта и малейшее недопонимание задачи (а правильнее будет сказать, что это постановщик задачи налажал и не смог объяснить верно) приводит к тому, что художник рисует не то, что нужно, тратя свое время. У нас бывали такие случаи. И если вам интересна тема создания игр, то вы можете потренироваться написать такой диздок, дать почитать его другим людям и проверить, правильно ли они поняли вашу задумку по игре или нет.

Во-вторых, чтобы вы, зная задачу (а я ее описал в тексте), посмотрели код и попытались вникнуть в него и для себя уяснить, все ли вам в нем ясно или есть какие-то непонятные моменты. Чтение чужого кода иногда тоже бывает очень полезным. Но тут, конечно, необходимо знание движка Game Maker и его функций.

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