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

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

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

Регистрация: Apr 2010
Сообщений: 14
Tip Как убить счетчик. Не работает Timer.stop()

од из Колина Мука, который я пытался скомпилировать, содержал не поддерживаемый уже класс счетчика, который я заменил на класс Timer. Счетчик создать удалось, проблема в том, как его остановить. Timer.stop() не работает. Без остановки всё нормально компилируется и запускается.

Код AS3:
package zoo {
 import flash.utils.Timer;
 import flash.events.TimerEvent;
 
 internal class VirtualPet {
   private static var maxNameLength = 20;
private static var maxCalories = 2000;
private static var caloriesPerSecond = 200;
 
   private var petName;
private var currentCalories = VirtualPet.maxCalories/2;
   private var creationTime;
 
   public function VirtualPet (name) {
     setName(name);
  var digestIntervalID:Timer = new Timer(1000, 0);
  digestIntervalID.addEventListener(TimerEvent.TIMER, digest);
  digestIntervalID.start( );
   }
 
// часть кода вырезана
 
public function getName ( ) {
return petName;
}
 
private function digest( ) {
  if (currentCalories - VirtualPet.caloriesPerSecond <= 0) {
 trace (getName( ) + " has died.");
 digestIntervalID.stop( );
  } else {
currentCalories -= VirtualPet.caloriesPerSecond;
   trace(getName( ) + "digested some food. It now has " + currentCalories + "calories remaining.");
    }
}
 
   public function getAge ( ) {
   var currentTime = new Date ( );
   var age = currentTime.time - creationTime.time;
   return age;
   }
 }
}

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

Регистрация: Feb 2008
Сообщений: 890
Код AS3:
private function digest(e:TimerEvent):void
{
	if (currentCalories - VirtualPet.caloriesPerSecond <= 0)
	{
		trace (getName( ) + " has died.");
		e.target.stop( );
                      e.target.removeEventListener(e.TimerEvent, digest); //отписываем обработчик
	}
	else
	{
		currentCalories -= VirtualPet.caloriesPerSecond;
		trace(getName( ) + "digested some food. It now has " + currentCalories + "calories remaining.");
	}
}
И, кстати, из Мука все примеры поддерживаются))) Это если вы про setInterval( ).
__________________
скриптограф


Последний раз редактировалось orcpochta; 22.05.2010 в 01:29.
Старый 22.05.2010, 10:47
TOKIO вне форума Посмотреть профиль Отправить личное сообщение для TOKIO Найти все сообщения от TOKIO
  № 3  
Ответить с цитированием
TOKIO

Регистрация: Apr 2010
Сообщений: 14
Цитата:
Сообщение от orcpochta Посмотреть сообщение
Код AS3:
private function digest(e:TimerEvent):void
{
	if (currentCalories - VirtualPet.caloriesPerSecond <= 0)
	{
		trace (getName( ) + " has died.");
		e.target.stop( );
                      e.target.removeEventListener(e.TimerEvent, digest); //отписываем обработчик
	}
	else
	{
		currentCalories -= VirtualPet.caloriesPerSecond;
		trace(getName( ) + "digested some food. It now has " + currentCalories + "calories remaining.");
	}
}
И, кстати, из Мука все примеры поддерживаются))) Это если вы про setInterval( ).
К сожалению код не помог, немного помогло вытаскивание переменной digestIntervalID из конструктора:

Код AS3:
private var digestIntervalID:Timer;
 
    public function VirtualPet (name) {
      setName(name);
	  var digestIntervalID = new Timer(1000, 0);
	  digestIntervalID.addEventListener(TimerEvent.TIMER, digest);
	  digestIntervalID.start( );
    }
Хотя теперь когда выполняется но когда выполняется

Код AS3:
currentCalories - VirtualPet.caloriesPerSecond <= 0
в окне Вывод появляется:

Stan has died.
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at VirtualPet/digest()
at flash.utils::Timer/_timerDispatch()
at flash.utils::Timer/tick()


PS У меня setInterval( ) CS4 не компилирует и выдает ошибку.

Старый 22.05.2010, 11:38
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 4  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Ыыы... ночью писал - лажу написал)))

Код AS3:
private function digest(e:TimerEvent):void
{
	if (currentCalories - VirtualPet.caloriesPerSecond <= 0)
	{
		trace (getName( ) + " has died.");
		e.target.stop( );
                      e.target.removeEventListener(TimerEvent.TIMER, digest); //тут была лажа - что касается таймера, то теперь вроде все ок
	}
	else
	{
		currentCalories -= VirtualPet.caloriesPerSecond;
		trace(getName( ) + "digested some food. It now has " + currentCalories + "calories remaining.");
	}
}
__________________
скриптограф

Старый 24.05.2010, 18:18
TOKIO вне форума Посмотреть профиль Отправить личное сообщение для TOKIO Найти все сообщения от TOKIO
  № 5  
Ответить с цитированием
TOKIO

Регистрация: Apr 2010
Сообщений: 14
Цитата:
Сообщение от orcpochta Посмотреть сообщение
Ыыы... ночью писал - лажу написал)))

Код AS3:
private function digest(e:TimerEvent):void
{
	if (currentCalories - VirtualPet.caloriesPerSecond <= 0)
	{
		trace (getName( ) + " has died.");
		e.target.stop( );
                      e.target.removeEventListener(TimerEvent.TIMER, digest); //тут была лажа - что касается таймера, то теперь вроде все ок
	}
	else
	{
		currentCalories -= VirtualPet.caloriesPerSecond;
		trace(getName( ) + "digested some food. It now has " + currentCalories + "calories remaining.");
	}
}
Спс, этот код работает! Можно небольшие пояснения по поводу:
1. почему в вашем коде не используется созданная в конструкторе переменная digestIntervalID?
2. зачем после e.target.stop( ) еще и событие удалять?

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

Регистрация: May 2003
Адрес: Tallinn
Сообщений: 3,182
Цитата:
2. зачем после e.target.stop( ) еще и событие удалять?
а зачем им засорять память?
__________________
Flash Developer
Папа TDP4 Team Battle

Старый 24.05.2010, 18:30
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 7  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
1. Потому, что в такой реализации эту переменную видно только в самом конструкторе. Чтобы ее было видно в других методах, ее надо объявить в теле класса, а не в конструкторе, тогда ее можно будет использовать для идентификации нашего таймера. Но можно этого не делать, т.к., когда таймер отправляет событийный объект (у меня "e" - от слова event), который передается в приемник digest, то этот событийный объект "e" содержит ссылку на таймер, который его отправил (e.target - ссылка на таймер).
2. Когда вы подписываетесь на какое-то событие, слушатель висит в памяти, если не отписываться от них, то в емком приложении с течением времени могут возникнуть проблемы с памятью, отсюда проблемы с производительностью. Там еще много чего плохого от забытых в памяти слушателей может случиться - Мук это все хорошо описывает в своей книге.
__________________
скриптограф

Старый 24.05.2010, 18:51
TOKIO вне форума Посмотреть профиль Отправить личное сообщение для TOKIO Найти все сообщения от TOKIO
  № 8  
Ответить с цитированием
TOKIO

Регистрация: Apr 2010
Сообщений: 14
Спасибо, всё очень доходчиво. Мук в процессе.

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

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

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


 


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


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