![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 141
|
Собственно заголовком все сказано, исходник ниже. Из вне создается несколько таких объектов. Я не могу догнать вобще как такое случилось, что после removeEventListener у меня продолжается вызываться обработчик.
обратите внимание на блок с trace("before", death.id) по trace("after", death.id); package *** { *** import flash.display.Bitmap; import flash.events.Event; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; public class DeathImage extends SpriteControl { private static const CLOSE_DEATH_BACKGROUND_IMAGE:String = "images/ui/death/closeDeath.png"; private static const BRONZE_DEATH_BORDER_IMAGE:String = "images/ui/death/bronzeDeathBorder.png"; private static const SILVER_DEATH_BORDER_IMAGE:String = "images/ui/death/silverDeathBorder.png"; private static const GOLD_DEATH_BORDER_IMAGE:String = "images/ui/death/goldDeathBorder.png"; private static const BRONZE_DEATH_NUMBER_BACKGROUND_IMAGE:String = "images/ui/death/bronzeDeathNumberBackground.png"; private static const SILVER_DEATH_NUMBER_BACKGROUND_IMAGE:String = "images/ui/death/silverDeathNumberBackground.png"; private static const GOLD_DEATH_NUMBER_BACKGROUND_IMAGE:String = "images/ui/death/goldDeathNumberBackground.png"; private var __width:int = 157; private var __height:int = 150; private var __death:Death; private var __isLoaded:Boolean = false; public function DeathImage(controls:Controls) { super(controls); this.addEventListener(Event.ADDED_TO_STAGE, __addedToStage); } override public function set width(value:Number):void { __width = value; super.width = width; } override public function get width():Number { return __width; } override public function set height(value:Number):void { __height = value; super.height = height; } override public function get height():Number { return __height; } public function set death(value:Death):void { __death = value; } public function get death():Death { return __death; } private function __addedToStage(e:Event):void { this.removeEventListener(Event.ADDED_TO_STAGE, __addedToStage); if (!__death) return; var images:Array = []; switch (death.conquestLevel) { case 0: images.push(CLOSE_DEATH_BACKGROUND_IMAGE); break; case 1: images.push(BRONZE_DEATH_BORDER_IMAGE, BRONZE_DEATH_NUMBER_BACKGROUND_IMAGE); break; case 2: images.push(SILVER_DEATH_BORDER_IMAGE, SILVER_DEATH_NUMBER_BACKGROUND_IMAGE); break; case 3: images.push(GOLD_DEATH_BORDER_IMAGE, GOLD_DEATH_NUMBER_BACKGROUND_IMAGE); break; } if (death.conquestLevel > 0) images.push(death.url); trace("before", death.id) controls.images.addEventListener(ImagesEvent.IMAGES_LOAD_COMPLETE, __imagesLoadComplete); controls.images.loadImages(images); } private function __imagesLoadComplete(e:ImagesEvent):void { /*if (__isLoaded) return;*/ __isLoaded = true; controls.images.removeEventListener(ImagesEvent.IMAGES_LOAD_COMPLETE, __imagesLoadComplete); trace("after", death.id); var deathImage:Bitmap; var borderImage:Bitmap; var titleImage:Bitmap; switch (death.conquestLevel) { case 0: var closeDeath:Bitmap = controls.images.getLoadedImage(CLOSE_DEATH_BACKGROUND_IMAGE); this.addChild(closeDeath); break; case 1: borderImage = controls.images.getLoadedImage(BRONZE_DEATH_BORDER_IMAGE); titleImage = controls.images.getLoadedImage(BRONZE_DEATH_NUMBER_BACKGROUND_IMAGE); break; case 2: borderImage = controls.images.getLoadedImage(SILVER_DEATH_BORDER_IMAGE); titleImage = controls.images.getLoadedImage(SILVER_DEATH_NUMBER_BACKGROUND_IMAGE); break; case 3: borderImage = controls.images.getLoadedImage(GOLD_DEATH_BORDER_IMAGE); titleImage = controls.images.getLoadedImage(GOLD_DEATH_NUMBER_BACKGROUND_IMAGE); break; } if (death.conquestLevel > 0) { deathImage = controls.images.getLoadedImage(death.url); deathImage.smoothing = true; var imageSize:int = width - 30; var koef:Number = deathImage.width / imageSize; deathImage.scaleX /= koef; deathImage.scaleY /= koef; deathImage.x = width / 2 - deathImage.width / 2; deathImage.y = height / 2 - deathImage.height / 2; this.addChild(deathImage); if (borderImage) this.addChild(borderImage); if (titleImage) { titleImage.x = width / 2 - titleImage.width / 2; titleImage.y = 10; this.addChild(titleImage); var textField:TextField = TextFormats.defaultTextField; textField.defaultTextFormat = new TextFormat(TextFormats.EMBED_FONT, 12); textField.text = death.id.toString(); textField.autoSize = TextFieldAutoSize.LEFT; textField.x = width / 2 - textField.width / 2 - 1; textField.y = 11; this.addChild(textField); } } } } } before 10 before 13 before 99 before 2 before 51 before 127 before 126 before 128 after 10 after 13 after 99 after 2 after 51 after 127 after 126 after 128 after 128 after 126 after 128 after 127 after 126 after 128 after 51 after 127 after 126 after 128 after 2 after 51 after 127 after 126 after 128 after 99 after 2 after 51 after 127 after 126 after 128 after 13 after 99 after 2 after 51 after 127 after 126 after 128 Дабы хоть как-то решить вопрос пришлось сделать проверку на то, произошла ли уже загрузка в объекте или нет. Где я накосячил никак не могу понять ![]() |
|
|||||
|
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
Видимо проблема в том что сам объект типа DeathImage несколько раз добавляется на сцену, или добавляется несколько объектов типа DeathImage подряд, и при каждом
несколько раз диспатчится ваш ImagesEvent, судя по тому что трэйсов 'after' больше чем 'before'.
Короче по ходу не в этом классе проблема, а в том что добавляет этот самый DeathImages на сцену. |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 141
|
Да, таких объектов добавляется подряд несколько, и каждый объект подписывается на данное событие и при получении события отписывается.
В итоге что получается, после того как первый объект от события отписался, второй следом подписался, предыдущий тоже оказывается подписанным? Я что-то запутался, видимо пора спать. |
|
|||||
|
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
Для каждого объекта в отдельности, при его добавлении на сцену будет срабатывать его же __addedToStage.
|
|
|||||
|
Регистрация: Feb 2009
Сообщений: 141
|
Ну, да, а при чем здесь __addedToStage?
|
|
|||||
|
Сделайте вот так при добавлении слушателя:
controls.images.removeEventListener(ImagesEvent.IMAGES_LOAD_COMPLETE, __imagesLoadComplete); controls.images.addEventListener(ImagesEvent.IMAGES_LOAD_COMPLETE, __imagesLoadComplete); чтобы точно больше одного слушателя не добавлялось, и проверьте |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 141
|
Добавление нескольких прослушивателей с одиниковым типом, обработчиком и целевой фазой не приводят к дополнительной регистрации прослушивателя, поэтому это не имеет смысла вовсе.
|
|
|||||
|
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
Либо в __imagesLoadComplete ссылка на controls.images это уже ссылка на другой объект и вы не того отписываете, либо вы его опять где-то подписываете на это событие.
В любом случае из этого куска кода не понять. |
|
|||||
|
Регистрация: Feb 2009
Сообщений: 141
|
Да, я опять подписываюсь на событие, но подписывается другой экземпляр класса DeathImage. Этот-то по идее должен быть отписанным.
Вобщем пришлось решать проблему тем, чтобы каждый экземпляр класса юзал отдельный controls.images, а не один и тот же. Ибо получается, что подпись на событие экземпляра controls.images подписывает также все другие экземпляры DeathImage, которые уже отписались от него. Честно говоря для меня это поведение неожиданность. Я считал что подпись осуществляется в пределах экземпляра класса, к которому принадлежит обработчик. Неужели это не так? Последний раз редактировалось Vreden; 05.03.2013 в 21:02. |
|
|||||
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 22:15. |
|
|
« Предыдущая тема | Следующая тема » |
|
|