среда, 4 июля 2018 г.

Функции дебаггинга, всплывающие окна и интерфейс

Debugging переводится как отладка, устранение неполадок, поиск и исправление багов в программах или играх.

Эти функции создавались в GameMaker, да и в любых других средах, чтобы заниматься тестированием. Однако, многим новичкам так эти функции нравятся после первого знакомства, что они начинают их применять повсюду и в любых ситуациях, а это, на самом деле, не очень хорошо.


Классический GMS кодер негодует, ОК
Кстати, все картинки в этой статье кликабельны

Сегодня я в блоге Econ Dude расскажу про функции дебаггинга в Гейм Мейкер Студио, какие они бывают, как их использовать, покажу примеры из своих игр ну и вообще поговорим про этот функционал.

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

Как и говорил Анатолий Логиновских в интервью, начинать знакомство с синтаксисом лучше всего с официальной справки.



Как работают функции дебаггинга в GameMaker?


Как там сказано, эти функции будут выводить всплывающее окно, а программа в это время войдёт в замкнутый контур (closed loop - закрытую спираль...), другими словами всё, что происходило в игре, остановиться, в момент выполнения этих функций. При чём это будет сделано на более высоком уровне, на аппаратном, а не на уровне программы. Тут я, к сожалению, не абсолютно хорошо разобрался, поэтому точно не скажу что происходит в момент выполнения таких функций, но суть в том, что они смотрят как-бы внутренности игры и имеют очень высокий приоритет.

Как только в игре появляется баг (ошибка), программа выдаёт эту ошибку вам или игроку / пользователю именно в виде классического всплывающего окна, которое вы и вызываете с помощью функции show_message.

Я не так давно делал видео про то, как сделать паузу в GameMaker:


Так вот, там я рассказывал, что паузу не так уж и просто сделать, игру и все функции сразу мало что останавливает, но функции дебаггинга это делают. Хотя для паузы их использовать не стоит, так-как если вы например случайно закроете приложение в андроид, то вы начинаете чувствовать, как вызов этих функции работает именно как-то на программном уровне и вступает в конфликт с нормальным процессом.

Так-же давайте сразу скажу, чем эти функции плохи, и почему их стоит избегать. Почему их не стоит использовать для игрового функционала, если есть вариант сделать как-то иначе (а он есть почти всегда).

Тестируя свою игру Tribes Arena, где у меня полно этих функций, играя с телефона, я постоянно натыкаюсь на баги и зависания игры.



Чем и как заменить функцию show_message?


Классический пример:


Всплывающее окно показало все ресурсы игрока

А как нужно было делать? И почему я вообще так сделал?

Ответ очевиден, эта функция очень ленивая, она экономит кучу времени. По сути тут я с помощью одного куска кода просто перебрал переменные и их показал. Ну а как я должен был сделать? А я так тоже уже начал делать...

Видите сверху $0, 1000, 500, 100 разными цветами?

Основные ресурсы (золото, еда, дерево, камень) я отобразил нормально, отрисовал с помощью функций draw сверху комнаты, так и нужно делать. А как мне все ресурсы сразу отрисовать, если места мало на экране, а ресурсов много?

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

Это самый классический пример того, почему и как некоторые люди используют функции дебаггинга в GameMaker, и как можно их заменять. Я это уже делаю, сейчас новую версию пилю и раньше при нажатии на науку, у меня всплывало окно которое показывало все технологии и их текущий уровень.

Вот что я сделал сейчас в новой комнате:


Всё просто, удобно и большим шрифтом

Более того, я, если вы смотрели мои видео где я пишу код, тот еще извращенец и Китайско-Индусский кодер. Знаете что я сделал изначально?

Я выводил окно вида:

Вот ваши текущие технологии...

А потом выводил еще одно окно, где игрок вбивал цифру:

Выберите технологию для изучения [1-6]...

И потом в зависимости от введённой цифры я менял технологию, которую будет исследовать игрок. Ввели 1, будет исследовать сельское хозяйство и т.д. Ну ок, кто-то может даже улыбнётся, ведь это не я придумал, это было в очень старых программах или даже играх типа Adom и чего-то подобного.

Однако очевидно, что это ненормально и неудобно.

Вот сейчас я делаю функции торговли нормальными.



Чем и как заменить функцию show_question?


А какими был торговый интерфейс через функцию show_question?


4 шага и 4 всплывающих окна!

Выберите продукт, продать или купить через 1 и 2, потом выбираем объём сделки. Вот такая цепочка, которой вы программируйте одну постоянную торговую сделку. Да, вроде как функционала достаточно, но как же это криво...

Плюс, момент интуитивности и красоты, к таким программам люди сейчас очень не привыкли, нельзя игроков мучить такими вещами :)

А что надо было делать и как? Ну примерно:


Это из моего недоделанного симулятора биржи

Видите там стрелкой N. 500, вот это и есть выбор кол-ва акций, которое вы ходите купить или продать. А ниже кнопки купить и продать отдельно.

При чём, зачем вообще давать игроку выбор и разрешать ему выбирать любое значение? Я так не делал. Я просто сделал что при нажатии на N. 500 он меняет размер сделки на 1к, 5к, 10к, а потом обратно вниз 1, 10 и 100.

Я просто разбил всё на шаги, хотя можно и нужно в таких случаях делать ползунки с кнопками плюс и минус, вот что нужно делать.

А не как делают курильщики и хардкорщики.

