Korchy
25.11.2013, 15:32
Есть окно, в нем список, список состоит из объектов-картинок (контейнер с описанием, в нем спрайт). За картинку (спрайт) можно потащить startDrag/stopDrag. Если картинка вытаскивается за пределы окна, контейнер убирается из списка, в основной сцене генерится другой объект, на основании того, который перетащили. За конвертацией (убрать из списка, сгенерировать в сцене) следит менеджер. В принципе обычная библиотека элементов.
Вопрос, как правильно организовать отслеживание момента, когда картинка будет перетащена за пределы окна?
В классе контейнера, содержащего картинку я отслеживаю
private function OnMouseDown(e:MouseEvent):void {
lPict.startDrag();
}
private function OnMouseUp(e:MouseEvent):void {
lPict.stopDrag();
// Проверить, что вытащили за пределы окна (parent.parent - список.окно, смотрим по размерам окна)
var ParentCenter:Vector2 = VnObjectT(parent.parent).GetPosition();
var ParentW05:Number = VnObjectT(parent.parent).Width05;
var ParentH05:Number = VnObjectT(parent.parent).Height05;
if (e.stageX > ParentCenter.X + ParentW05 || e.stageX < ParentCenter.X - ParentW05 || e.stageY > ParentCenter.Y + ParentH05 || e.stageY < ParentCenter.Y - ParentH05) {
// За пределами окна - пробуем конвертировать картинку в объект
lConvObject.ConvertFromStorageToObject(new Vector2(e.stageX, e.stageY));
}
else {
// Осталась внутри окна - вернуть на место
lPict.MoveIntoParent(Width05, Height05, true);
}
}
Здесь не нравится обращение parent.parent к родителю. Из-за принципа потомок не знает о родителе, ну и в этом случае любая вставка промежуточного контейнера убивает правильность обращения к родителю.
Как должно быть?
Логика подсказывает, что картинка должна диспатчить эвент об окончании перетаскивания. Но кто должен слушать этот эвент и обрабатывать его? Окно? Оно относится к интерфейсу и не знает о менеджере конвертации. Надо ставить тогда в окно ссылку на менеджер, который вроде по логике окну ни к чему.
Вопрос - как организовать ситуацию правильно в общем принципе?
Вопрос, как правильно организовать отслеживание момента, когда картинка будет перетащена за пределы окна?
В классе контейнера, содержащего картинку я отслеживаю
private function OnMouseDown(e:MouseEvent):void {
lPict.startDrag();
}
private function OnMouseUp(e:MouseEvent):void {
lPict.stopDrag();
// Проверить, что вытащили за пределы окна (parent.parent - список.окно, смотрим по размерам окна)
var ParentCenter:Vector2 = VnObjectT(parent.parent).GetPosition();
var ParentW05:Number = VnObjectT(parent.parent).Width05;
var ParentH05:Number = VnObjectT(parent.parent).Height05;
if (e.stageX > ParentCenter.X + ParentW05 || e.stageX < ParentCenter.X - ParentW05 || e.stageY > ParentCenter.Y + ParentH05 || e.stageY < ParentCenter.Y - ParentH05) {
// За пределами окна - пробуем конвертировать картинку в объект
lConvObject.ConvertFromStorageToObject(new Vector2(e.stageX, e.stageY));
}
else {
// Осталась внутри окна - вернуть на место
lPict.MoveIntoParent(Width05, Height05, true);
}
}
Здесь не нравится обращение parent.parent к родителю. Из-за принципа потомок не знает о родителе, ну и в этом случае любая вставка промежуточного контейнера убивает правильность обращения к родителю.
Как должно быть?
Логика подсказывает, что картинка должна диспатчить эвент об окончании перетаскивания. Но кто должен слушать этот эвент и обрабатывать его? Окно? Оно относится к интерфейсу и не знает о менеджере конвертации. Надо ставить тогда в окно ссылку на менеджер, который вроде по логике окну ни к чему.
Вопрос - как организовать ситуацию правильно в общем принципе?