Список форумов Русский TADS Русский TADS
Русский TADS. Разработка текстовых игр на русском языке. Интерактивная литература.
Второй форум находится здесь.
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Как работает ТАДС?
На страницу 1, 2  След.
 
Начать новую тему   Ответить на тему    Список форумов Русский TADS -> Русифицированный ТАДС
Предыдущая тема :: Следующая тема  
Автор Сообщение
Sancho



Зарегистрирован: 12.08.2004
Сообщения: 20
Откуда: IVANOVO

СообщениеДобавлено: Ср Авг 25, 2004 10:43 pm    Заголовок сообщения: Как работает ТАДС? Ответить с цитатой

Very Happy Вообще как он работает? Допустим нет ни одной библиотеки вообще, или без них он не работает?
Откуда начинается чтение кода?, с файла *.t в котором присутствует строка:

#pragma C-


Дело в том, что ТАДС это мое первое знакомство с ООП, и я немного буксую Shocked
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
GrAnd
Site Admin


Зарегистрирован: 04.02.2003
Сообщения: 299
Откуда: Россия, Москва

СообщениеДобавлено: Пт Авг 27, 2004 6:06 pm    Заголовок сообщения: Ответить с цитатой

Как и любая другая система програмирования, ТАДС базируется на компиляторе. Для того чтобы он работал, ему надо передать имя файла. В принципе, вся игра может находиться в одном файле и будет компилироваться, если в игре пристутсвуют следующие объекты и функции (находяться в файле trivial.t в папке tads tool)

init: function
pardon: function
numObj: object;
strObj: object;
againVerb: object;
takeVerb: object;
Me: object;
quitVerb: object

Самые базовые вещи уже зашиты в интерпретатор, а потому даже в такой "игре" можно будет вводить текст, а он будет жаловаться на свое незнание этих слов.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Sancho



Зарегистрирован: 12.08.2004
Сообщения: 20
Откуда: IVANOVO

СообщениеДобавлено: Сб Авг 28, 2004 3:07 am    Заголовок сообщения: Ответить с цитатой

А переведенного мануала, содержащего описание базовых команд нет? Сложно разбираться, как работают уже написанные функции, не зная как они написаны. Я прочитал, что язык тадс это почти тот-же Си, но с небольшими изменениями. Руководство по С/С++ подойдет?
Вот например, есть в тадс команда, аналогичная pause? Была-бы очень полезна например для визуальных эффектов вывода текста на экран.. хотя я еще до хтмл не добрался!?.. каковы его возможности в тадс?.. да и вообще каковы его возможности.. Rolling Eyes
Кстати, а коковы возможности тадс?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
GrAnd
Site Admin


Зарегистрирован: 04.02.2003
Сообщения: 299
Откуда: Россия, Москва

СообщениеДобавлено: Сб Авг 28, 2004 10:34 am    Заголовок сообщения: Ответить с цитатой

Вместо команды "пауза" есть inputkey(). Он останавливает вывод до нажатия клавиши, причем её возвращает. На С++ ТАДС похож основными операторами, а функции другие. Я учился, обюшаривая обучалки и advr.t. И сейчас я их в голове не держу, а в случае необходимости нахожу и изучаю.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Sancho



Зарегистрирован: 12.08.2004
Сообщения: 20
Откуда: IVANOVO

СообщениеДобавлено: Сб Авг 28, 2004 4:29 pm    Заголовок сообщения: Ответить с цитатой

inputkey() это немного другое, эта команда требует ввод клавиши чтоб продолжилось чтение кода, а пауза преостанавливает программу на указанное время.. ( pause n -останавливает выполнение программы на n/50сек, это в ВАСИКЕ).
Допустим эффект пишущей машинки:

В бейсике zx spectrum есть такая штука, PRINT "АБВГД"(3) выведет "В".., => ..ниже-приведенный код выведет слово ПРИВЕТ по буквам, перез определенный интервал времени, ну и со звуковым сопровождением для каждой буковки (типа стук клавиш Very Happy ).

10 LET A$="ПРИВЕТ"
20 FOR I=1 TO 6
30 PRINT A$(I)
40 PAUSE 25
50 BEEP 0.5 , 2
60 NEXT I

Если в 40 строке еще ввести случайный выбор паузы, через rnd (в опр. интервалах), то эффект будет еще более реальнее..

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

listobj : object
a = ['П' 'Р' 'И' 'В' 'Е' 'Т']
;

mashinca : function (a)
{
local i, j, k;
i:=1; j:=length(a); k:=......;
for (i:=1; i<=j; i++; )
{
say(a[i]);
_rand (k)
...// здесь тапа пауза с параметром k, иль как там!? (еще не разбирался) Confused
........... // а здесь mp3 со звуком (тоже еще не разбирался)
}
}

