|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Удалить "себя" через некоторое время.
У меня есть такой код с парой классов. Появляются спрайты, а потом исчезают. У меня ничего не лагает, но если посмотреть количество "детей" у "RandCircle", то их становится все больше и больше. Удалять изнутри класса Circle у меня не получается. Что посоветуете?
RandCircle.as Основной класс. package{ import flash.utils.Timer; import flash.events.TimerEvent; import flash.display.Sprite; public class RandCircle extends Sprite{ private var timer:Timer=new Timer(100); private var circle:Circle; public function RandCircle(){ timer.addEventListener(TimerEvent.TIMER,onTimer); timer.start(); } private function onTimer(e:TimerEvent):void{ circle=new Circle; addChild(circle); } } } package{ import flash.display.Sprite; import flash.utils.Timer; import flash.events.TimerEvent; public class Circle extends Sprite{ private var timer:Timer=new Timer(150); private var randX:Number=Math.random()*550; private var randY:Number=Math.random()*400; private var randR:Number=Math.random()*75+20; public function Circle(){ drawThis(); timer.addEventListener(TimerEvent.TIMER,onTimer); timer.start(); } private function drawThis():void{ graphics.lineStyle(1,0x000000,1); graphics.beginFill(0xFFCC99,1); graphics.drawCircle(randX,randY,randR); } private function onTimer(e:TimerEvent):void{ if(this.alpha>=0.1){ this.alpha-=0.1; }else{ removeChild(this); } } } } Так же хотел для производительности сделать класс Circle наследуемым от Shape, но у Shape вообще нет removeChild(); Как удалять объект Circle, после того, как его непрозрачность стала меньше или равна 0.1. Добавлено через 1 минуту update: Попробовал с помощью TIMER_COMPLETE, но проблема остается в том же... Так же не смог сделать с помощью dispatchEvent... |
|
|||||
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Circle/onTimer() at flash.utils::Timer/_timerDispatch() at flash.utils::Timer/tick() И начало сильно лагать. |
|
|||||
А вообще, нужно переделать структуру этого блока:
родитель создает экземпляры детей, подписывая их на кастомное событие removeMe. Ребенок, в нужный момент диспатчит событие removeMe, родитель слушает и удаляет его из себя (и из массива, если ребенки помещались в массив).
__________________
тут я |
|
|||||
Самое интересное, что если просто оставить код таким:
package{ import flash.display.Sprite; import flash.utils.Timer; import flash.events.TimerEvent; public class Circle extends Sprite{ private var timer:Timer=new Timer(150,0); private var randX:Number=Math.random()*550; private var randY:Number=Math.random()*400; private var randR:Number=Math.random()*75+20; public function Circle(){ drawThis(); timer.addEventListener(TimerEvent.TIMER,onTimer); timer.start(); } private function drawThis():void{ graphics.lineStyle(1,0x000000,1); graphics.beginFill(0xFFCC99,1); graphics.drawCircle(randX,randY,randR); } private function onTimer(e:TimerEvent):void{ this.alpha-=0.1; } } } |
|
|||||
Так не работает, где ошибка..?
package{ import flash.utils.Timer; import flash.events.TimerEvent; import flash.display.Sprite; public class RandCircle extends Sprite{ private var timer:Timer=new Timer(100); private var circle:Circle; public function RandCircle(){ timer.addEventListener(TimerEvent.TIMER,onTimer); circle.addEventListener(REMOVE_ME,onRemoveChild); timer.start(); } private function onTimer(e:TimerEvent):void{ circle=new Circle; addChild(circle); trace(this.numChildren); } private function onRemoveChild(e:REMOVE_ME):void{ removeChild(Circle(e.target)); } } } package{ import flash.display.Sprite; import flash.utils.Timer; import flash.events.TimerEvent; public class Circle extends Sprite{ const REMOVE_ME="REMOVE_ME"; private var timer:Timer=new Timer(150,0); private var randX:Number=Math.random()*550; private var randY:Number=Math.random()*400; private var randR:Number=Math.random()*75+20; public function Circle(){ drawThis(); timer.addEventListener(TimerEvent.TIMER,onTimer); timer.start(); } private function drawThis():void{ graphics.lineStyle(1,0x000000,1); graphics.beginFill(0xFFCC99,1); graphics.drawCircle(randX,randY,randR); } private function onTimer(e:TimerEvent):void{ this.alpha -= 0.1; if (this.alpha < 0.1) removeChild(this); } } } |
|
|||||
Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
|
|
|
|||||
Я еще не учился использовать свои события, знаю о них мало. Как надо написать?
|
|
|||||
package{ import flash.utils.Timer; import flash.events.TimerEvent; import flash.display.Sprite; public class RandCircle extends Sprite{ private var timer:Timer=new Timer(100); public function RandCircle(){ timer.addEventListener(TimerEvent.TIMER, onTimer); timer.start(); } private function onTimer(e:TimerEvent):void{ var circle:Circle = new Circle(); circle.addEventListener(MyEvent.REMOVE_ME, onRemoveChild); addChild(circle); trace(this.numChildren); } private function onRemoveChild(e:MyEvent):void { var circle:Circle = e.target as Circle; circle.removeEventListener(MyEvent.REMOVE_ME, onRemoveChild); removeChild(circle); } } }
__________________
тут я |
Часовой пояс GMT +4, время: 18:13. |
|
« Предыдущая тема | Следующая тема » |
Теги |
circle , timer , Таймер , Шар |
|
|