AntKarlov / Anthill-Framework

Tiny framework for creating Flash games.
57 stars 16 forks source link

reset non active entity, bug? #21

Closed Ogimle closed 10 years ago

Ogimle commented 10 years ago

ситуация:

создаем наследника AntEntity в его конструкторе делаем active = visible = false; и добавляем чилдрена add(subEntity);

если вызвать reset() для нашего класса выполнится каскадный вызов updateX() для всех его приаттаченных деток.

прецедент:

есть диалог по умолчанию невидимый и неактивный, но появляющийся по требованию в фиксированной позиции, к одному из деток диалога (фон диалога) приаттачено событие мыши onOver которое выставляет флаг что курсор над GUI, так вот после такого кода

dlg = new Dialog(); dlg.reset(10,10);

еще до появления чего либо на экране я получаю флаг активных гуев

вопрос:

мне это обходными маневрами разруливать или таки вызов апдейтов для активных деток неактивного родителя есть недочет?

AntKarlov commented 10 years ago

В конструкторе наследника первым делом следует вызвать конструктор супер-класса, а потом определить флаги активности и видимости:

public function myClass()
{
  super();
  active = visible = false;
}

Метод reset() обновляет только положение сущности с её вложениями.

Ogimle commented 10 years ago

хмм.... а куда делся мой утренний ответ...

в конструкторах я всегда так делаю

а метод reset() обновляет не только положение сущности

AntEntity::586::reset()::updateChildren();

в последнем вызываются все апдейты по списку

AntKarlov commented 10 years ago

Я нее получал уведомлений о новых постах и ничего не трогал, наверное утренний пост не отправился :)

В данный момент не очень понимаю в чем проблема? При вызове reset() приходится вызывать все update() чтобы получить актуальные значения объектов, например: глобальная позиция, пересчитать баундбоксы и т.п. Если этого не сделать, то метод reset() по факту является бесполезным. Или вы ждали от него каких-то иных возможностей от него?

Ogimle commented 10 years ago

Или вы ждали от него каких-то иных возможностей от него?

ответ в вашем первом ответе, я ожидал от него, что он только "обновляет только положение сущности с её вложениями." (с) в смысле вызывается каскадный reset() обновляющий только положение и баундбоксы и т.п. вложенных сущностей

В данный момент не очень понимаю в чем проблема?

проблему я описал в топике постараюсь еще раз

  1. документально update() вызывается только при установленном флаге activе, т.е. является реалтаймовым методом, а работа reset() нивелирует этот факт, т.к. может вызываться и из конструктора на этапе инициализации приложения, где своим "недостойным" поведением :) саботирует заявленную логику работы движка
  2. ваши гуи элементы в своих апдейтах обновляют привязанные события, которые никаким боком не относятся к позициям и боксам до того как появятся на экране, т.е. создать свой гуи элемент со вложенными гуи элементами с предопределенными событиями уже не представляется возможным, потому как события уровня реакции на действия пользователя благодаря reset() начинают генерироваться еще до того, как пользователь получит возможность их совершать

вот как-то так....

P.s. возможно в конструкторах и не обязательно пользоваться reset() а вполне достаточно обойтись установкой x,y непосредственно, но о подводных камнях такого подхода у меня пока сведений нет, да и не хочется экспериментировать, на этом уровне можно словить эффекты похлеще, я предпочел принудительно отрабатывать заявленную движком логику своих апдейтах

AntKarlov commented 10 years ago

Воот! Так намного понятнее что требуется. В целом согласен, займусь решением этого вопроса в ближайшие пару дней. Как будет результат, отпишусь об этом здесь. Спасибо!