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

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

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Цитата:
Вот если бы ТС хотел не по наведению, а по клику получать текст, как тогда, вешать на все обьекты слушателей down?
У меня иногда возникает чувство, что форум это не место обмена опытом а пошаговая инструкция по применению.. Неужели нет возможности проследить похожесть и различие контекста применения подходов? Вчера говорили про добавление слушателя на стейдж для обработки каждой кнопки по-своему. Сегодня говорят про слушателя на стейдже для одинаковой обработки всех кнопок. Я просто не понимаю как можно не отличить подобный контекст применения подходов.

Старый 03.10.2013, 14:34
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 12  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
я хотел сказать, что на стейдж вешать слушателей более приемлемо, чем добавлять на неё обьекты.
Цитата:
Я воспринимаю это так - "Я не могу добавить на стейдж объект, поэтому лучше добавлю туда слушатель."
Пример про кнопки я привел потом, но там были не только кнопки
Цитата:
Или если нужно вообще весь экран отслеживать на клик? Вот вообще весь, то так всё равно нельзя?

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

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Akopalipsis, понимаете писать можно в кадрах, китайскими иероглифами с использованием глобальных перемененных. Всё конечно же зависит от задачи которая ложиться на разработчика, нельзя взять и сказать вот это универсальное решение на все случаи жизни. В своей практике я стараюсь использовать объект stage как только возможно редко, можно сказать вообще единожды, при инициализации приложений и основываясь на правиле - Можно использовать DO/DOC вместо stage используем и только тогда когда без этого не обойтись - используем stage. ( Как пример события ввода из клавиатуры )
__________________
return this...

Старый 03.10.2013, 14:38
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 14  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Сегодня говорят про слушателя на стейдже для одинаковой обработки всех кнопок.
А что будет если завтра ТС захочет выводить для одних обьектов строки, а для других значения ( числа ).
То все рано ответ будут тот же. Вешать слушателя на стейдж, а там по интерфейсу делить по типам.
И так и получится, что на стейдж вешать слушателей более приемлемо, чем добавлять на неё обьекты.

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

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Ваши вопросы и утверждения изначально неправильные, я именно это отметил.
Нельзя сказать "вешать слушателей более приемлемо, чем добавлять на неё обьекты" - это две совершенно разные, не связанные друг с другом операции. Я перефразировал чтобы вы сами в этом убедились, и потом сказали мне, что
Цитата:
Этими словами Вы приравняли добавить на стейдж обьект с добавить на стейдж слушатель.
Приравняли добавление объекта на стейдж и добавление слушателя на стейдж именно вы, и именно это я подчеркнул в своем сообщении.

Цитата:
И так и получится, что на стейдж вешать слушателей более приемлемо, чем добавлять на неё обьекты.
Вы реально не можете понять или троллите?)
Это две совершенно разные операции, из них нельзя выбрать более приемлимую и менее премлимую) Вы можете и добавить объект на стейдж и добавить слушатель на стейдж, и программа будет работать. От того, что вы добавите объект непосредственно на stage ничего принципиально не изменится.


Последний раз редактировалось KumoKairo; 03.10.2013 в 15:49.
Старый 03.10.2013, 14:47
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 16  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от KumoKairo Посмотреть сообщение
От того, что вы добавите объект непосредственно на stage ничего принципиально не изменится.
Кроме регресса профессиональных качеств)
__________________
return this...

Старый 03.10.2013, 14:54
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 17  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Вы реально не можете понять или троллите?)
я останавливаюсь признав, что это все же разные - несравнимые вещи.
И извиняюсь за настырность, самому не приятно!

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Да бывает. Иногда так хочется услышать четкий ответ от доверяемого источника, что сам перестаешь думать вообще.
__________________
Reality.getBounds(this);

Старый 04.10.2013, 00:58
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 19  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
KumoKairo, Похоже, я нашел способ как проще применить вашу идею, без введения Sprite субкласса, используя только свойство .name объектов. Хотя, он наверное более избыточен, но как именно применить ваш способ к группе экземпляров разных классов, я не сообразил.

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

Короче говоря, получилось так. Основной документ класс:

Код AS3:
package
{
 
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;
 
 
 
	public class Main extends Sprite
	{
 
 
		//--- Экземпляр класса инфо-панели ---//
		private var _panelPlacer:Panel_placer;
 
		//--- Экземпляр класса добавляемых объектов ---//
		private var _objectPlacer:Object_placer;
 
		public function Main()
		{
 
			_objectPlacer = new Object_placer();
			addChild(_objectPlacer);
 
			_panelPlacer = new Panel_placer();
			addChild(_panelPlacer);
 
			//--- Вешаем слушатели на стэйдж ---//
			stage.addEventListener(MouseEvent.MOUSE_OVER, showInfo);
			stage.addEventListener(MouseEvent.MOUSE_OUT, resetInfo);
 
		}
 
		private function showInfo(e:MouseEvent)
		{
 
 
				trace("Класс: ", String(e.target), "; Экземпляр = ", String(e.target.name));
 
				switch(String(e.target))
				{
					case "[object TextField]" :
 
						if(String(e.target.name) == "info_texter")
						{
							_panelPlacer._infoPanel.info_texter.text = "Инфо-область";
						}
						else
						{
							_panelPlacer._infoPanel.info_texter.text = "Текст: " + String(e.target.name);
						}
						break;
 
					case "[object Sprite]" :
						_panelPlacer._infoPanel.info_texter.text = "Квадрат: " + String(e.target.name);
						break;					
 
					case "[object Info_panel]" :
						_panelPlacer._infoPanel.info_texter.text = "Панель: " + String(e.target.name);
						break;
 
					case "[object Circle]" :
						_panelPlacer._infoPanel.info_texter.text = "Эллипс: " + String(e.target.name);
						break;
 
					case "[object Object_placer]" :
						_panelPlacer._infoPanel.info_texter.text = "Шэйп: " + String(e.target.name) + " без спрайта";
						break;
 
				}
 
 
		}
 
		private function resetInfo(e:MouseEvent)
		{
				_panelPlacer._infoPanel.info_texter.text = "...";
		}
 
 
 
 
	}
 
 
 
}
Ну и класс, который размещает все объекты, кроме панели, такой:
Код AS3:
package
{
	import flash.display.*;
	import flash.events.*;
	import flash.text.*;
 
	public class Object_placer extends Sprite
	{
 
		public var _objectPlacer:Object_placer;
 
		//--- Произвольные объекты на экране ---//
		private var _someTextfield:TextField;
		private var _someSquare:Shape;
		private var _someTriangle:Shape;
		private var _shapeSprite:Sprite;
		private var _someCircle:Circle;
 
		public function Object_placer()
		{
 
 
			//--- Размещаем текстфилд ---//
			_someTextfield = new TextField();
			_someTextfield.text = "<<< НАВЕДИ КУРСОР НА ОБЪЕКТ >>>";
			_someTextfield.autoSize = TextFieldAutoSize.LEFT;
			_someTextfield.background = true, _someTextfield.backgroundColor = 0xFFCC00;
			_someTextfield.border = true, _someTextfield.borderColor = 0xFF9900;
			_someTextfield.x = 200, _someTextfield.y = 50;
			_someTextfield.name = "гласящий " + _someTextfield.text;
			addChild(_someTextfield);
 
			//--- Размещаем спрайт квадрата ---//
			_someSquare = new Shape();
			_shapeSprite = new Sprite();
			_shapeSprite.x = 280, _shapeSprite.y = 200;
			_someSquare.graphics.lineStyle(1);
			_someSquare.graphics.beginFill(0x00CCFF, 1);
			_someSquare.graphics.drawRect(0, 0, 75, 50);
			_shapeSprite.addChild(_someSquare);
			_shapeSprite.name = "Голубой такой";
			addChild(_shapeSprite);
 
			//--- Размещаем шейп треугольника ---//
			_someTriangle = new Shape( );
			_someTriangle.graphics.lineStyle(1);
			_someTriangle.graphics.moveTo(100, 200);
			_someTriangle.graphics.beginFill(0xFF00CC, 1);
			_someTriangle.graphics.lineTo(200, 200); 	
			_someTriangle.graphics.lineTo(150, 250);   
			_someTriangle.graphics.lineTo(100, 200);  
			_someTriangle.graphics.endFill( );
			_someTriangle.name = "Фиолетовый";
			addChild(_someTriangle);
 
 
			//--- Размещаем круг ---//
			_someCircle = new Circle();
			_someCircle.x = 450, _someCircle.y = 200;
			_someCircle.name = "Желтый, из Library";
			addChild(_someCircle);
 
		}
 
 
	}
 
}
Выглядит так:
Main.swf   (4.4 Кб)