Кстати, а воспроизведение звука происходит в фоновом режиме или программа приостанавливается на время воспроизведения? ..можно было-бы использовать как своего рода паузу.
Короче пауза вещ полезная, ей бы нашлось применение Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
GrAnd
Site Admin


Зарегистрирован: 04.02.2003
Сообщения: 299
Откуда: Россия, Москва

СообщениеДобавлено: Вс Авг 29, 2004 2:15 am    Заголовок сообщения: Ответить с цитатой

Есть функции для работы со временем. Проблема в том, что динамически выводить содержимое буфера на экран нельзя, т.е. необходимо ожидание ввода.
Вот я делал этакий эксперимент, попробуй с комментарием перед inputkey и без:

startroom: room
sdesc="Стартовая комната"
ldesc={
randomize();
tadsdraw.show(4,4,1,4);
}
;

tadsdraw: object
show(coll, rowl, interval, times)={
local i,j,time,last,started,draws=0;
time:=gettime();
started:=time[9];
last:=started;
while (draws < times)
{
time:=gettime();
if (time[9]-last > interval)
{
for (j:=1; j<=rowl; j++)
{
for (i:=1; i<=coll; i++)
{
switch (rand(4))
{
case 1: "T"; break;
case 2: "A"; break;
case 3: "D"; break;
case 4: "S"; break;
}
}
"\n";
}
last:=time[9];
draws++;
// inputkey();
}
}
}
;

В общем, МУД на ТАДС не сделать. Действия происходят только после ввода команды, хотя время можно учитывать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Sancho



Зарегистрирован: 12.08.2004
Сообщения: 20
Откуда: IVANOVO

СообщениеДобавлено: Вс Авг 29, 2004 8:49 pm    Заголовок сообщения: Ответить с цитатой

Цитата:
inputevent

Call: inputevent(timeout)

Alternative call: inputevent()

Added: TADS 2.3.0

This function multiple types of events and can also apply a timeout to limit the how long it waits for an event to occur.

The inputevent() function takes zero or one arguments. With no arguments, inputevent() simply waits until an event occurs. With one argument, which must be a number, inputevent() waits until an event occurs, or until the number of milliseconds specified by the argument has elapsed without an event occurring, in which case the function “times out” and returns without any event having occurred.

Note that the timeout value, if given, may not always be obeyed to the exact millisecond. Different types of computers have different system clock resolutions, and additionally multi-user and multi-tasking systems often have unpredictable latencies for event processing. As a result, if you specify a timeout value, the actual time that elapses before the function times out and returns may be slightly longer than the specified timeout value. Any additional latency should be no more than a few hundred milliseconds in most cases, so this shouldn’t be noticeable for most purposes.

The function returns a list value describing the event that occurred. The first element of the list is a number that specifies the type of the event. The rest of the list varies according to the event type. Constants for the event codes are defined in adv.t. The possible event codes are:

INPUT_EVENT_KEY The user pressed a key. The second element of the list returned by inputevent() in this case is a string containing the key that the user pressed. The string is the same that would be returned by inputkey() for the same keystroke.

INPUT_EVENT_HREF The user clicked on an link. This event is only returned by a multimedia TADS interpreter, never by a character-mode TADS interpreter. The second element of the return list is a string containing the text of the HREF that the user clicked.

INPUT_EVENT_TIMEOUT No event occurred before the specified timeout elapsed. The return list contains no additional elements.

INPUT_EVENT_EOF This indicates that the TADS interpreter is terminating or an error occurred reading an event.

INPUT_EVENT_NOTIMEOUT This is not actually an event, but an error indicating that the current system does not support the timeout feature of inputevent(). If this occurs, you can still use inputevent(), but you cannot specify a timeout. The DOS TADS interpreters (TR, TRX, TR32) all support timeouts, as does HTML TADS for Windows. Interpreters on most systems should be able to support this feature, but a few systems may not be able to.

Wink
Честно говоря я ненавижу переводить с буржуйского, но уж постольку-поскольку Rolling Eyes , дошел чисто интуитивно Laughing .

Заменяем inputkey() на inputevent(INPUT_EVENT_NOTIMEOUT) !, выводит на экран все, что накопилось в буфере и не требует нажатия клавиши для продолжения.

Одна проблемма решена, но возникают две новые. Попробуй мой код:

startroom: room
sdesc="Стартовая комната"
ldesc=ss()
;

listobj : object
mylist=['П' 'Р' 'И' 'В' 'Е' 'Т']
;

ss: function
{
local i, j, k, list, time, t;
list:=listobj.mylist; i:=1; k:=length(list); inputevent(INPUT_EVENT_NOTIMEOUT) ;
while (i<=k)
{
time:=gettime(); t:=time; t[9]:=t[9]+1; j:=1;
while (j=1)
{
time:=gettime();
if (time[9]>=t[9]) {say(list[i]); j++; inputevent(INPUT_EVENT_NOTIMEOUT) ; };
}
i++;
}
}

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

