Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.01.2015, 22:07
callme вне форума Посмотреть профиль Отправить личное сообщение для callme Найти все сообщения от callme
  № 11  
Ответить с цитированием
callme
 
Аватар для callme

Регистрация: Dec 2014
Сообщений: 312
Ясно, спасибо.

Цитата:
P.S. Если хотите проверить, как будет работать код - могу ещё дописать класс Button
Нет, все понятно.

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

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Но судя из моего поста можно подумать, что я все действия делаю в Main. Нет, это не так.
Я привёл реализацию панели в Main только для примера. В этом плане слушайте Wolsh
Цитата:
Если у Вас Мейн должен знать все о какой-то тридевятой кнопке в тридесятом контейнере, значит Вы не разделили ответственность по объектам и Мейн перегружен. Ему нужны министры, а министрам — менеджеры, организовывающие персонал. Создавайте цепочки иерархии, компануйте однотипные задачи, не валите все в одну кучу Мейн.
Например, если мы пишем фотошоп, и нам нужна перетаскиваемая панель инструментов с кнопками и крестиком для закрытия, айда делаем вот так
Код AS3:
package 
{
	import flash.display.Sprite;
 
	/**
	 * ...
	 * @author ZackMercury
	 */
	public class InstrumentsPanel extends Sprite 
	{
		private var _panel:Panel;
 
		public function IntrumentsPanel()
		{
			_panel = new Panel();
			_panel.addButton(..., buttonClicked);
 
			//Создаём задний фон панели для перетаскивания при зажатии на нём мыши и крестик для закрытия, опущу этот момент, ибо тут всё элементарно.
			...
			addChild(_panel);
		}
 
		private function buttonClicked(e:MouseEvent):void
		{
			switch((e.target as Button).caption)
			{
				case "...":
					//todo, здесь выбираем текущий инструмент и записываем в публичное свойство, чтобы область рисования выбирала его
					break;
				case "...":
					//todo
					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 в 23:44.
Старый 30.01.2015, 00:41
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 13  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
Как избавиться от глобальных переменных?
Строго говоря, пример с библиотекой ассетов несколько из другой области, нежели организация логики приложения и общения модулей. Можно, конечно, оставить все как есть — особенно если библиотека не ваша и переточить ее невозможно. Однако, и здесь мне хочется поворчать, ибо ситуация очень неприятная, когда Вам приходится писать классы, которыми в будущем воспользоваться не удастся из-за жесткой связности со сторонней либой, да еще наверняка тяжелой и конечно же избыточной. То есть Вы пишете тридевятую кнопочку, а она тянет за собой десять мегабайт ассетов, да еще лежащих в каком-то файле, который может просто потеряться со временем, ибо посторонний)). А как же быть? Да просто эта несчастная кнопочка не должна зависеть от библиотеки. Она должна получать необходимую графику (картинку, клип) в конструктор или сеттер. Такой кнопкой Вы сможете пользоваться в любом другом проекте, ничего в ней не меняя (или минимум, если не можете еще не хардкодить а писать абстрактно). Соответственно, нужную графику необходимо заранее выдернуть из либы ассетов и отдать кнопке при создании. Кто это сделает? Тот, кто создает кнопку и "знает", как она должна выглядеть в данном конкретном проекте. В свою очередь, возможно этот "кто-то" тоже написан реюзабельно (заточен под использование в разных проектах), такая вот универсальная панелька ToolBar например. И её тоже не хочется жестко привязывать к стороннему файлу. Чтож, кто-то создает и ее?)) Вот пусть и отдает ей набор ассетов, необходимый для оформления панельки и кнопок. Это та же самая иерархия, только поток вниз — Император выделяет сумму из казны, и она сползает вниз вплоть до последнего солдатика в окопе, но по иерархии. Естественно, для этого желательно, чтобы либа была сразу заточена под такое использование. Но если она чужая, то пишется менеджер, если хотите, "контроллер" либы, специально обученный кладовщик, знающий, кто где в этой либе лежит и какими пачками кому выдавать. Если вдруг Вам захочется поменять в своем проекте всю библиотеку ассетов, Вам нужно будет только написать нового кладовщика, а не переписывать ВСЕ классы приложения. Надо стремиться к такому планированию классов, даже если хочется просто быстро накидать очередные "Башни". Тогда будет прогресс ваших умений. Проектирование очень важно для развития, не пренебрегайте им, шевелите мозгами.
__________________
Reality.getBounds(this);