Это всё опять-же к примеру того, как можно и даже нужно заменять функции дебаггинга чем-то еще, более удобным.



Диалоги и всплывающие окна можно делать иначе


Другой пример есть в моём видео про диалоги:


Да и статья про это есть.

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


Всплывающее окно диалога, когда мы подошли к NPC

Конечно, многие новички, если им нужно делать какие-то окна диалогов, будут делать это именно с помощью функций дебаггинга, но посмотрев видео вы поймёте, что можно всё сделать довольно просто и куда удобнее.

Технические детали есть в статье и в видео.

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



Функции дебаггинга в GameMaker, список


Вот они какие:

  • debug_mode
  • get_integer
  • get_string
  • show_error
  • show_message
  • show_question
  • show_debug_message
  • show_debug_overlay
  • code_is_compiled
  • fps
  • fps_real

Жирным я подчеркнул те, которые многие используют чаще всего, хотя к примеру вывод fps - это очень полезная и крутая функция, которую как раз нужно использовать, если вам нужно отобразить кол-во кадров в секунду.

По сути дела функция show_message была придумана для показа информации и сообщений о программных ошибках, а не чтобы вы с помощью этой функции делали вообще всё. В старых версиях Гейм Мейкер так и вообще можно было к примеру раскрашивать эти всплывающие окна, менять их прозрачность и многое другое, тогда их реально многие использовали для игровых функций.

Помню тогда еще можно было выводить такие всплывающие окна с выбором из разных вариантов и с несколькими кнопками, и можно было переименовывать кнопку "OK" как угодно. Вот тогда так и делали диалоги.

Может это всё сейчас можно, но я не вижу этого в справке.



Про функции get_integer и get_string


Хочется сказать, что адекватного аналога get_integer и get_string я на самом деле не знаю, а эти функции иногда кровь из носа нужны. Они позволяют запросить ввод переменной или строки (цифр или букв) от игрока.

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


На самом деле да, кода-то не так уж и много...

Вот кусок кода:

global.blue_market_volume=get_integer(string('Volume'), global.blue_market_volume)

Идёт запрос объёма торгов на рынке (market_volume). Эта переменная будет равна значению, которое сам игрок и задаст во всплывающем окне. 

Там нужно указать только 2 вещи, что писать во всплывающем окне, а так-же базовое значение в этом окне. Тут оно у меня уже равно текущему. К примеру если текущий объём сделки 50 единиц, то в окне по умолчанию тоже будет 50, чтобы игрок знал какой у него уже стоит объём сделки.

Вы видите что есть соблазн использовать такие функции, они не очень-то и сложны, а иногда трудно найти им замену. Вы так-же можно через get_string получать кастомные имена или названия, например делать запрос на ввод имени игрока или персонажа. И как иначе это сделать в GameMaker? Я, если честно, не знаю.

Ну кроме того, чтобы прикрутить свою новую виртуальную клавиатуру, но зачем? Кстати, когда вы делайте вот такой запрос на букву или цифру, у вас в Android выводиться как раз программная клавиатура (а что еще должно было выводится?...) и вот тут тоже понятно, что функции дебаггинга имеют прямое взаимодействие с аппаратными функциями операционной системы устройства или что-то такое.

Что касается функции show_message, то есть довольно простые способы её заменить и сделать всё иначе, например:


Всплывает окно и подсказка

Как бы вы этой функцией нарисовали пример того, как нужно подбирать место для деревни, или вообще как там что-то нарисовать? Там можно только писать. При этом кликабельна не кнопка ОК тут, а вообще всё окно. Сделать это очень просто, создаёте объект поверх других да и всё, как делать кнопки и элементы меню я тоже уже писал. Единственное что, не забывайте блокировать задний фон. То есть чтобы пока у вас существует этот объект (if instance_number(o_help_1)>0) у игрока не должно быть возможности случайно нажимать на клетки позади этого объекта.

Про это я говорил в видео о строительстве.

Делал подобную мелкую справку вначале я в игре City Rush, а так-же в последней версии игры про вирус


Всплывающее окно

Вы могли бы выводить текстовое сообщение где рассказывать о том, как нужно строить ваш город или поселение, но нужно много слов. 

А можно просто показать одну наглядную картинку и всё.


Вот так, вместе этого вашего show_message

show_question работает похожим образом, но он позволяет отказаться от выполнения какой-то вещи, по сути это аналог IF и выбор между true / false. Тут чуть сложнее это заменить, но тоже можно на самом деле.



Еще пару слов про интерфейс


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

Ответ вы можете найти на форуме gcup.ru, в hellroom, да и самому можно придумать как это сделать. Делайте большую комнату например по горизонтали или по вертикали, потом делайте вид (про это есть статья и видео у меня), и просто перемещаете эту область видимости. Это один из способов, есть и другие.

Можно делать и не так, можно разбивать всё на категории:


Сверху переключение между комнатами: STATS / SKILLS

Это пример из RPG, которую я забросил (вот видео про эту игру).

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

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

Я этой статье я не рассказал собственно говоря про деббагинг в GMS, про debug mode и про функции типа show_debug_overlay, так-как лично я практически не использую этот режим, но возможно позже я напишу еще одну статью о поиске ошибок, тестировании и дебаггинге, где покрою эти вещи.

Мой базовый обучающий курс по GameMaker вы найдёте в YouTube, а статьи лежат в блоге Econ Dude на специальной странице: