RTADS FAQ: различия между версиями
Grand (обсуждение | вклад) Нет описания правки |
Flint (обсуждение | вклад) Нет описания правки |
||
| Строка 4: | Строка 4: | ||
==Мультимедиа== |
==Мультимедиа== |
||
'''Вопрос от Zargo: <br>Подскажите, пожайлуста, как можно подключить графику и звук в игру и можно ли вообще это сделать на RTADSе.''' |
|||
Можно, для интерпретаторов с поддержкой мультимедиа. Это проигрыватели для систем Windows, Macintosh и Linux. |
Можно, для интерпретаторов с поддержкой мультимедиа. Это проигрыватели для систем Windows, Macintosh и Linux. |
||
Выглядит и реализуется как HTML верстка с некоторыми ограничениями. Графические/музыкальные ресурсы можно зашить в файл игры или распространять отдельными файлами. Графика: jpg, png, mng. Последний позволяет отображать анимированные изображения. Также можно воспроизводить анимацию из последовательности jpg, динамическим контентом или псевдографикой. Поддержка Gif не была реализована по причине ограничений лицензии. |
Выглядит и реализуется как HTML верстка с некоторыми ограничениями. Графические/музыкальные ресурсы можно зашить в файл игры или распространять отдельными файлами. Графика: jpg, png, mng. Последний позволяет отображать анимированные изображения. Также можно воспроизводить анимацию из последовательности jpg, динамическим контентом или псевдографикой. Поддержка Gif не была реализована по причине ограничений лицензии. |
||
Вопрос от [[ifn00b]]:<br>Касательно мультимедийных возможностей - какие типы аудио-файлов можно подключить к RTADS? И каким образом происходит их проигрывание - интерпретатор вызывает внешнее приложение, которое зарегистрировано в системе для файлов данного типа? |
|||
'''Вопрос от [[ifn00b]]:<br>Касательно мультимедийных возможностей - какие типы аудио-файлов можно подключить к RTADS? И каким образом происходит их проигрывание - интерпретатор вызывает внешнее приложение, которое зарегистрировано в системе для файлов данного типа?''' |
|||
Midi, wav, MP3 и Ogg Vorbis. |
Midi, wav, MP3 и Ogg Vorbis. |
||
| Строка 18: | Строка 19: | ||
P.S. По мнению большей части сообщества, избыток графики и звука уводит от настоящего IF. Будьте очень осторожны и используйте эти возможности тогда, когда это оправдано. |
P.S. По мнению большей части сообщества, избыток графики и звука уводит от настоящего IF. Будьте очень осторожны и используйте эти возможности тогда, когда это оправдано. |
||
==Сборка и компиляция== |
|||
'''Чем отличаются debug и release версии игры?''' |
|||
В debug версию включается дополнтельная информация, которая позволяет отлаживать игру в TADS Workbench. Из-за этого: во-первых, существенно увеличивается размер файла, во-вторых, весь текст записывается в открытом виде и может быть просмотрен любым редактором, в-третьих, старые версии интерпретаторов могут слетать на играх с длинными строками, скомпилированными в отладочном режиме. |
|||
Вывод: при выпуске игры в свет не забывайте компилировать и выкладывать release версию. |
|||
==Синтаксис== |
|||
'''Почему индексация массивов и строк начинается с единицы?!''' |
|||
Конечно же, это риторический вопрос. Но довольно часто ошибки в игре вызываются тем, что автор «на автомате» впечатал уже отложившийся на подкорке кусочек кода, который сработал бы для массивов, начинающихся с 0. Поэтому если у вас появляются ошибки выхода за пределы массива или строки какие-то обрезанные выводятся – в первую очередь проверяйте код, работающий с индексами массивов. |
|||
'''Никак не могу привыкнуть к этому полупаскальному-полусишному синтаксису. Можно ли как-нибудь привести его к единой форме?''' |
|||
Да. Существует специальная директива <tt>#pragma C+</tt>. Она включает режим соответствия языку C для файла, в котором упомянута, поэтому вы сможете использовать привычные <tt>==</tt> для сравнения и <tt>=</tt> для присваивания. А директива <tt>#pragma C-</tt> возвращает все к стандартному виду. |
|||
Совет: если вы разрабатываете модуль, который затем может быть использован другими людьми, директивой <tt>#pragma</tt> явно указывайте стиль, используемый в файле, чтобы авторские настройки не повлияли на работу вашего модуля. |
|||
'''Как создать список (list) из одного элемента?''' |
|||
Спорю, что вы пробовали так: |
|||
a = [b]; |
|||
На самом деле, список из одного элемента можно создать только так: |
|||
a := [] + b; |
|||
'''При вызове метода foo() без аргументов возникает ошибка компиляции.''' |
|||
Если метод не принимает аргументов, то сотрите скобки при его вызове. |
|||
bar.foo(); //ошибка |
|||
bar.foo; //вызов метода |
|||
При объявлении метода скобки все-равно нужны! |
|||
==Неочевидные приемы== |
|||
'''Почему не наследуются лексические свойства (sdecs, noun и пр.)?''' |
|||
В стремлении упростить жизнь авторам игр, TADS не делает особых различий между классом и объектом (экземпляром класса). Однако отличия есть, хоть и небольшие. Во-первых, класс нематериален в игре — вы никак не сможете взаимодействовать с ним. Во-вторых (уже догадались?) ''лексические'' свойства (sdesc, ldesc, noun, adjective) наследуются только от классов, а от объектов нет. |
|||
Пример: |
|||
<pre> |
|||
coin : item |
|||
gdesc = 'золотая/1пж монета/1ж' |
|||
ldesc = "Золотая монета с изображением профиля Императора. " |
|||
isHer = true |
|||
; |
|||
coin1 : coin |
|||
location = treasury |
|||
; |
|||
coin2 : coin |
|||
location = chest |
|||
; |
|||
coin3 : coin |
|||
location = purse |
|||
; |
|||
</pre> |
|||
В таком виде пример работать не будет, потому что лексические свойства объекта coin не наследуются потомками. Соответственно, вы просто не найдете монет в игре, потому что к ним никак нельзя будет обратиться (свойство noun-то не заполнено!). Уже догадались, как исправить? Правильно, пишем в первой строке: |
|||
class coin : item |
|||
и все встает на свои места. |
|||
Примечание: на момент написания заметки библиотека находилась в состоянии активной разработки и gdesc, к примеру, стал наследоваться нормально, просто дублируя словоформы много раз. Несмотря на это, рекомендуется ВСЕГДА использовать классы, если требуется наследовать лексические свойства. |
|||
'''Как динамически изменить ldesc (и другие свойства с двойными кавычками)?''' |
|||
Двойные кавычки (") — удобная особенность языка TADS, однако принцип их работы может немного смутить новичков. Двойные кавычки служат для вывода текста на экран, то есть, как только в ходе выполнения программы интерпретатор встречает строку в двойных кавычках, он тут же отображает её. Если строка в двойных кавычках присвоена в качестве свойства какого-либо объекта, то она будет отображаться при каждом обращении к этому свойству. Смысл этого в том, чтобы облегчить автору работу с текстом — базовой единицей всей [[ИЛ]]. |
|||
При этом следует понимать, что строка в двойных кавычках — это не переменная как таковая, а, фактически, завуалированный метод для вывода переданного текста на экран. Он ничего не возвращает, поэтому строками в двойных кавычках нельзя манипулировать так же, как обычными переменными. Например, следующий, на первый взгляд правильный код не будет работать: |
|||
<pre> |
|||
vase : item |
|||
gdesc = 'ваза/1ж' |
|||
ldesc = "Хрупкая фарфоровая ваза. " |
|||
... |
|||
doDrop(actor) = |
|||
{ |
|||
"Ваза была так тонка, что разбилась при падении. "; |
|||
self.ldesc := "Теперь ваза представляет собой лишь груду черепков. "; |
|||
pass doDrop; |
|||
} |
|||
; |
|||
</pre> |
|||
Так как метод «двойные кавычки» ничего на самом деле не возвращает, <tt>ldesc</tt> в данном примере перепишется пустым значением и описание исчезнет вообще. Для решения этой проблемы следует переписать определение <tt>ldesc</tt> вот так: |
|||
<pre> |
|||
vase : item |
|||
gdesc = 'ваза/1ж' |
|||
ldesc = |
|||
{ |
|||
if (not self.broken) |
|||
"Хрупкая фарфоровая ваза. "; |
|||
else |
|||
"Теперь ваза представляет собой лишь груду черепков. "; |
|||
} |
|||
broken = nil |
|||
... |
|||
doDrop(actor) = |
|||
{ |
|||
"Ваза была так тонка, что разбилась при падении. "; |
|||
self.broken := true; |
|||
pass doDrop; |
|||
} |
|||
; |
|||
</pre> |
|||
Версия от 14:54, 21 июля 2008
Часто Задаваемые Вопросы и Ответы о системе RTADS
Мультимедиа
Вопрос от Zargo:
Подскажите, пожайлуста, как можно подключить графику и звук в игру и можно ли вообще это сделать на RTADSе.
Можно, для интерпретаторов с поддержкой мультимедиа. Это проигрыватели для систем Windows, Macintosh и Linux. Выглядит и реализуется как HTML верстка с некоторыми ограничениями. Графические/музыкальные ресурсы можно зашить в файл игры или распространять отдельными файлами. Графика: jpg, png, mng. Последний позволяет отображать анимированные изображения. Также можно воспроизводить анимацию из последовательности jpg, динамическим контентом или псевдографикой. Поддержка Gif не была реализована по причине ограничений лицензии.
Вопрос от ifn00b:
Касательно мультимедийных возможностей - какие типы аудио-файлов можно подключить к RTADS? И каким образом происходит их проигрывание - интерпретатор вызывает внешнее приложение, которое зарегистрировано в системе для файлов данного типа?
Midi, wav, MP3 и Ogg Vorbis. Для проигрывания используется DirectX.
Подробно обо всем этом можно узнать здесь (увы, на английском языке): http://www.tela.bc.ca/tads-manual/tads-12.html
P.S. По мнению большей части сообщества, избыток графики и звука уводит от настоящего IF. Будьте очень осторожны и используйте эти возможности тогда, когда это оправдано.
Сборка и компиляция
Чем отличаются debug и release версии игры?
В debug версию включается дополнтельная информация, которая позволяет отлаживать игру в TADS Workbench. Из-за этого: во-первых, существенно увеличивается размер файла, во-вторых, весь текст записывается в открытом виде и может быть просмотрен любым редактором, в-третьих, старые версии интерпретаторов могут слетать на играх с длинными строками, скомпилированными в отладочном режиме.
Вывод: при выпуске игры в свет не забывайте компилировать и выкладывать release версию.
Синтаксис
Почему индексация массивов и строк начинается с единицы?!
Конечно же, это риторический вопрос. Но довольно часто ошибки в игре вызываются тем, что автор «на автомате» впечатал уже отложившийся на подкорке кусочек кода, который сработал бы для массивов, начинающихся с 0. Поэтому если у вас появляются ошибки выхода за пределы массива или строки какие-то обрезанные выводятся – в первую очередь проверяйте код, работающий с индексами массивов.
Никак не могу привыкнуть к этому полупаскальному-полусишному синтаксису. Можно ли как-нибудь привести его к единой форме?
Да. Существует специальная директива #pragma C+. Она включает режим соответствия языку C для файла, в котором упомянута, поэтому вы сможете использовать привычные == для сравнения и = для присваивания. А директива #pragma C- возвращает все к стандартному виду.
Совет: если вы разрабатываете модуль, который затем может быть использован другими людьми, директивой #pragma явно указывайте стиль, используемый в файле, чтобы авторские настройки не повлияли на работу вашего модуля.
Как создать список (list) из одного элемента?
Спорю, что вы пробовали так:
a = [b];
На самом деле, список из одного элемента можно создать только так:
a := [] + b;
При вызове метода foo() без аргументов возникает ошибка компиляции.
Если метод не принимает аргументов, то сотрите скобки при его вызове.
bar.foo(); //ошибка bar.foo; //вызов метода
При объявлении метода скобки все-равно нужны!
Неочевидные приемы
Почему не наследуются лексические свойства (sdecs, noun и пр.)?
В стремлении упростить жизнь авторам игр, TADS не делает особых различий между классом и объектом (экземпляром класса). Однако отличия есть, хоть и небольшие. Во-первых, класс нематериален в игре — вы никак не сможете взаимодействовать с ним. Во-вторых (уже догадались?) лексические свойства (sdesc, ldesc, noun, adjective) наследуются только от классов, а от объектов нет.
Пример:
coin : item
gdesc = 'золотая/1пж монета/1ж'
ldesc = "Золотая монета с изображением профиля Императора. "
isHer = true
;
coin1 : coin
location = treasury
;
coin2 : coin
location = chest
;
coin3 : coin
location = purse
;
В таком виде пример работать не будет, потому что лексические свойства объекта coin не наследуются потомками. Соответственно, вы просто не найдете монет в игре, потому что к ним никак нельзя будет обратиться (свойство noun-то не заполнено!). Уже догадались, как исправить? Правильно, пишем в первой строке:
class coin : item
и все встает на свои места.
Примечание: на момент написания заметки библиотека находилась в состоянии активной разработки и gdesc, к примеру, стал наследоваться нормально, просто дублируя словоформы много раз. Несмотря на это, рекомендуется ВСЕГДА использовать классы, если требуется наследовать лексические свойства.
Как динамически изменить ldesc (и другие свойства с двойными кавычками)?
Двойные кавычки (") — удобная особенность языка TADS, однако принцип их работы может немного смутить новичков. Двойные кавычки служат для вывода текста на экран, то есть, как только в ходе выполнения программы интерпретатор встречает строку в двойных кавычках, он тут же отображает её. Если строка в двойных кавычках присвоена в качестве свойства какого-либо объекта, то она будет отображаться при каждом обращении к этому свойству. Смысл этого в том, чтобы облегчить автору работу с текстом — базовой единицей всей ИЛ. При этом следует понимать, что строка в двойных кавычках — это не переменная как таковая, а, фактически, завуалированный метод для вывода переданного текста на экран. Он ничего не возвращает, поэтому строками в двойных кавычках нельзя манипулировать так же, как обычными переменными. Например, следующий, на первый взгляд правильный код не будет работать:
vase : item
gdesc = 'ваза/1ж'
ldesc = "Хрупкая фарфоровая ваза. "
...
doDrop(actor) =
{
"Ваза была так тонка, что разбилась при падении. ";
self.ldesc := "Теперь ваза представляет собой лишь груду черепков. ";
pass doDrop;
}
;
Так как метод «двойные кавычки» ничего на самом деле не возвращает, ldesc в данном примере перепишется пустым значением и описание исчезнет вообще. Для решения этой проблемы следует переписать определение ldesc вот так:
vase : item
gdesc = 'ваза/1ж'
ldesc =
{
if (not self.broken)
"Хрупкая фарфоровая ваза. ";
else
"Теперь ваза представляет собой лишь груду черепков. ";
}
broken = nil
...
doDrop(actor) =
{
"Ваза была так тонка, что разбилась при падении. ";
self.broken := true;
pass doDrop;
}
;
Усложнение принимаемых фраз
Вопрос:
Как заставить понимать команду с тремя существительными, ввести наречия, сделать несколько проходов в одной стороне света и т.п.
Большинство таких нестандартных подходов не стоят затрачиваемых усилий для их реализации. Постарайтесь упростить те случаи для которых вы хотите их использовать.
Например, по порядку:
- привязать лошадь веревкой к забору = привязать веревку к забору и привязать веревку к лошади
- тихо открыть дверь = смазать петли салом и открыть дверь
- на юге вы видите три пещеры. Кровавый след тянется в ту, что западнее, а из восточной выползает вязкий белесый туман