PDA

Просмотр полной версии : Удаление экземпляра класса.


artur1995g
07.10.2010, 01:06
Здравствуйте)

У меня такая проблема: у меня есть класс Main

Main :package {
import flash.display.*;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.text.*;
import flash.events.MouseEvent;
public class Main extends Sprite {
public var shar:Bubble;
public var i:int;
public var t:TextField = new TextField();

public function Main() {
var timer:Timer = new Timer(1000, 0);
timer.addEventListener(TimerEvent.TIMER, newbubble);
timer.start();

}
function newbubble(e:TimerEvent):void {
shar=new Bubble();
shar.x=0;
shar.y=Math.random()*440;
addChild(shar);
this.addEventListener (MouseEvent.CLICK, remove);
this.addChild(t);
}







function remove(e:MouseEvent):void {
this.removeChild(shar);
i+=1;
trace(i);
if (i<10) {
t.text=String(i);
}
else {
t.text="УРАААА!!!!11";
}
}





}
}


и класс Bubble: package {
import flash.display.*;
import flash.events.*;
import flash.text.*;
public class Bubble extends MovieClip {
var speed=Math.random()*20;
public function Bubble() {
this.addEventListener(Event.ENTER_FRAME, handler_enterFrame);
}
function handler_enterFrame(e:Event):void {
this.x+=speed;
}

}
}.

Вообщем. У меня каждую секунду генерируются шары и летят с разной скоростью. При клике на них они должны удаляться. Но есть глюк. При нажатии на некоторые шары, удаляются совсем другие шары, но не тот, на который я жму. В чем дело?!

TanaTiX
07.10.2010, 01:16
Наверное так
removeChild(e.currentTarget);

dimarik
07.10.2010, 01:37
Угу. По правилам хорошего тона

function remove(event:MouseEvent):void {
if (
event.target is Bubble
&& event.target.parent === this
) {
super.removeChild(event.target);
}
}

А то при клике можно попасть на дитя, которое совсем не шарик. Или шарик, но не наш. )


А в классе Bubble нужно предусмотреть отписку от Event.ENTER_FRAME при удалении bubble со Stage. И я вообще вижу сомнительным перенос родительской бизнес-логики в детей. Лучше укажите явно, что дите работает под руководством родителя. Поставьте ему какую-нибудь GoF-Strategy, можно даже с обратной связью. А сейчас получается, что дите бегает само по себе. Но, если так и задумано, то нет вопросов.

Hidest
07.10.2010, 18:33
Вам уже все объяснили, добавлю лишь то, что вы создаете каждый раз шар, переписывая поле класса (то, которое public var shar:Bubble; ). А потом его и удаляете, но там находится ссылка уже совсем на другой шар.

artur1995g
08.10.2010, 00:28
Я вас не совсем понял.

Что значит event.target и почему у меня вылезает ошибка, когда я так пишу?

1120: Access of undefined property event.

andrew911
08.10.2010, 00:53
artur1995g
Потому, что надо немного думать при копипасте

event.target это если function remove(event:MouseEvent)
у вас же function remove(e:MouseEvent)

значит для вашего случая не event.target, а e.target

artur1995g
09.10.2010, 09:42
Он не работает, я проверял)

Не буду же я вслепую копировать)