Actionscript3.0 addChild removeChild XML - PullRequest
       68

Actionscript3.0 addChild removeChild XML

1 голос
/ 02 ноября 2011

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

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

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

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

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

Здесь у вас есть ссылка, если вы хотите проверить мой беспорядок: LINK

1 Ответ

1 голос
/ 02 ноября 2011

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

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

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

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

Выможно установить для свойства всех этих экранов 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
}
...