Часто задаваемые вопросы ("FAQ")

Содержание  Previous  Next

Я пишу такое условие "if a=8 or 9 or 10: ...", а происходит ошибка. Почему?

 

Как и во всех языках программирования, подобная запись недопустима. Нужно писать так:

 

 if a=8 or a=9 or a=10: ...

 

Как сделать плэйлист (чтобы при окончании одной мелодии воспроизводилась другая, затем ещё одна и т.д.)?

 

См. примеры в папке "%AppPath%\Demos" (файлы "playlist1.gam, playlist2.gam, playlist3.gam").

 

Как сделать, чтобы при выборе предмета в списке происходило нужное мне действие?

 

На локации-обработчике выбора предмета ("$ONOBJSEL") в поле "Выполнить при посещении" введите:

 

 if $selobj='предмет': ! нужные операторы через &

 ! если нужно, то вставьте подобные условия

 unselect

 

Как сделать показ анимации в игре (последовательно с паузой вывести картинки)?

 

1) В нужном месте локации введите:

 

 view '[картинка 1 (название файла)]'

 wait 500

 view '[картинка 2]'

 wait 500

 view '[картинка 3]'

 

2) С помощью цикла:

 

 i=0

 :loop

 if i<10:

         wait 500

         view 'pic<<i>>.jpg'

         i=i+1

         jump 'loop'

 end

 

3) Поддерживаются анимированные GIF-файлы. Т.е. $BACKIMAGE='mult.gif' или view 'mult.gif'

 

Как сделать в игре голод / увеличение числа жизней со временем?

 

1) Добавить следующий код на локацию-обработчик перехода на новую локацию:

 

 голод=голод-1

 if голод<10:pl 'Вы голодны!'

 

2) Сделать аналогичную проверку на локации-счётчике.

 

Как проверить, был ли герой на какой-либо локации?

 

1) На той локации, которую нужно проверить, введите:

 

 был_здесь=1

 

А на локации, где нужно это проверить:

 

 if был_здесь=1: ! операторы

 

2) Через массивы, с индексированием через строки:

 

 was_here[$curloc]=1

 

Проверка:

 

 if was_here['башня']: ! операторы

 

PS:

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

 

У меня в квесте локация-счётчик загромождена до предела. Как я могу облегчить ввод кода?

 

1) Разбейте код на процедуры, поместите их на разных локациях в поля "Выполнить при посещении", а затем вызывайте таким образом:

 

 gosub 'LOC1'

 gosub 'LOC2'

 

и т.д.

2) Возможно, часть текущих функций локации-счётчика возможно перенести на другие локации.

 

В игре заметно торможение, подвисание. Почему? Как исправить?

 

Скорее всего, это из-за огромного количества операторов на локации-счётчике. Уберите ненужное, отредактируйте код.

 

Я создавал квесты на платформе URQ. А как здесь сделать деньги?

 

В начале игры введите команду:

 

 addobj 'Деньги'

 

Затем, когда нужно, изменяйте переменную "Money". Например, так:

 

 Money=Money+1

 

На локации-обработчике выбора предмета сделайте обработку выбора предмета "Деньги":

 

 if $selobj='Деньги':pl 'У вас <<money>> монет.'

 unselect

 

Почему я пишу "set a=4.676", а происходит ошибка?

 

Все числовые переменные должны быть целочисленного типа.

 

Если дробные числа не поддерживаются, то как реализовать рубли / копейки?

 

Для этого достаточно привести единицы измерения к меньшим. В данном случае, можно представлять деньги количеством копеек. Пример вывода данных:

 

 money = 1234

 rub = money/100

 kop = money - rub*100

 'У вас <<rub>> руб. <<kop>> коп.'

 

Как ограничить вместительность рюкзака?

 

Для этого используйте функцию "COUNTOBJ".

1) Проверяйте перед добавлением нового предмета кол-во предметов в рюкзаке, а затем решайте: добавлять ли этот предмет, или сделать что-либо ещё.

2) На локации-обработчике добавления предмета удаляйте добавленный предмет:

 

 if countobj=5:delobj $args[0]

 

3) Можете написать подпрограмму добавления предмета (например, "ADDOBJECT") и через параметр передавать ей название нужного предмета. На этой локации, к примеру, такой код:

 

 if countobj=10:

         ! код обработки исключения

         ! ...

         exit

 end

 addobj $args[0]

 

Тогда, чтобы добавить какой-либо предмет (например, "ложка"), нужно будет писать:

 

 gs 'addobject','ложка'

 

Как сделать меню предмета?

 

Существует несколько способов задания различных действий для предметов:

1) Дополнительные действия.

Вы обрабатываете выбор предмета (к примеру, на локации-обработчике выбора предмета), добавляя (с помощью оператора "ACT") новые действия.

2) С помощью строки ввода.

На локации-обработчике строки ввода проверяются какие-либо команды и, если нужно, выполняются необходимые действия.

3) С помощью меню пользователя.

См. раздел "Создание меню для предметов".

 

Как сделать набор локаций (например, повышение уровня героя) подпрограммой?

 

Нужно в обработке выбора действия, после которого происходит возврат к основной программе, поставить "GOTO $ARGS[0]", и вызывать такую "подпрограмму" с параметром $CURLOC.

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

 

 goto $args[0]

 

и когда нужно перейти на распределение очков

 

 goto 'Points',$curloc

 

Вызов такой подпрограммы можно сделать в реакции на выделение какого-либо "предмета".

 

Напишите, пожалуйста, пример, в котором игрок мог бы перейти на новую локацию только при наличии определённого предмета.

 

Можно реализовать, например, так:

 

 if obj 'газета':

         act 'сжечь газету':gt 'сжигание_газет'

 end

 

То же самое:

 

 if obj 'газета':act 'сжечь газету':gt 'сжигание_газет'

 

Ещё пример:

 

 act 'сжечь газету':

         if obj 'газета':gt 'сжигание_газет'

         'у вас нет газеты!'

 end

 

Как сделать, чтобы игрок мог перейти на новую локацию только при вводе верного пароля?

 

Например, так (с созданием дополнительного действия):

 

 if input('Введите пароль') = 'мой пароль':act 'Пройти':gt 'секретная база'

 

Или так (без дополнительного действия):

 

 if input('Введите пароль') = 'мой пароль':gt 'секретная база'

 

С сообщением при неверном пароле:

 

 if input('Введите пароль') = 'мой пароль':

         gt 'секретная база'

 else

         'Вход запрещен!'

 end

 

Также можно воспользоваться строкой ввода (см. функцию "$USER_TEXT").

 

Подскажите, что нужно сделать, чтобы при совершении действия на одной локации автоматически появлялась новое действие на другой локации (например, действие "Поднять меч" автоматически добавляло определённое действие на локации "Инвентарь")?

 

Один из самых простых вариантов - использование переменной на обработке действия, т.е. пишете:

 

 swordtaken=1

 

а на той локации, где нужно добавить действие (в поле "Выполнить при посещении"):

 

 if swordtaken:

         act 'Действие':

                 '!!!!'

         end

 end

 

Как организовать многомерный массив?

 

1) Самый удобный способ - использование массивов, индексируемых через строки. Например:

 

 $карта_вещь['<<x>>_<<y>>'] = 'палка'

 карта_нпс['<<x>>,<<y>>,<<z>>'] = 12

 

2) Отображение многомерного массива на одномерный. Например:

 

 $карта_вещь[x+y*ширина] = 'палка'

 карта_нпс[x+y*ширина+z*ширина*высота] = 12

 

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

 

1) Наилучший вариант - вычислять значения переменных по названию выбранного действия:

 

 i = 0

 :nextEnemy

 if i < enemies:

         $actdesc='Атаковать <<i + 1>>'

         n_enemy[$actdesc] = i

         act $actdesc: n = n_enemy[$selact] & xgt 'атака'

         i = i + 1

         jump 'nextEnemy'

 end

 

2) Добавление действия с помощью оператора "DYNAMIC":

 

 i = 0

 :nextEnemy

 if i < enemies:

         dynamic " act 'Атаковать <<i + 1>>': n = <<i>> & xgt 'атака' "

         i = i + 1

         jump 'nextEnemy'

 end

 

При этом значения всех подвыражений будут вычислены перед добавлением действия.

 

Как сделать действие выхода из игры? Т.е. нажал "Выход" и приложение закрылось?

 

Для выхода можно нажать крестик в самом верху... А в игре выход можно оформить по-другому.

Например, титры сделать, после них пожелания и поздравления. Ну а в конце написать "THE END" без каких-либо действий. Будет очень даже приличный выход.