Topic: Доступность объектов

Привет! Я пишу свою первую игру на INSTEAD, и у меня возник вопрос. У меня возникла необходимости некоторые объекты делать недоступными до определенного времени так, чтобы они потом включались по выполнению определенного условия. Ну т.е. чтобы можно было писать как-нибудь так:

obj {
cnd = function(s)
  if s._flag return true
end
}

Но такой возможности я не нашел. Не подскажете?

2 (edited by MaJoR KolZ 2013-11-09 23:30:00)

Re: Доступность объектов

<имя объекта> : disable()  -  чтобы выключить
<имя объекта> : enable() - чтобы включить

house = room{
   nam = "Комната 1",
   dsc = "Описание";
   obj = { "tabl", "book" };  
}

book = obj{
   nam = "Книга",
   dsc = "На столе лежит {книга}";
   act = "Жюль Верн!";
}:disable() -- по-умолчанию выключена

tabl = obj{
   nam = "Стол",
   dsc = "В темном углу притаился небольшой {столик}",
   act = function(s)
      p "На столе что-то лежит!";
      book:enable();   -- книга теперь доступна, в описании комнаты появится строка "На столе лежит книга"
   end,
}

P.S. http://instead.syscall.ru/wiki/ru/gamedev/documentation

Re: Доступность объектов

Спасибо! Но тогда мне придется дважны везде прописывать что объект disable, просто флажки мне полюбому надо ставить, так как от них зависят описания и пр.
А по-другому нельзя как-нибудь?

4 (edited by MaJoR KolZ 2013-11-09 23:34:15)

Re: Доступность объектов

Есть такое:
<имя>:disabled() - возвращает true, если объект выключен. Тогда не на флажок смотришь, а на неё

dsc = function(s)
    if book:disabled() then
        p "Описание 1";
   else
        p "Описание 2";
   end
end

5 (edited by Vorov2 2013-11-10 01:04:33)

Re: Доступность объектов

Если хотите, чтобы было прямо как в вашем примере, добавьте такой код в начало файла:

local old_obj = obj;
function tcall(f,s)
  if type(f) == "function" then
    return tcall(f(s),s);
  else
    return f;
  end
end
function obj(tab)
  local dsc = tab.dsc;
  tab.dsc = function(s)
    if s.cnd == nil or s:cnd() then
      return tcall(dsc,s);
    end
  end
  return old_obj(tab);
end

Re: Доступность объектов

Спасибо! Это то, что нужно!

Re: Доступность объектов

slimdrink

Ты его не слушай... Он тебя плохому научит. 'Переход' заставит написать.
Пользуйся документацией побольше и все вопросы отпадут сами собой, а вообще для начального уровня и понимания основ языка луа-инстед прошу вот сюда и следовать всем советам неукоснительно:
http://instead.syscall.ru/wiki/ru/gamedev/quickstart

Qui habet aures audiendi, audiat...

Re: Доступность объектов

Почему не слушать? и что значит переход заставит написать? В коде который выше есть какие-то проблемы?

Re: Доступность объектов

Это я так шучу. В коде нет никаких проблем. Хотя на самом деле, я бы посоветовал начать с нечто чего либо простого не перегруженного новыми функциями и фичами.

Qui habet aures audiendi, audiat...

Re: Доступность объектов

Я и пытаюсь сделать как проще. У меня куча кода сейчас, который объекты добавляет динамически, и все работает как-то не так.