Цитата:
|
Кнопка сама себя подписывает на CLICK. При клике диспатчит одно из событий панели.
|
Что за ерунда? Где логика?
Кнопка не знает ничего о панели, она лишь знает свою функцию.
Можно вызывать callBack() внутри кнопки, на который сделать сеттер onClick = someFunc;
Но колбеки делают код неоднородным, а поэтому лучше подписываться на клик в двух местах - снаружи кнопки для того, чтобы знать, когда менять xml и внутри кнопки, чтобы к примеру менять визуальное отображение и состояние.
Предлагаю сделать ещё интересней,

Код AS3:
package
{
import flash.display.Sprite;
/**
* ...
* @author ZackMercury
*/
public class Panel extends Sprite
{
private static const OFFSET_BETWEEN_BUTTONS:int = 5;
private var _buttons:Vector.<Button>;
public function Panel()
{
_buttons = new Vector.<Button>();
}
public function addButton(caption:String, onClick:Function):void
{
var btn:Button = new Button(caption);
btn.onClick = onClick;
addChild(btn);
_buttons.push(btn);
update();
}
public function removeButton(caption:String):void
{
for (var i:int = 0; i < _buttons.length; i ++)
{
if (_buttons[i].caption == caption)
{
removeChild(_buttons[i]);
_buttons.splice(i, 1);
}
}
update();
}
private function update():void
{
for (var i:int = 0; i < _buttons.length; i ++)
{
_buttons[i].y = (_buttons[i].height + OFFSET_BETWEEN_BUTTONS) * i;
}
}
}
}

Код AS3:
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
/**
* ...
* @author ZackMercury
*/
public class Main extends Sprite
{
public function Main()
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}
public function init(e:Event = null):void
{
if (hasEventListener(Event.ADDED_TO_STAGE)) removeEventListener(Event.ADDED_TO_STAGE, init);
//entry
var panel:Panel = new Panel();
panel.addButton("Start game", buttonClicked);
panel.addButton("Exit", buttonClicked);
panel.addButton("Options", buttonClicked);
panel.removeButton("Options");
addChild(panel);
}
private function buttonClicked(e:MouseEvent):void
{
switch((e.target as Button).caption)
{
case "Start game":
//начинаем игру
break;
case "Exit":
//выходим из игры
break;
default:
throw new Error("No action for this button");
}
}
}
}