![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Apr 2010
Сообщений: 14
|
од из Колина Мука, который я пытался скомпилировать, содержал не поддерживаемый уже класс счетчика, который я заменил на класс Timer. Счетчик создать удалось, проблема в том, как его остановить. Timer.stop() не работает. Без остановки всё нормально компилируется и запускается.
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; } } } |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
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."); } }
__________________
скриптограф Последний раз редактировалось orcpochta; 22.05.2010 в 01:29. |
|
|||||
|
Регистрация: Apr 2010
Сообщений: 14
|
Цитата:
private var digestIntervalID:Timer; public function VirtualPet (name) { setName(name); var digestIntervalID = new Timer(1000, 0); digestIntervalID.addEventListener(TimerEvent.TIMER, digest); digestIntervalID.start( ); } в окне Вывод появляется: Stan has died. TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null". at VirtualPet/digest() at flash.utils::Timer/_timerDispatch() at flash.utils::Timer/tick() PS У меня setInterval( ) CS4 не компилирует и выдает ошибку. |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
Ыыы... ночью писал - лажу написал)))
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."); } }
__________________
скриптограф |
|
|||||
|
Регистрация: Apr 2010
Сообщений: 14
|
Цитата:
1. почему в вашем коде не используется созданная в конструкторе переменная digestIntervalID? 2. зачем после e.target.stop( ) еще и событие удалять? |
|
|||||
|
Регистрация: May 2003
Адрес: Tallinn
Сообщений: 3,182
|
Цитата:
|
|
|||||
|
Регистрация: Feb 2008
Сообщений: 890
|
1. Потому, что в такой реализации эту переменную видно только в самом конструкторе. Чтобы ее было видно в других методах, ее надо объявить в теле класса, а не в конструкторе, тогда ее можно будет использовать для идентификации нашего таймера. Но можно этого не делать, т.к., когда таймер отправляет событийный объект (у меня "e" - от слова event), который передается в приемник digest, то этот событийный объект "e" содержит ссылку на таймер, который его отправил (e.target - ссылка на таймер).
2. Когда вы подписываетесь на какое-то событие, слушатель висит в памяти, если не отписываться от них, то в емком приложении с течением времени могут возникнуть проблемы с памятью, отсюда проблемы с производительностью. Там еще много чего плохого от забытых в памяти слушателей может случиться - Мук это все хорошо описывает в своей книге.
__________________
скриптограф |
|
|||||
|
Регистрация: Apr 2010
Сообщений: 14
|
Спасибо, всё очень доходчиво. Мук в процессе.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 18:14. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|