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

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

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

Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
По умолчанию Обобщил код Listener, и он теперь срабатывает максимум 1 раз

Вот так работает как надо при каждом возникновении события.
Код AS3:
	private function place (e:MouseEvent):void {
		e.target.stopDrag();
		if (e.target.hitTestObject (pack2)) {
			if (e.target.index == 1) {
				e.target.index = 2;
				itemsInPack1--;
				itemsInPack2++;
				numberOfItems1.text = itemsInPack1.toString();
				numberOfItems1.setTextFormat (format)
				numberOfItems2.text = itemsInPack2.toString();
				numberOfItems2.setTextFormat (format)
			};
		};
	};
А вот так срабатывает 1 раз при возникновении события, а потом работать перестает.
Код AS3:
	private function place (e:MouseEvent):void {
		e.target.stopDrag();
		if (e.target.hitTestObject (pack2)) {
			if (e.target.index == 1) {
				e.target.index = 2;
				updateNumberOfItems (itemsInPack1, itemsInPack2, numberOfItems1, numberOfItems2);
			};
		};
	};
 
	private function updateNumberOfItems (toReduce:Number, toEnlarge:Number, textToUpd1:TextField, textToUpd2:TextField):void {
		toReduce--;
		toEnlarge++;
		textToUpd1.text = toReduce.toString();
		textToUpd1.setTextFormat (format)
		textToUpd2.text = toEnlarge.toString();
		textToUpd2.setTextFormat (format)
	};
Почему так происходит и как с этим бороться?


Последний раз редактировалось Furinax; 27.10.2009 в 16:03.
Старый 27.10.2009, 15:54
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 2  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Мистику какую-то вы нам рассказываете) Вы точно уверены, что больше ничего не меняли?
И за какое событие отвечает обработчик place?

Старый 27.10.2009, 15:57
Furinax вне форума Посмотреть профиль Отправить личное сообщение для Furinax Найти все сообщения от Furinax
  № 3  
Ответить с цитированием
Furinax
[+1 02.09.15]

Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
Серьезно, код№1 работает. А код№2 србатывает один раз, а потом перестает работать.
Листенер отвечает за MouseEvent.MOUSE_UP.
Как видно, код№2 ничего больше не меняет, чего бы не менял код№1.
Самый прикол: что в коде№2 обобщенная функция вызывается, но
Код AS3:
	toReduce--;
	toEnlarge++;
во второй раз не срабатывают


Последний раз редактировалось Furinax; 27.10.2009 в 16:02.
Старый 27.10.2009, 16:18
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
itemsInPack1, itemsInPack2 передаются в функцию по значению и меняются там как локальные переменные, сами же не меяются
возможно из-за этого ломается что-то в общем алгоритме

к слову, зачем ты их передаешь, если они члены класса?

Старый 27.10.2009, 16:56
Furinax вне форума Посмотреть профиль Отправить личное сообщение для Furinax Найти все сообщения от Furinax
  № 5  
Ответить с цитированием
Furinax
[+1 02.09.15]

Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
itemsInPack1, itemsInPack2, также как и numberOfItems1, numberOfItems2 - это переменные экземпляра. Чтобы каждый раз не писать:
Код AS3:
itemsInPack1--
itemsInPack2++
Решил написать обобщенную функцию. Но она, к сожалению не работает больше 1 раза.
А если в обобщенной функции все локальные переменные определить как переменные экземпляра - то это нормальное решение?

Старый 27.10.2009, 17:10
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
ну сам подумай, если в методе к ним и так есть доступ зачем их передавть в аргументах

Старый 27.10.2009, 17:21
Furinax вне форума Посмотреть профиль Отправить личное сообщение для Furinax Найти все сообщения от Furinax
  № 7  
Ответить с цитированием
Furinax
[+1 02.09.15]

Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
Передаю в аргументы потому, что у меня очень много операторов if в усорвия которых будут входить и itemsPack3, и numberOfItems3 и т.д. Если для каждого из них столько расписывать, сколько в коде 1, то потом чтоб разобраться - придется в коде очень долго копаться. А тут одна функция, по которой все должно быть видно.
Осталость только додуматься, как при её повторном вызове менять переменную экземпляра больше чем 1 раз.

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

Регистрация: Feb 2008
Адрес: Череповец
Сообщений: 623
Отправить сообщение для Felicast с помощью ICQ
попробуйте сделать так
Код AS3:
trace(itemsInPack1);
updateNumberOfItems (itemsInPack1, itemsInPack2, numberOfItems1, numberOfItems2);
trace(itemsInPack1);
может поймете в чем ошибка.
значение itemsInPack1 не изменится
чтобы все работало, нужно, чтобы itemsInPack1 и itemsInPack2 изменялись не в функции, а перед
вот пример:
Код AS3:
updateNumberOfItems (--itemsInPack1, ++itemsInPack2, numberOfItems1, numberOfItems2);
 
///////////////
 
private function updateNumberOfItems (toReduce:Number, toEnlarge:Number, textToUpd1:TextField, textToUpd2:TextField):void 
{
	textToUpd1.text = toReduce.toString();
	textToUpd1.setTextFormat (format)
	textToUpd2.text = toEnlarge.toString();
	textToUpd2.setTextFormat (format)
};
надеюсь понятно, к чему я клоню
__________________
я могу стать всем, если только захочу

Старый 27.10.2009, 17:38
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 9  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
Цитата:
Сообщение от Furinax Посмотреть сообщение
Передаю в аргументы потому, что у меня очень много операторов if в усорвия которых будут входить и itemsPack3, и numberOfItems3 и т.д. Если для каждого из них столько расписывать, сколько в коде 1, то потом чтоб разобраться - придется в коде очень долго копаться. А тут одна функция, по которой все должно быть видно.
Осталость только додуматься, как при её повторном вызове менять переменную экземпляра больше чем 1 раз.
все верно, функции/методы для того и нужны
просто имей ввиду, что простые типы, если ты передаешь их в функцию, передаются по значению, т.е. так ты сможешь только воспользоваться значением _num, но не изменить его:
Код AS3:
public class Main extends Sprite 
{
	private var _num:Number = 0;
	public function Main():void 
	{
 
		increaseNum(_num);
		trace( "_num : " + _num );//_num : 0
 
	}
	private function increaseNum(par:Number):void
	{
		par++;
		trace( "par : " + par );//par : 1
	}
}
из-за этого, похоже, все и ломается в твоем примере

Старый 27.10.2009, 17:39
Furinax вне форума Посмотреть профиль Отправить личное сообщение для Furinax Найти все сообщения от Furinax
  № 10  
Ответить с цитированием
Furinax
[+1 02.09.15]

Регистрация: Mar 2009
Адрес: Moscow
Сообщений: 469
Спасибо огромное! Никогда бы не догадался, что можно увеличивать аргумент прямо передавая его в функцию. Теперь это будет новым приемом в моем арсенале

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

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

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


 


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


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