Имена динамических переменных - Actionscript 3 - PullRequest
0 голосов
/ 29 марта 2011

Я хотел бы динамически создавать элементы на основе массива. Я хотел бы просто указать имя массива и добавить _panel ... чтобы menu_item_panel стал settings_panel, info_panel и т. Д. Я не могу понять, как это сделать?

var menu_items:Array = new Array("settings","info","debug","Feedback");
var menu_items_count:Number = menu_items.length;

var menu_height:Number = c.height / menu_items_count;
var menu_height_int:Number = 0;

for (var i:int=0; i<menu_items_count; i++)
{
    var menu_item_panel:Sprite = new Sprite();
menu_item_panel.graphics.beginFill(0x000000, 1);
menu_item_panel.graphics.drawRect(0, menu_height, c.width, menu_height);
menu_item_panel.graphics.endFill();
menu_panel.addChild(menu_item_panel);
menu_panel.addEventListener(MouseEvent.CLICK,menu_panel_click);
menu_height_int = menu_height_int + menu_height;
}

Ответы [ 5 ]

0 голосов
/ 30 марта 2011

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

this[menu_items[i]+"_panel"] = menu_item_panel;
    menu_panel.addChild(this[menu_items[i]+"_panel"]);

И я могу сделать это видимым, сказав:

 this.settings_panel.visible = false;
0 голосов
/ 30 марта 2011

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

0 голосов
/ 29 марта 2011

Попробуйте это

for (var i:int=0; i<menu_items_count; i++)
{
    var menu_item_panel:Sprite = new Sprite();
    menu_item_panel.graphics.beginFill(0x000000, 1);
    menu_item_panel.graphics.drawRect(0, menu_height, c.width, menu_height);
    menu_item_panel.graphics.endFill();
    menu_panel.addChild(menu_item_panel);
    menu_panel.addEventListener(MouseEvent.CLICK, function(){});
    menu_height_int = menu_height_int + menu_height;
    // Store the new clip in a var
    this[menu_items[i]+"_panel"] = menu_item_panel;
}
// get the clips
trace(this.settings_panel);
trace(this.info_panel);
trace(this.debug_panel);
trace(this.Feedback_panel);
0 голосов
/ 29 марта 2011

Simple:

for (...)
{
    //...
    menu_item_panel.name = menu_items[i]+"_panel";
    menu_panel[menu_item_panel.name] = menu_panel.addChild(menu_item_panel);
    //...
}

Это потому, что две вещи:

// This line set the name of the item to "settings_panel", "info_panel", etc
menu_item_panel.name = menu_items[i]+"_panel";

// This line add menu_item_panel as a child of menu_panel
// and set the property called "settings_panel", "info_panel", etc
// to the right panel
menu_panel[menu_item_panel.name] = menu_panel.addChild(menu_item_panel);

Итак, когда вы запустите эту строку:

menu_panel.settings_panel;

Вы получаете пункт меню под названием "settings_panel"

Этот тип настройки:

object[string] = property;

Работает для всех объявленных объектов dynamic (MovieClip и Object равны dynamic). Это способ добавления (динамически) свойств к объекту во время выполнения.

0 голосов
/ 29 марта 2011

Я бы рекомендовал установить для свойства name объекта Sprite имя элемента меню.

menu_item_panel.name = menu_items[i];

Затем в обработчике click вы проверяете свойство name event.target и выполняете соответствующее действие на основе этого.

...