Вопросы и ответы

  1. ‹ Older
  2. 5 months ago

    Ruido

    Aug 29 User since 2016
    Edited 5 months ago by Ruido

    Подскажите пожалуйста, какой командой выйти из диалога и перейти в другую комнату? и walk пробовал и брейк - где-то ошибаюсь.

    phr = {
    {"Вопрос", [[Ответ]], back()};

    Вроде back - переход на предыдущий уровень. Поскольку у диалога моего под уровней нет, то должно вернуть в комнату, но выдаёт ошибку.

    Пробую
    phr = {
    {"Вопрос", [[Ответ]], , walkin('MyRoom'};
    Ругается что "attempt вызвать метод walkin

  3. peter

    Aug 29 Administrator Земля(Москва) User since 2014
    Edited 5 months ago by peter

    Этот раздел относится к STEAD3, поэтому воспринимаю вопрос именно в свете STEAD3. Тогда решение будет таким.

    phr = { {
       {"Вопрос", function() p [[Ответ]]; walkout() end };
    }};

    Или, проще:

    phr = { {
       {"Вопрос", pfn(walkout) "Ответ" };
    }};

    Про stead2 вопросы в другой ветке, ее адрес находится в 1м сообщении.

    В любом случае, в каталоге doc/examples есть stead3/dialog и stead2/dialog с примером диалога.

  4. peter

    Aug 29 Administrator Земля(Москва) User since 2014
    Edited 5 months ago by peter

    Пример с walk и параметром:

      {"Вопрос", pfn(walk, 'комната') "Ответ" };
  5. Ruido

    Aug 29 User since 2016

    Спасибо, заработало.

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

  6. peter

    Aug 29 Administrator Земля(Москва) User since 2014
    Edited 5 months ago by peter

    Чтоб было понятней, тогда пиши:

     {"Вопрос", function() 
        p "Ответ"
        walk 'комната' 
    end };

    pfn это упрощение, он конструирует функцию, которая делает что то, а потом выводит строку.
    pfn(walk, 'комната') "Ответ"
    Превратится по сути:

    function()
        walk 'комната'
        p "Ответ"
    end

    А писать ли текст ДО перехода или ПОСЛЕ - это не важно, в общем то, в нашем случае.

  7. FROST

    Sep 19 User since 2017
    Edited 5 months ago by FROST

    Здравствуйте.
    Можно ли проверить переменную на nil? У меня не получается. Собственно задача в том, чтобы при отсутствии ключа таблицы, например tab.key выполнялся код.

    if not tab.key then
    ...
    end
  8. peter

    Sep 19 Administrator Земля(Москва) User since 2014

    Законченный main3.lua, пожалуйста, на котором можно показать решение.

    А так, и not tab.key сработает (правда если там nil или false -- одинаково сработает), и tab.key == nil -- все это рабочие варианты. Значит, ошибка где то еще.

  9. FROST

    Sep 19 User since 2017

    Благодарю, помогло! )))

    Я стал писать чистый main3.lua. И в процессе написания наступило просветление. Я осознал что значение пустая строка ну никак не равно занчению nil

    На момент умственного помутнения я писал:

    local tab = {key=''}
    if not tab.key then
          dprint('tab.key = nil')
    end

    После просветления пишу

    local tab = {key=nil}
    if not tab.key then
          dprint('tab.key = nil')
    end

    А после озарения буду писать

    local tab = {}
    if not tab.key then
          dprint('tab.key = nil')
    end

    peter, благодарю, что побудили написать "законченный main3.lua." иногда очень важен доброжелательный пинок. )))

  10. skiminok1986

    Sep 19 Постоялец Курган User since 2014

    FROST, этот метод крайне полезен. Я про написание примера. Обязательно свежая идея возникнет в процессе =)

  11. FROST

    Sep 19 User since 2017

    Ага! ))
    А как вставлять обращение в текст поста?

  12. LukiUK

    Sep 19 User since 2017

    Символсобакаобращение даёт обращение.

  13. 4 months ago

    Ruido

    Sep 22 User since 2016

    Возникла проблема.
    В одном из диалогов если идти по определенной ветке Инстеад полностью зависает. Выкладываю этот диалог в отдельном файле (можно прощёлкать).

    Ветка ведущая к проблеме:
    "Ты тут давно работаешь?" - "Наверное, тут большая текучка?" - и всё зависает. Опытным путем выяснил, что это из-за строчки (ну или мне кажется что из-за неё) Которая начинается с вопроса
    " {[[{Хм... Удивительные люди. Безвозмездно помогают другим. Расскажи о них, пожалуйста.]];"
    Предположил, что ответ слишком длинный. Стёр всё до трёх символов - проблема не решилась.

    Абсолютно не понимаю в чём может быть дело( Вроде уже приладился проверенные блоки кода копировать-вставлять и на тебе(

  14. FROST

    Sep 22 User since 2017

    Привет, коллега.

    Строка 51 символ 25 открывающая фигурная скобка внутри текста. Удали и все заработает.

  15. Ruido

    Sep 22 User since 2016

    Спасибо)

    "слона-то я и не приметил" )

  16. FROST

    Sep 25 User since 2017

    Привет!

    В инструкции встретил функцию game.onclick() и только в одном месте, в этом разделе. Возник вопрос как ею пользоваться и чем она отличается от функции click:filter()?

  17. peter

    Sep 25 Administrator Земля(Москва) User since 2014

    click:filter это функция, которая решает -- наше это событие или нет. в нем не стоит делать никаких действий, кроме возврата true или false.
    onclick метод может быть у текущей комнаты (https://github.com/instead-hub/instead/blob/master/doc/stead3.md#%D0%9C%D1%8B%D1%88%D1%8C ) или общий -- game:onclick.

    если у комнаты нет onclick, вызывается game:onclick()

  18. FROST

    Sep 25 User since 2017
    Edited 4 months ago by FROST

    Гм. Пробую уложить по-полочкам в своей голове. Какие аргументы принимает функция game:onclick()?

    Попытка осмысления:

    function click:filter(press, btn, x, y, px, py)
        if x<100 then
            return true
        end;
        return false
    end
     
    game:onclick = function()
        if click:filter() then
            dprint ("true");
            return
        end
        dprint ("false");
    end

    Верно ли я понимаю логику использования функций?

    P.S. результат выполнения кода: ошибка сравнения в строке x<100 (не может сравнить число и строку).
    PPS: если сравнивать press=='true' функция game:onclick() вообще не вызывается (но ошибки нет).

  19. LukiUK

    Sep 25 User since 2017
    Edited 4 months ago by LukiUK

    Скопируй пример из документации https://github.com/instead-hub/instead/blob/master/doc/stead3.md#Мышь и навтыкай в функции

    dprint(press, btn, x, y, px, py)

    game:onclick без параметров не используется.
    click:filter должен в твоём примере

    return press and x
  20. peter

    Sep 25 Administrator Земля(Москва) User since 2014
    Edited 4 months ago by peter
    require "click"
     
    function click:filter(press, btn, x, y, px, py)
        if x<100 then
            return true
        end;
        return false
    end
     
    room {
        nam = 'main';
        pic = "box:320x200,red";
        onclick = function(s, press, btn, x, y, px, py)
    	pn("Вы нажали (или отжали) куда то в области x < 100")
        end;
    }
  21. FROST

    Sep 25 User since 2017

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

    При каждом клике мышью (нажатие, отпускание), выполняется функция click:filter(press, btn, x, y, px, py), которая принимает в качестве аргументов состояние нажатия кнопки ("нажата" - true; "отжата" - false), номер нажатой кнопки, абсолютныйе координаты x и y (всё рабочее пространство окна) и относительные координаты px и py (для pic картинки). Если функция click:filter(press, btn, x, y, px, py) возвращает логическое true (или любое другое значение), тогда выполняется функция game:onclick(press, btn, x, y, px, py), которая принимает те же аргументы что и функция click:filter(press, btn, x, y, px, py). В случает использование одной точки в game.onclick(game, press, btn, x, y, px, py) в начало добавляется аргумент - объект 'game'. Тело функции game:onclick() задается разработчиком и может быть любым, а вот тело функции click:filter() должно содержать проверку условия и возвращать только true или false.

    Должен признаться, что остается не проясненным для меня смысл в возможности вернуть какое-либо значение, отличное от логического true функцией click:filter(). Ведь функция game:onclick() принимает независимо от этого все аргументы.

  22. Newer ›

or Sign Up to reply!