Вторая: наименьшим шагом задержки (если используется gettime() ), будет 1 секунда, а это ни есть хорошо. Желательно-бы доли секунд..

ЗЫ Полный перевод документации просто необходим, особенно перевод всех встроенных функций и команд! Без них никуда.. Я к сожалению плохо знаю язык, и ненавижу что-либо переводить, поэтому переводить чё-то не хотса Rolling Eyes , это мука для меня.. Ты говорил, что кто-то этим занимается!?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Sancho



Зарегистрирован: 12.08.2004
Сообщения: 20
Откуда: IVANOVO

СообщениеДобавлено: Вс Авг 29, 2004 9:57 pm    Заголовок сообщения: Ответить с цитатой

Упс, Rolling Eyes , код еще немного сократился..

listobj : object
mylist=['П' 'Р' 'И' 'В' 'Е' 'Т']
;

ss: function
{
local i, k, list;
i:=1; k:=length(listobj.mylist);
while (i<=k)
{
say(listobj.mylist[i]); timeDelay( 100 );
i++;
};
}

Осталась всего одна проблемма.. Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Sancho



Зарегистрирован: 12.08.2004
Сообщения: 20
Откуда: IVANOVO

СообщениеДобавлено: Вс Авг 29, 2004 10:29 pm    Заголовок сообщения: Ответить с цитатой

Упс, Rolling Eyes и вовсе проблем не осталось Very Happy ..

listobj : object
mylist='Привет амиго, всё окей!'
;

ss: function
{
local i, k, list;
i:=1; k:=length(listobj.mylist);
while (i<=k)
{
say(substr(listobj.mylist,i,1)); timeDelay( 100 );
i++;
};
}

Включать сюда rand(), нет смысла, без звукового оформления это будет смотреться, мягко говоря, коряво.. Есть какие нить предложения, как можно это использовать?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
GrAnd
Site Admin


Зарегистрирован: 04.02.2003
Сообщения: 299
Откуда: Россия, Москва

СообщениеДобавлено: Пн Авг 30, 2004 12:29 am    Заголовок сообщения: Ответить с цитатой

Sancho писал(а):
Есть какие нить предложения, как можно это использовать?


Молодец! А где ты нашел функцию timedelay?

Применение есть, очень хорошее: можно создавать анимацию. Вместо букв, выводить изображение. Это нужно делать в баннере, так как его можно очищать.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Sancho



Зарегистрирован: 12.08.2004
Сообщения: 20
Откуда: IVANOVO

СообщениеДобавлено: Пн Авг 30, 2004 3:21 am    Заголовок сообщения: Ответить с цитатой

http://www.tela.bc.ca/tads-manual/tads-8.html
Я как глянул, сколько всякой всячины понаписано в родном мануале.. переведено всего процентов двадцать! Так ведь есть еще и другие доки!? Блин, надо в основах разбираться, еще раз повторюсь.. Rolling Eyes

Насчет анимации, а разве *.GIF нельзя использовать?
Еще вопрос, можно ли выводить текст в определенную позицию на экране? Например опять в том же васике, да и паскале:
PRINT TAB X,Y"" -вывод текста в определенную позицию на экране;
PRINT AT X,Y"" -смещение относительно текущ. места курсора;
ну и т.п.
Наверняка есть, что-то подобное в тадс.. Полезность такой возможности очивидна. На вскидку: допустим при гибели игрока от бомбы с таймером, игрок увидит обратный отчет 3.. 2.. 1.. БАБАХ!.. причем цифры будут выводиться по середине экрана, большого размера, и заменяя друг друга на одном и том же месте, через интервал времени.. Так это на вскидку, а если покумекать.. Wink

ЗЫ Так, а чего там с переводом?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
GrAnd
Site Admin


Зарегистрирован: 04.02.2003
Сообщения: 299
Откуда: Россия, Москва

СообщениеДобавлено: Пн Авг 30, 2004 1:54 pm    Заголовок сообщения: Ответить с цитатой

Про GIF читай здесь: http://lpf.ai.mit.edu/Patents/Gif/gif_lic.html
Общее содержание: за поддержку GIFа твоей программой, ты обязан платить бабки. TADS - freeware, а потому поддерживает только jpg и png.

Выводить в определенные координаты нельзя, потому что:
1. Окно скроллируется
2. Окно меняет размеры
3. Можно менять шрифт

Возможно форматировать текст по положению на строке, а также выравнивать, выводя его в html таблице (можно указать ширину, высоту столбцов в пикселях). Почитай обучалки html, узнаешь все возможности.

