Actionscript3.0 addChild removeChild XML

Я не знаю, нужны ли мне для моей проблемы методы addChild и removeChild, но, поскольку я читал в Интернете, это метод, с которым мне нужно работать.

Это мой XML-файл:

<projects>
   <category name = "Branding">
      <project>Logo e effekt Medias1</project>
      <project>Portali Logo1</project>
      <project>Skena  Logo1</project>
   </category>
   <category name = "Web">
      <project>Logo e effekt Medias2</project>
      <project>Portali Logo2</project>
      <project>Skena  Logo2</project>
   </category>
   <category name = "Print">
      <project>Logo e effekt Medias3</project>
      <project>Portali Logo3</project>
      <project>Skena  Logo3</project>
   </category>

From this XML file first of all i am creating an Menu from name attribute of the category and with an for loop i create this menu and it looks like this:

Брендинг веб-печати

После этого, когда я нажимаю, скажем, «Брендинг», я создаю еще один мувиклип, и в этом мувиклипе отображаются все проекты в разделе «Брендинг». Пока здесь все в порядке.

Проблема появляется, когда я нажимаю на другое меню. Скажем, я нажимаю на Web, в это время все проекты из Branding остаются на сцене, а также все проекты в веб-отображении на сцене. Таким образом, все время, когда я нажимаю на меню, появляются новые данные.

Какой метод лучше всего использовать, поэтому, когда я нажимаю на меню, на сцене появляются только данные, относящиеся к этой категории.

Вот ссылка, если вы хотите проверить мой беспорядок: ССЫЛКА


person AXheladini    schedule 02.11.2011    source источник


Ответы (1)


Ну, это не совсем о добавлении или удалении детей. Настоящая проблема заключается в вашей перспективе развития.

Прежде всего, вы создаете меню, так что пусть меню будет просто Объектом, который посылает сигналы, чтобы сообщить, какая кнопка была нажата.

После этого вам понадобится какая-то форма контейнера, который будет отображать соответствующий экран при получении сообщения меню.

Этот контейнер может содержать три экрана: Branding, Web и Print.

Вы можете установить для всех этих экранов свойство visible значение false.

Когда контейнер получает информацию о меню, он устанавливает для свойства visible выбранного экрана значение true, а для других экранов — значение false.

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

Используйте диспетчеризацию событий для меню.

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

public class Menu extends Sprite 
{
    //A basic button instance
    private var button:Sprite = new Sprite();

    //The dispatcher dispatches & listen to events
    //it acts as a connector between your container 
    //and the menu
    private var dispatcher:EventDispatcher;

    //The menu will be created in the Container
    //the dispatcher will be passed as a parameter
    //this is the connection between the two classes
    //Please note that there are other ways to achieve
    //a similar result..
    public function Menu (dispatcher:EventDispatcher) 
    {
        //assign the dispatcher instantiated in the container
        //to a variable in order to manipulate it in this class
        this.dispatcher = dispatcher;

        //takes care of creating the menu
        createMenu();
    }

    private function clickHandler( event:MouseEvent):void
    {
        //each time a button is click an event is dispatched
        //that contains the name of the clicked button
        dispatcher.dispatchEvent
                ( new MenuEvent(event.currentTarget.name));
    }

    private function createMenu():void
    {
       //here you load the XML, create the buttons
       // and add the event listeners

       //this is just an example for the logic
       //it's irrelevant since the button will 
       //be created from the XML
        button.name = "Branding";
            addChild( button );
            button.addEventListener
                ( MouseEvent.CLICK , clickHandler );
    }
}


public class Container extends Sprite 
{
   private var button:Sprite = new Sprite();

   //Here we instantiate a dispatcher
   private var dispatcher:EventDispatcher = new EventDispatcher;
   private var menu:Menu;

   //a basic screen instance that could contain
   //all that has to do with Branding for instance
   private var screen1:Sprite = new Sprite();
   //etc...

   public function Container () 
   {
        //The dispatcher is set to listen to the events 
        //dispatched in the Menu class
        dispatcher.addEventListener( MenuEvent.MENU , eventListener );
        screen1.visible = false;

        //now the menu can be created
        menu = new Menu( dispatcher);
        addChild( menu );
   }

   private function eventListener( event:MenuEvent):void
   {
        //set all the screens visibility to false
        //here...

        //get the event name and react accordingly
        //here you can implement a switch

       switch(event.name)
       {
            case "Branding":
            //show Branding screen
            screen1.visible = true;
            break;

            //etc...

       }                                
   }
}

public class MenuEvent extends Event
{
    public const MENU:String = "Menu Event";
    public var name:String;

    //Check custom events for the rest of the code...
    //Do a Google search for custom events 
    //shouldn't be too difficult to find
}
person PatrickS    schedule 02.11.2011
comment
Спасибо, Патрик, я рассмотрю ваше решение и вернусь к вам. На первый взгляд нормально! - person AXheladini; 02.11.2011
comment
Но мое меню динамическое, у меня нет только трех категорий в меню. Оно динамическое, мне нужно будет добавить больше категорий и изменить их к тому времени, поэтому я использую xml! - person AXheladini; 02.11.2011
comment
Все в порядке... Я просто дал вам основную логику. Вы можете использовать тот же принцип с XML. Неважно, как создаются кнопки - person PatrickS; 03.11.2011
comment
Патрик, код, который вы набрали, очень профессиональный, и я сейчас не на том уровне. Даже если я понимаю логику, я все равно не знаю, какая функция для чего? Если вы сможете прокомментировать каждую функцию по их функциональности, будет хорошо! - person AXheladini; 03.11.2011