Показать сообщение отдельно
Старый 29.01.2015, 18:13
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 8  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Цитата:
Кнопка сама себя подписывает на 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");
			}
		}
	}
}
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 29.01.2015 в 22:39.