BGT — Меню

Поговорим о создании меню в своих играх в BGT.
Дело это очень важное, так как чаще всего любая уважающая себя игра начинается с меню, в котором пользователь может выбрать нужный пункт.
Также вы, возможно, захотите создавать менюшные игры, где пользователь будет выбирать из нескольких пунктов меню и играть. Так примерно делаются квесты.
Мы создадим простейшее меню, в котором будет 3 пункта:
Начать игру, Проверка динамиков, Выход.
В BGT есть уже готовый подключаемый модуль, с помощью которого можно легко создавать менюшки.
Называется это дело ума человеческого dynamic_menu.bgt.
Также нужно подумать о том, как будет озвучиваться ваше меню.
Я имею ввиду озвучку пунктов. Можно сделать это при помощи встроенных в windows синтезаторов речи, можно при помощи записанных голосовых файлов, а можно и при помощи любимых всем нам скрин ридеров.
Давайте не будем выделываться с записью голоса и озвучим наше меню с помощью скрин ридеров.
Такой вариант — самый популярный.
Я буду озвучивать меню при помощи скрин ридера NVDA.
//Подключаем модуль
#include»dynamic_menu.bgt»;
//Создадим объект меню. Помните, когда изучали sound_pool, тоже создавали объект, с помощью которого мы управляли звуками, так вот тут такая же система.
dynamic_menu m;
//Создадим переменную результата. Она нам понадобиться, чтобы создавать условия на пункты меню.
int result;
//Ну, как обычно, делаем главную функцию.
void main() {
//Подключаем библиотеку NVDA, которую предворительно положим в ту папку, где и скрипт.
screen_reader_set_library_path(NVDA, «NVDA.dll»);
//Как обычно, делаем окно игры.
show_game_window(«Тест»);
//Настраиваем меню.
//Делаем так, чтобы пользователь мог клавишей escape закрыть меню.
m.allow_escape=true;
//Если бы я написал false, то пользователь не смог бы закрывать меню клавишей escape.
//Сделаем прокрутку меню, чтобы, когда пользователь оказался на последнем пункте меню и нажал стрелку вниз, то попал на первый пункт.
m.wrap=true;
//Как вы понимаете, здесь тоже только 2 возможных значения: true и false.
//Теперь назначим скрин ридер, с помощью которого будет озвучиваться наше меню. В моём случае это NVDA.
m.set_speech_mode(NVDA);
//Вы можете тут место NVDA написать например JAWS.
//Далее создаём сами пункты нашего меню.
m.add_item_tts(«Начать игру»);
m.add_item_tts(«Проверка динамиков»);
m.add_item_tts(«Выход»);
//Теперь нужно наше меню, собственно, запустить.
result=m.run(«Выбирите пункт меню и нажмите ENTER», true);
//Как вы поняли, я присвоил эту команду переменной result, которую объявлял в начале.
//А вот теперь назначаем нашим пунктам соответствующие действия с помощью условий.
//На первый пункт мы назначаем функцию game(), которую напишем позже. В ней и будет сама игра.
if(result==1)
game();
//Во втором пункте мы запускаем функцию, в которой проверяются динамики.
if(result==2)
test_speakers();
//В третьем пункте мы просто делаем выход.
if(result==3)
exit();
//Ну и напоследок, если result равна нулю, то также делаем выход. Это условие срабатывает, когда пользователь нажимает escape.
if(result==0)
exit();
}
void game() {
alert(«Сообщение», «Это функция игры, правда тут пока пусто. «);
exit();
}
void test_speakers() {
alert(«Сообщение», «Это проверка динамиков, правда тут тоже пока ничего нету. Вот такая вот беда. «);
exit();
}
Если бы мы использовали место add_item_tts просто add_item, то в кавычках нужно было бы писать имя голосового файла, который мы назначаем на озвучку этого пункта.
Бывает так, что при нажатии на пункт меню у вас должно появляться подменю.
Давайте сделаем так, будто у нас при нажатии на пункт «Начать игру» вылезает меню, где нужно выбрать уровень сложности.
Тогда делается это так:
if(result==1) {
m.reset(false);
m.allow_escape=false;
m.wrap=true;
m.add_item_tts(«Лёгкий»);
m.add_item_tts(«Средний»);
m.add_item_tts(«Трудный»);
m.add_item_tts(«Назад»);
result=m.run(«Выбирите уровень сложности», true);
if(result==1)
game1();
if(result==2)
game2();
if(result==3)
game3();
if(result==4)
exit();
}
Теперь у вас создалось подменю, где вы можете выбирать уровень сложности игры.
Заметьте, что при нажатии на пункт «Назад» производится выход из игры, а не возврат в главное меню.
Чтобы делать реальный возврат в изначальное меню, нужно всё это меню заключить в отдельную функцию, назвав её например main_menu();.
В принципе, это всё, что в основном нужно для работы с меню в BGT.
Если вы хотите узнать что-то дополнительно, пишите в комментариях к статье.
По сути этого хватает, чтобы создать 90% меню.
Попробуйте создавать различные меню, с различным уровнем сложности, подменю и так далее.
Если есть вопросы, задавайте в комментариях.
Всем удачи.

BGT — Меню: 0 комментариев

  1. Ткач, да, всё верно. А вот за что false отвечает, если честно, сам не знаю. Как-то не приходилось узнавать, но могу почитать, если вам так надо.

  2. пробывал поминять с false на true- ничего не поминялось.
    ещё интересует вот что:
    реализовано ли в скрипте проигрование вместе с названием меню звука, как реализовано в батл зон и в beatstar или придёться использовать апрос клавиатуры?
    имеется ввиду воспроизвидение звука при хождении по меню стрелками и при открывании пункта энтром

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

  4. здравствуйте! в функции reset переменная отвечает за то, будут ли сброшены опции меню такие как wrap и allow_escape.
    и кстати посмотрите пожалуйста что не так.
    On line: 3 (6)
    Line: mmenu.allow_escape = true;
    Error: 'allow_escape' is not a member of '_builtin_function_'

    вроде пишу по учебнику, ошибок быть не должно.

Добавить комментарий