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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.02.2011, 15:04
_JOKER_ вне форума Посмотреть профиль Отправить личное сообщение для _JOKER_ Найти все сообщения от _JOKER_
  № 1  
Ответить с цитированием
_JOKER_

Регистрация: Jan 2011
Сообщений: 5
По умолчанию Как сделать функцию для нескольких объектов?

Есть у меня небольшая функция, с помощью которого можно двигать объект и если передвинуть его в определённую точку и отпустить лкм - он там остановится, а если отпустить лкм в любом другом месте - возвратится назад
так вот, этих точек и объектов у меня несколько. Как сделать чтоб эта функция применялась к сразу нескольким функциям и объектам? Например чтоб разные объекты можно было оставить в разных точках
сам код:
Код AS3:
import fl.transitions.Tween;
import fl.transitions.easing.*;
 
var place = new Array()
place[0] = placeLamp
place[1] = placeAmpermetr
place[2] = placeVoltmetr
 
place[0].visible = !visible
place[1].visible = !visible
place[2].visible = !visible
 
var moveBackX: Tween;
var moveBackY: Tween;
 
var obj = new Array
obj[0] = lamp
obj[1] = ampermetr
obj[2] = voltmetr
 
var point = new Array()
point[0] = point1
point[1] = point2
point[2] = point3
point[3] = point4
 
lamp.addEventListener(MouseEvent.MOUSE_DOWN, dragF);
stage.addEventListener(MouseEvent.MOUSE_UP, backF);
 
function dragF(e:MouseEvent):void
{
  lamp.startDrag();
}
 
function backF (e:MouseEvent):void
{
  if (point1.hitTestPoint(lamp.x, lamp.y))
  {
   lamp.stopDrag();
   var lampStopX = new Tween(lamp, "x", Strong.easeOut, lamp.x, point1.x, 0.5, true)
   var lampStopY = new Tween(lamp, "y", Strong.easeOut, lamp.y, point1.y, 0.5, true)
  }
  else
  {
   lamp.stopDrag();
      moveBackX = new Tween(lamp, "x", Strong.easeOut, lamp.x, placeLamp.x, 0.5, true)
      moveBackY = new Tween(lamp, "y", Strong.easeOut, lamp.y, placeLamp.y, 0.5, true)
  }
 
}
исходник

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

Регистрация: Nov 2009
Адрес: в златоглавой
Сообщений: 745
Вешай слушатель события на все объекты
Код AS3:
lamp.addEventListener(MouseEvent.MOUSE_DOWN, dragF);
ampermetr.addEventListener(MouseEvent.MOUSE_DOWN, dragF);
voltmetr.addEventListener(MouseEvent.MOUSE_DOWN, dragF);
Потом в функции dragF делай event.target.нужноеДействие.
__________________
Нормально делай — нормально будет!

Старый 01.03.2011, 01:35
_JOKER_ вне форума Посмотреть профиль Отправить личное сообщение для _JOKER_ Найти все сообщения от _JOKER_
  № 3  
Ответить с цитированием
_JOKER_

Регистрация: Jan 2011
Сообщений: 5
tsarapkabel, спасибо, получилось =)
теперь я хочу сделать, чтоб не только для lamp действовало возвращение к своему месту, а и для других объектов
Код AS3:
function dragF(e:MouseEvent):void
{
	e.target.startDrag();
}
 
function backF (e:MouseEvent):void
{
	if (point1.hitTestPoint(e.target.x, e.target.y))
	{
		e.target.stopDrag();
		var lampStopX = new Tween(e.target, "x", Strong.easeOut, e.target.x, point1.x, 0.5, true)
		var lampStopY = new Tween(e.target, "y", Strong.easeOut, e.target.y, point1.y, 0.5, true)
	}
	else
	{
		e.target.stopDrag();
	    moveBackX = new Tween(e.target, "x", Strong.easeOut, e.target.x, place.x, 0.5, true)
	    moveBackY = new Tween(e.target, "y", Strong.easeOut, e.target.y, place.y, 0.5, true)
	}
 
}
то есть чтоб для каждого объекта свой place.x и place.y
и ещё хочу, чтоб эти объекты можно было лепить не только к point1, а и к другим point-ам

Старый 01.03.2011, 01:48
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 4  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
я думаю говорить про ооп и прочишь штуки бесполезно?
например можно как то так:
Код AS3:
		function backF (e:MouseEvent):void
		{
			switch (e.target)  // можно так же сравнивать по инстанснеймам, как вам там удобнее
			{
				case lamp:
					useLamp();
					break;
				case ampermetr:
					useAmpermetr();
					break;
				case voltmetr:
					useVoltmetr();
					break;
			}
		}
 
		private function useLamp():void 
		{
			lamp.stopDrag();
			// new Tween(lamp, "x", Strong.easeOut, lamp.x, point1.hitTestPoint(lamp.x, lamp.y) ? point1.x : place.x, 0.5, true);
			// new Tween(lamp, "y", Strong.easeOut, lamp.y, point1.hitTestPoint(lamp.x, lamp.y) ? point1.y : place.y, 0.5, true);
			// можно в одну строчку как выше, но пример ниже нагляднее, хотя смысл тот же
 
			if (point1.hitTestPoint(lamp.x, lamp.y))
			{
				new Tween(lamp, "x", Strong.easeOut, lamp.x, point1.x, 0.5, true);
				new Tween(lamp, "y", Strong.easeOut, lamp.y, point1.y, 0.5, true);
			} else {
				moveBackX = new Tween(lamp, "x", Strong.easeOut, lamp.x, place.x, 0.5, true)
				moveBackY = new Tween(lamp, "y", Strong.easeOut, lamp.y, place.y, 0.5, true)
			}
		}