Цифры можно выводить, но не посередине экрана, а в отдельном участке экрана (баннере). Такой ты можешь видеть вверху, где пишется название локации и счет/ходы игрока. Его можно обновлять. В том числе, делать отсчет, выводить картинки и прочее.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Sancho



Зарегистрирован: 12.08.2004
Сообщения: 20
Откуда: IVANOVO

СообщениеДобавлено: Вт Авг 31, 2004 7:05 am    Заголовок сообщения: Ответить с цитатой

Баннеры это хорошо!, да и наверное разумнее использовать их, но всеже..

Цитата:
Возможно форматировать текст по положению на строке

..необходимо вернуть курсор в начальную позицию на строке, тогда все получится:
Код:
bah : function
 {
    local i, j, x;
    x:=['3' '2' '1' 'БАБАХ!!!'];
    i:=1; j:= length(x); "<CENTER>ТИК-ТАК\n";
        while (i<=j)
        {
        "<<x[i]>>"; timeDelay(500); i++;
        };"</CENTER>";
 }


Какой нибудь \z Very Happy , всунуть в "<<x[i]>>\z"..
Цитата:
Почитай обучалки html, узнаешь все возможности.

Щас не могу по инету лазить, на карточке всего пару рублей осталось, а зарплата в среду Sad Very Happy

Тут, вот еще чего подумал. Есть ли ф-ция подобная inputkey(), но чтоб она не останавливала ход программы для принятия клавиши?.. Аналог в васике INKEY$.. т.е. когда до нее доходит дело, она сканирует не нажата-ли какая нить клавиша, и если нажата то возвращает строковое значение нажатой клавиши, в противном случае передает nil..
Я так чего-то и не понял, для чего нужна inputevent(), она бы подошла, но я не понял чего она возвращает.. там имеется пять 5 флагов, если в () указал первый, то она подобна inputkey(), делает паузу и после нажатия любой клавиши, пропускает освобождая буфер. А вот когда остальные 4, она просто вываливает все из буфера, и усё.

Если есть такая ф-ция, (а ее просто не может не быть, имхо), тогда можно будет вставлять real-time_мини-игры в тадс, да и всякие интерактивные полезности, например типа: подборка шифра у сейфа стрелками курсора.. итп..
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
GrAnd
Site Admin


Зарегистрирован: 04.02.2003
Сообщения: 299
Откуда: Россия, Москва

СообщениеДобавлено: Вт Авг 31, 2004 3:34 pm    Заголовок сообщения: Ответить с цитатой

Это должно тебе понравиться:

Код:

startroom: room
sdesc="Стартовая комната"
ldesc={
  local i=1;
  "<banner id=anim height=100 border>
  <body bgcolor=statusbg text=statustext>
  Ждите...
  </banner>";
  randomize();
  animat.boom(200);
}
;


animat: object
boom(interval)={
  local i,j;
  for (i:=10; i>=1; i--)
  for (j:=1; j<=4; j++)
  {
    "<banner id=anim height=100% border>
    <body bgcolor=statusbg text=statustext>
    <table height=100% width=100%><tr align=center><td align=center><b>";
    switch(j)
    {
      case 1: "<font color=#000000 size=5><<i>></font>"; break;
      case 2: "<font color=#444444 size=5><<i>></font>"; break;
      case 3: "<font color=#888888 size=5><<i>></font>"; break;
      case 4: "<font color=#bbbbbb size=5><<i>></font>"; break;
    }
    "</b></td></tr></table></banner>";
    timeDelay(interval);
   }
    for (i:=1; i<=10; i++)
    {
      "<banner id=anim height=previous border>
      <body bgcolor=statusbg text=statustext>
      <table height=9<<say(rand(9))>>% width=9<<say(rand(9))>>%>
      <tr align=center><td align=center><b>";
      "<font size="; say(rand(3)+3); ">БУМ!!!</font>";
      "</b></td></tr></table></banner>";
      timeDelay(100);
    }
    "<banner remove id=anim>";
}
;
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Sancho



Зарегистрирован: 12.08.2004
Сообщения: 20
Откуда: IVANOVO

СообщениеДобавлено: Ср Сен 01, 2004 2:07 am    Заголовок сообщения: Ответить с цитатой

Прикольно! Very Happy Но мне пока рановато лезть в баннеры.. Сейчас скачал небольшей учебничек по хтмл, буду разбираться. Cool Вот разберусь, тогда и за баннеры Arrow

Гранд, а чего там с функцией (аля INKEY$)? Если узнаем как это реализовать, откроются поистине огромные возможности по созданию real-time.. это даже графические игры в баннере вставлять можно будет!

А чего ты можешь сказать про inputevent(timeout)?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Русский TADS -> Русифицированный ТАДС Часовой пояс: GMT + 4
На страницу 1, 2  След.
Страница 1 из 2

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


Powered by phpBB © 2001, 2005 phpBB Group