Actionscript3.0 addChild removeChild XML

#xml #flash #actionscript-3 #removechild #addchild

#xml #flash #actionscript-3 #removechild #addchild

Вопрос:

Я не знаю, подходит ли мне для моей проблемы метод 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 я создаю это меню, и оно выглядит так:

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

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

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

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

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

Ответ №1:

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

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

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

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

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

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

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

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

В любом случае, вот примерный пример, он неполный, но должен дать вам представление…

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

    //The dispatcher dispatches amp; 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
}
 

Комментарии:

1. Спасибо, Патрик, я рассмотрю ваше решение и вернусь к вам. На первый взгляд выглядит нормально!

2. Но мое меню динамическое, у меня нет только трех категорий в меню. Он динамический, мне нужно будет добавить больше категорий и изменить их к тому времени, вот почему я использую xml!

3. Все в порядке… Я только что дал вам основную логику. Вы можете использовать тот же принцип с XML . Не имеет значения, как создаются кнопки

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