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>

Из этого XML-файла в первую очередь я создаю Меню из атрибута name категории и с помощью цикла for создаю это меню, и оно выглядит так:

Брендинг Веб Принт

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

Проблема появляется, когда я нажимаю на другое меню. Допустим, я нажимаю на веб, в настоящее время все проекты из Брендинга остаются на сцене, а также все проекты, находящиеся под веб-отображением на сцене. Таким образом, все время, когда я нажимаю на меню, появляются новые данные.

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

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

1 ответ

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

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

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

Этот контейнер может содержать три экрана: Брендинг, Веб и Печать.

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

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

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

Используйте Event Dispatching для меню.

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

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
}
Другие вопросы по тегам