то есть для каждого обьекта пишете свою функцию и все.


Последний раз редактировалось nOobCrafter; 01.03.2011 в 01:51.
Старый 08.03.2011, 01:44
_JOKER_ вне форума Посмотреть профиль Отправить личное сообщение для _JOKER_ Найти все сообщения от _JOKER_
  № 5  
Ответить с цитированием
_JOKER_

Регистрация: Jan 2011
Сообщений: 5
nOobCrafter, тогда stopDrag не работает, lamp.addEventListener не подключается к useLamp()
P.S.: у меня проблемы с интернетом, часто на сайт заходить не получается

Старый 08.03.2011, 02:00
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 6  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Код AS3:
function backF (e:MouseEvent):void
		{
			switch (e.target)  // можно так же сравнивать по инстанснеймам, как вам там удобнее
			{
				case lamp:
					useLamp();
					break;
				case ampermetr:
					useAmpermetr();
					break;
				case voltmetr:
					useVoltmetr();
					break;
			}
		}
Это называется "что-то код слишком простой - давайте свичей налепим - свичи же это красиво!"

Старый 08.03.2011, 03:36
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 7  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
expl по вашему if|else лучше?

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

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
между if и switch нет принципиальной разницы

Код AS3:
switch (e.target)  // можно так же сравнивать по инстанснеймам, как вам там удобнее
			{
				case lamp:
					useLamp();
					break;
				case ampermetr:
					useAmpermetr();
					break;
				case voltmetr:
					useVoltmetr();
					break;
			}
Что тут происходит? Мы вместо того, чтобы подписать на каждую кнопку свое УНИКАЛЬНОЕ действие, подписываем один слушатель с определением какая кнопка сработала. Зачем? У нас не было лишней логики, теперь мы ее добавили - можно себя поздравить


Последний раз редактировалось expl; 08.03.2011 в 13:40.
Старый 08.03.2011, 14:39
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 9  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
я развил код из второго поста, мне именно такой подход не очень нравится, но имхо это лучше чем 100500 левых хендлеров. С учетом того что действия вообщем то однотипные можно определить динамические данные и дальше метода backF ходить не придется. Пример ниже:
Код AS3:
		import fl.transitions.Tween;
		import fl.transitions.easing.*;
 
		var moveBackX	: Tween;
		var moveBackY	: Tween;
		var pointsArr	:Array = [point1, point2, point3, point4];
		var placeArr	:Array = [placeLamp, placeAmpermetr, placeVoltmetr];
		var len			:int = placeArr.length;
		for (var i:int = 0; i < len; i++) 
			placeArr[i].visible = !visible;			// я правда не понял зачем
 
		var objectsArr	:Array = [lamp, ampermetr, voltmetr];
		len = objectsArr.length;
		for (i = 0; i < len; i++) 
			objectsArr[i].addEventListener(MouseEvent.MOUSE_DOWN, onObjectMouseDownHandler);
 
			stage.addEventListener(MouseEvent.MOUSE_UP, onStageMouseUpHandler);
 
		function onObjectMouseDownHandler(e:MouseEvent):void
		{
			e.currentTarget.startDrag();
		}
 
		function onStageMouseUpHandler(e:MouseEvent):void
		{
			var obj:Sprite = e.currentTarget as Sprite;
			var index:int = objectsArr.indexOf(obj);  // т.к. кодите в иде, то индекс можно было сохранить как св-во мувика, он всеравно динамический, но можно и так.
			if (index == -1) return;
			var point:Sprite = pointsArr[index];  // спрайты или что там?
			var place:Sprite = placeArr[index];  // спрайты или что там?
 
			new Tween(obj, "x", Strong.easeOut, obj.x, point.hitTestPoint(obj.x, obj.y) ? point.x : place.x, 0.5, true);
			new Tween(obj, "y", Strong.easeOut, obj.y, point.hitTestPoint(obj.x, obj.y) ? point.y : place.y, 0.5, true);
 
			obj.stopDrag();
		}
из всего этого видно что данный подход имеет очевидные плюсы, а вам мало того что пришлось бы руками подписываться на каждый хендлер, так еще и описывать его.


Последний раз редактировалось nOobCrafter; 08.03.2011 в 15:01.
Старый 08.03.2011, 14:51
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Если для 100500 объектов нужны РАЗНЫЕ действия - нужно задуматься, а то ли вообще мы делаем?

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

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

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


 


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


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