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

  1. ‹ Older
  2. 5 months ago

    FROST

    Sep 19 User since 2017
    Edited 5 months ago by FROST

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

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

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

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

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

  4. 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." иногда очень важен доброжелательный пинок. )))

  5. skiminok1986

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

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

  6. FROST

    Sep 19 User since 2017

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

  7. LukiUK

    Sep 19 User since 2017

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

  8. 4 months ago

    Ruido

    Sep 22 User since 2016

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

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

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

  9. FROST

    Sep 22 User since 2017

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

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

  10. Ruido

    Sep 22 User since 2016

    Спасибо)

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

  11. FROST

    Sep 25 User since 2017

    Привет!

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

  12. 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()

  13. 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() вообще не вызывается (но ошибки нет).

  14. 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
  15. 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;
    }
  16. 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() принимает независимо от этого все аргументы.

  17. peter

    Sep 25 Administrator Земля(Москва) User since 2014
    Edited 4 months ago by peter

    Дело в том, что filter вызывается очень рано, это не команда инстеда в понимании движка. Она вызывается в тот момент, когда событие от мыши приходит в сам инстед.
    То-есть, это как бы контекст "прерывания". Даже если захочешь, оттуда ты ничего не сможешь сделать.

    Если же функция вернет true, то выполняется "тяжеловесная" команда INSTEAD, как обычная команда от пользователя: act, inv и так далее.. Причем выполняется не сразу, а в удобное/возможное для работы время. Вот тут у нас уже настоящий контекст.

    В противном случае, мы загружали бы неэффективной работой движок.

  18. Deleted 4 months ago by FROST
  19. FROST

    Sep 26 User since 2017
    Edited 4 months ago by FROST

    Здравствуйте!

    Разъясните пожалуйста, почему ниже приведенная конструкция не открывает закрытую фразу?

    require 'dbg'
     
    function init()
        std.phrase_show = false;
    end
     
    dlg {nam = 'main';
        decor = 'test';			
        phr = {nam = 'dlg',
            {'#phr1','открыть фразу ',
            function()
                local ph = lookup('#phr2', 'dlg');
                ph:open();
            end},
            {'#phr2',false,
            'закрытая по умолчанию фраза','true'}
        }
    }

    не помогает и open 'phr2' ни open (ph)

  20. peter

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

    Есть тут путаница между закрытой/открытой и отключенной/включенной фразой.
    Дело в том, что false указывает на спрятанную фразу (еще можно писать hidden = true), а ее нужно делать enable, а не open. open/close делается для любой фразы когда она просмотрена, но на новом входе в диалог все закрытые фразы снова открываются. Это все есть в документации по диалогам.

    Исправление в лоб:

    function init()
    	std.phrase_show = false;
    end
     
    dlg {
    	nam = 'main';
    	decor = 'test';
    	phr = {
    		{'#phr1',
    		 'открыть фразу ',
    		 function()
    			 p "открыл"
    			 local ph = lookup('#phr2');
    			 ph:enable();
    		 end
    		},
    		{
    			false,
    			'#phr2',
    			'закрытая по умолчанию фраза',
    			'true'
    		}
         }
    }

    версия 1:

    dlg {
    	nam = 'main';
    	decor = 'test';
    	phr = {
    		{'#phr1',
    		 'открыть фразу ',
    		 function() 
                             enable "#phr2"
                     end;
    		},
    		{
    			hidden = true,
    			'#phr2',
    			'закрытая по умолчанию фраза',
    			'true'
    		}
         }
    }

    версия 2:

    dlg {
    	nam = 'main';
    	decor = 'test';
    	phr = {
    		{'#phr1',
    		 'открыть фразу ',
    		 pfn(enable, '#phr2', "Открыл"),
    		},
    		{
    			hidden = true,
    			'#phr2',
    			'закрытая по умолчанию фраза',
    			'true'
    		}
         }
    }

    версия 3:

    dlg {
    	nam = 'main';
    	decor = 'test';
    	phr = {
    		{'#phr1',
    		 'открыть фразу ',
                     'открыл',
    		},
    		{
                            cond = function() return not seen '#phr1' end;
    			'#phr2',
    			'закрытая по умолчанию фраза',
    			'true'
    		}
         }
    }
  21. peter

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

    Конкретно по твоему коду:

    1. false во 2й позиции, а не в первой. можно использовать hidden = true в любой позиции
    2. lookup 2й параметр это комната, там main дб
    3. нужно делать enable а не open. но вообще это сложно. просто enable(что, где)
  22. Newer ›

or Sign Up to reply!