Видимо, такой подход кривоват, а идея со switch, наверное, весьма избыточна.
Также остаются некоторые слабо прояснённые моменты:

- Непонятно, как работать с безспрайтными Шейпами.
Если я присваиваю такому шейпу свойство .name то оно не проявляется, и все-равно он автоматом получает instanceN.

- Непонятно, как выцеплять пустоту : ) Пришлось обойтись отдельным событием MOUSE_OUT.

- Лучше ли применять события ROLL_OVER и ROLL_OUT в сравнении с MOUSE_OVER и MOUSE_OUT.
Вложения
Тип файла: swf Main.swf (4.4 Кб, 53 просмотров)

Старый 04.10.2013, 01:36
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 20  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Писал как то давно для одного проекта. ВОт вам на скорую руку

Код AS3:
package ru.stickery.views 
{
	import com.greensock.TweenMax;
	import com.in4core.text.DisplayText;
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
	/**
	 * ...
	 * @author in4core progression lab
	 */
	public final class PopupHelp 
	{
		static private var _view:Sprite;
		private static var _holder:Sprite = new Sprite();
 
		public function PopupHelp() 
		{
 
		}
 
		public static function addView(view:Sprite):void
		{
			_view = view;
		}
		public static function showHelp(text:String):void
		{
			if(_view.contains(_holder)) _view.removeChild(_holder);
 
			_view.addChild(_holder);
 
			_holder.stage.removeEventListener(MouseEvent.MOUSE_MOVE , onMouseMove);
 
			_holder.graphics.clear();
 
			if (_holder.numChildren) _holder.removeChildAt(0);
 
			const t:TextField = DisplayText.addField("Verdana_11pt_st" , 11 , true);
			t.text = text;
			t.textColor = 0xFFFFFF;
 
			_holder.graphics.beginFill(0, 0.85);
			_holder.graphics.drawRoundRect(0, 0, t.width + 10 , t.height + 20 , 8);
			_holder.graphics.endFill();
 
			_holder.addChild(t);
 
			t.x = _holder.width / 2 - t.width / 2;
			t.y = _holder.height / 2 - t.height / 2;
 
			_holder.alpha = 0;
 
			TweenMax.to(_holder , 0.5 , { alpha:1 } );
 
			_holder.stage.addEventListener(MouseEvent.MOUSE_MOVE , onMouseMove);
		}
 
		static private function onMouseMove(e:MouseEvent):void 
		{
			_holder.x = e.stageX + 30;
			_holder.y = e.stageY  ;
		}
 
		static public function hideHelp():void
		{
			if(_view.contains(_holder)) _view.removeChild(_holder);
		}
	}
 
}
Код AS3:
package ru.stickery.controllers 
{
	import flash.display.DisplayObject;
	import flash.display.DisplayObjectContainer;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.utils.Dictionary;
	import flash.utils.setTimeout;
	import ru.stickery.views.PopupHelp;
	/**
	 * ...
	 * @author in4core progression lab
	 */
	public class PopupHelpMessages 
	{
		private static var _hash:Dictionary = new Dictionary(true);
 
		public static const notifications:Array = [
		["Приветствие!","Приветсвуем Вас в приложении печати ArtPrint Office!\n\nЕсли у Вас возникли вопросы в течении работы, Вы можете обратится к администратору сайта, воспользовавшись секцией \"контакты\"."],
		["Измерения", "Все размеры холста, фотографий, текста определяются в сантиметрах. Поэтому, когда Вы добавляется фотографию, она уменьшается пропорционально, переводя свои размеры из пикселей в сантиметры.\n\nДля справки : \n1 px = 0.026458333 cm\n1 cm = 37.795275591 px."],
		["Изображения высокого качества. DPI", "Загружая фотографию с компьютера помните, что большинство экранных изображений имеют разрешение 72 DPI, такое качество пагубно скажется на итоговой печати, поэтому желательно загружать фотографии по качеству 300 DPI.\n\nЕсли Вы загрузили фотографию с вашего компьютера, пожалуйста позаботьтесь о том, чтобы оригинальная копия вашей фотографии никуда не потерялась. После оформления заказа, администратор потребует выслать (email) ему оригинальную копию вашей фотографии."],
		["Координаты и клавиатура", "Координаты фотографий в результате сжатия или изменения размеров могут иметь неточные значения, поэтому в некоторых случаях центровка оказывается слегка неточной. В этом случае Вам помогут стрелочки на клавиатуре (влево, вправо, вверх, вниз) для подгонки координат к желаемым.\n\nДля удаления объекта с холста Вы можете также воспользоваться кнопкой Delete на своей клавиатуре."],
		["Приступая к работе" , "Благодарим Вас, что выбрали Нас, мы не подведем!\n\nПри возникновении проблем в работе приложения незамедлительно отправьте email в отдел тех поддержки "mailto:tech@artprint.ru">tech@artprint.ru\n\nНажмите кнопку \"Начать!\", чтобы начать работу с приложением."]
		]
		public static const helpMessages:Array = [
 
		//menu
 
		"Растянуть по вертикали" , //0
		"Растянуть по горизонтали" , //1
		"Центровать" , //2
		"Растянуть на весь экран", //3
		"Установить слой на верхний уровень" , //4
		"Установить слой на уровень ниже" , //5
		"Включить режим наложения Multiply" , //6
		"Отменить последнее действие\n ( поворот, размеры, положение )", //7
		"Удалить слой" , //8
		"Увеличить масштаб просмотра", //9
		"Уменьшить масштаб просмотра" , //10
		"Показать/скрыть сетку", //11
 
		// bottom
 
		"Выбрать размер стены/холста", //12
		"Установить ширину", //13
		"Установить высоту", //14
		"Выбрать фотографию с диска компьютера", //15
		"Выбрать фотографию из платной библиотеки Fotolia", //16
		"", //17
		"Для передвижения текста зажмите клавишу ctrl" // 18
 
		]
 
		public static const textCrutch:String = "Для передвижения текста зажмите клавишу ctrl";
 
		public static function setHelp(source:DisplayObjectContainer , helpIndex:int , delay:int = 0):void
		{
			_hash[source] = [helpIndex , delay];
 
			source.addEventListener(MouseEvent.MOUSE_OVER , showHelp);
			if (source.stage) source.stage.addEventListener(MouseEvent.MOUSE_OVER , hideHelp);
			else source.addEventListener(Event.ADDED_TO_STAGE , onAdded);
		}
 
		static private function onAdded(e:Event):void 
		{
			e.currentTarget.removeEventListener(Event.ADDED_TO_STAGE, onAdded);
			e.currentTarget.stage.addEventListener(MouseEvent.MOUSE_OVER , hideHelp);
		}
 
		static private function hideHelp(e:MouseEvent):void 
		{
 
			PopupHelp.hideHelp();
		}
 
		static private function showHelp(e:MouseEvent):void 
		{
 
			for (var i:* in _hash)
			{
				if ( i == e.currentTarget) 
				{
					setTimeout( PopupHelp.showHelp , _hash[i][1] , helpMessages[_hash[i][0]]);
					break;
				}
			}
		}
 
 
 
	}
 
}
Код AS3:
PopupHelpMessages.setHelp(source, helpNum);
__________________
Марк Tween

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

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

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


 


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


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