Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Реализация alwaysOnTop для DisplayObjecta (http://www.flasher.ru/forum/showthread.php?t=136741)

mayakwd 24.02.2010 17:26

Реализация alwaysOnTop для DisplayObjecta
 
Вопрос вполне себе глупый, хочется изящного решения. Я не нашел ни одного эвента (поднимите мне веки) который отвечал бы за смену позиции объекта в дисплейлисте.

Простым решением было бы создать класс в котором будет один энетрфрейм и список объектов, который пополняется пользователем, на энтерфрэйм естественно проверяется на какой глубине лежат объекты, и в случае если они находятся не на самой высшей позиции перекинуть их туда.

Вопрос: есть ли более изящное решение для такой ситуации?
Вопрос на вопрос ("зачем?") не актуален.

Obi 24.02.2010 18:12

Код AS3:

class SmartContainer extends DisplayObjectContainer {
  private var _onTopObj:DisplayObject;
 
  override public function addChild(child:DisplayObject):DisplayObject {
        if(_onTopObj && contains(_onTopObj)) {
              if(child !== _onTopObj) {
                    super.addChildAt(child, getChildIndex(_onTopObj))
              }
        }else {
                super.addChild(child);
        }
        return child;
    }
}

Как-то так, если уж прям нестерпимо хочется автоматизировать.

UPD: Но уж никак не ENTER_FRAME.

Gaen 24.02.2010 18:14

Еще можно перекрыть методы DisplayObjectContainer, которые меняют позицию объекта в дисплейлисте (addChild, addChildAt, removeChild, removeChildAt, setChildIndex, swapChildren, swapChildrenAt)

mayakwd 24.02.2010 18:32

вы мне и stage предлагаете переписать? это далеко не изящное, а частное решение.

Obi 24.02.2010 18:44

Цитата:

Сообщение от mayakwd (Сообщение 888981)
вы мне и stage предлагаете переписать? это далеко не изящное, а частное решение.

>> вы мне и stage предлагаете переписать
Нет, для этого есть класс SmartContainer, который можно добавить на stage.

>> это далеко не изящное, а частное решение
Любое решение — частное. Особенно то, которое не предусмотрено API. Вы хотите чтобы все автоматически работало как надо? Так не бывает, смиритесь.

mayakwd 24.02.2010 18:51

Вы не правы. Область видимости должна быть независимой.
Поэтому удобнее использовать тот способ который описал я. Взамен энтерфэйма может быть таймер.

Решение которое предложил я универсальное, поэтому обойдемся без громких слов.
И пожалуйста не надо меня поучать, я вполне компетентен, чтобы решить с чем смириться, а с чем нет.

У кого еще есть идеи?
И да пожалуйста не надо стараться изменить задачу.

Rzer 24.02.2010 19:05

Код AS3:

 
var top:DisplayObject;
 
addEventListener(Event.ADDED, onSomethingAdded);
 
private function onSomethingAdded(e:Event):void {
 
  if(!top){
      return;
  }
 
  //Событие пузырьковое (отслеживаем события только из подписанного контейнера)
  if (e.target == e.currentTarget){
    if (contains(top)){
      setChildIndex(top, numChildren-1);
    }
  }
}

Вроде так должно сработать, хотя не отловит тот же самый setChildIndex


Часовой пояс GMT +4, время: 08:58.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.