Старый 30.01.2015, 12:43
callme вне форума Посмотреть профиль Отправить личное сообщение для callme Найти все сообщения от callme
  № 14  
Ответить с цитированием
callme
 
Аватар для callme

Регистрация: Dec 2014
Сообщений: 312
Спасибо, вроде появились какие-то мысли, буду проверять на практике.

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

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Хотя я могу сказать ещё по этому же примеру.
Мы наследуем нашу панель инструментов от Sprite, однако всё можно упростить, если сделать заготовку, класс Window, который уже будет содержать задний фон и крестик и растягиваться по любой ширине(при этом не растягивая крестик), и наследовать нашу панель от него, тогда не нужно писать в этом классе ничего кроме создания экземпляра Panel и создания в нём кнопок согласно инструментам.
При этом сами инструменты можно вообще вынести в XML-формат, ради того, чтобы инструменты самостоятельно мог себе дописывать пользователь, если вы научите как, или сделаете редактор инструметов)

Вот я только что практически библиотеку продумал до деталей. И потом эти все панели и класс Window можно будет немного модифицируя использовать где угодно и быстро создавать окна и панели из кнопок.
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 30.01.2015 в 16:05.
Старый 31.01.2015, 02:10
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 16  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
ZackMercury, допиши пожалуйста класс Button
__________________
кто не отвечает, того garbage collector забирает

Старый 31.01.2015, 04:15
ZackMercury вне форума Посмотреть профиль Отправить личное сообщение для ZackMercury Найти все сообщения от ZackMercury
  № 17  
Ответить с цитированием
ZackMercury
 
Аватар для ZackMercury

блогер
Регистрация: Jul 2013
Адрес: Север
Сообщений: 1,922
Записей в блоге: 23
Отправить сообщение для ZackMercury с помощью ICQ Отправить сообщение для ZackMercury с помощью Skype™
Цитата:
Сообщение от djken Посмотреть сообщение
ZackMercury, допиши пожалуйста класс Button
Специально для вас собрал рабочий проект. Писал на скорую руку, поэтому если вдруг что-то будет непонятно или найдёте ошибку - отпишите)
П.С. Рекомендую поиграться с исходниками, создать несколько экземпляров таких панелей, разместить их рядом и добавлять/удалять кнопки, выполнять действия по клику на определённые кнопки(например, добавить вторую панель с двумя кнопками, одна будет добавлять кнопку на первой панели, другая - удалять) и т.д. А также отступ между кнопками хранится в константе класса MyPanel.

П.П.С. Размеры кнопки статичны, но их тоже можно сделать динамическими, чтобы кнопка расширялась по контенту внутри неё(кстати, туда можно совать не только текст, а и изображения, если немного модифицировать класс кнопки и панели). Писал быстро, не успел продумать этот момент. Надеюсь на то, что вы сумеете справиться с этой задачей)
Test.swf   (3.2 Кб)
Вложения
Тип файла: swf Test.swf (3.2 Кб, 120 просмотров)
Тип файла: zip com.zip (2.4 Кб, 24 просмотров)
__________________
There is no thing in this world that is not simple.


Последний раз редактировалось ZackMercury; 31.01.2015 в 04:58.
Старый 31.01.2015, 13:13
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 18  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
ZackMercury, мне то все понятно, я уже применил этот подход в своем проекте )
Попросил выложить, потому что не знаю, что нужно прописать в классе для кнопок, чтобы заработал
Код AS3:
btn.onClick = onClick;
. Как я полагаю onClick это публичный метод внутри кнопок и ей как то должна передаться функция onClick, которая приходит как параметр в панель... Уже и так и так крутил, но чтото ошибки выдаются при компиляции )
Щас разбирусь )
Спасибо огромное )
__________________
кто не отвечает, того garbage collector забирает

Старый 31.01.2015, 13:54
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 19  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Судя по записи, onClick это сеттер. То есть
Код AS3:
public function set onClick(value:Function):void { _action = value; }
__________________
Reality.getBounds(this);

Старый 31.01.2015, 14:37
djken вне форума Посмотреть профиль Отправить личное сообщение для djken Посетить домашнюю страницу djken Найти все сообщения от djken
  № 20  
Ответить с цитированием
djken
 
Аватар для djken

Регистрация: May 2010
Адрес: Краснодар
Сообщений: 182
Отправить сообщение для djken с помощью ICQ Отправить сообщение для djken с помощью Skype™
Со всем разобрался, все работает. Спасибо огромное
__________________
кто не отвечает, того garbage collector забирает

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:40.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.