|
Beiträge: 16 Registriert: Jan 2010
| 27.10.2010, 12:41
Hi.
In einer Klasse packe ich einen MC auf die Bühne, mit:
ActionScript:1 2 | var rocket:MovieClip = new Rocket(x_speed, y_speed);
this.stage.addChild(rocket);
|
Von der Rocket-Klasse aus möchte ich den irgendwann wieder entfernen. Also habe ich da stehen:
ActionScript:1 2 3 | if(this.y > this.stage.stageHeight) {
removeChild(getChildByName(this.name));
}
|
Funktioniert aber nicht. Flash behauptet, ich würde da NULL übergeben.
TypeError: Error #2007: Parameter child darf nicht 'null' sein. at flash.display::DisplayObjectContainer/removeChild()
Ich verstehe nicht wie der darauf kommt. Wenn ich mir z.B. getChildByName(this.name) per trace() ausgeben lassen, steht da: [object Rocket]. Wieso sagt er mir im trace() da wäre ein Objekt, aber wenn ich es dann entfernen will soll da dann doch nichts sein?
Habe es auch einfach mit removeChild(this) probiert. Da bekomme ich dann als Antwort:
ArgumentError: Error #2025: Das angegebene DisplayObject muss ein untergeordnetes Element des Aufrufers sein. at flash.display::DisplayObjectContainer/removeChild()
Jedenfalls dachte ich mir dann "na ja, dann halt anders" und habe es hiermit probiert:
this.parent.removeChild(this);
Klappt auch nicht. Dann erhalte ich einen:
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.
Sorry für die doofen Fragen, würde mich über Hilfe freuen. |
Geändert von Orya am 27.10.10 um 12:45 Uhr | |
|
|
Beiträge: 75 Registriert: May 2005
| 27.10.2010, 12:46
geht da nicht
ActionScript:1 2 3 | if(this.y > this.stage.stageHeight) {
removeChild(this);
}
|
? |
|
|
Beiträge: 16 Registriert: Jan 2010
Themenautor/in
| 27.10.2010, 12:47
Probiert. Dann bekomme ich einen:
ArgumentError: Error #2025: Das angegebene DisplayObject muss ein untergeordnetes Element des Aufrufers sein. at flash.display::DisplayObjectContainer/removeChild()
this.parent.removeChild(this) funktioniert auch nicht. Da gibt es dann einen TypeError: Error #1009 |
Geändert von Orya am 27.10.10 um 12:48 Uhr | |
|
|
Beiträge: 75 Registriert: May 2005
| 27.10.2010, 12:54
ActionScript:1 2 3 | if(this.y > this.stage.stageHeight) {
this.parent.removeChild(this.parent.getChildByName(this.name));
}
|
kann aber sein das flash da auch wieder motzt, weil es untergeordnet sein muss.. ^^ |
Geändert von Nova969 am 27.10.10 um 12:57 Uhr | |
|
|
Beiträge: 16 Registriert: Jan 2010
Themenautor/in
| 27.10.2010, 13:03
Ach, ich glaub ich weiß woran es liegt. Die Y-Position wird ja mit jedem Frame geprüft. Der MC wird dann korrekt entfernt, und ist dann auch nicht mehr auf der Bühne. Der Code läuft aber trotzdem weiter, und versucht weiterhin das Objekt zu entfernen, das nicht mehr da ist (deswegen jammert er über NULL).
Nun muss ich nur noch herausfinden, wie ich nicht nur den MC von der Bühne entferne, sondern auch den dazugehören Code. Ich könnte natürlich abfragen, ob der MC auf der Bühne ist, und ihn dann entfernen. Aber dann würde der Code ja ewig weiterlaufen, was dann doch eine Resourcenverschwendung ist.
Danke schonmal. :) |
|
|
Beiträge: 75 Registriert: May 2005
| 27.10.2010, 13:06
achso ^^
ich hab gedacht das das script in dem mc drin ist, weil das wird dann auch entfernt wenn der mc entfernt wird in dem sich das script befindet..
Du kannst aber dann auch eine try abfrage machen..
ActionScript:1 2 3 4 5 | if(this.y > this.stage.stageHeight) {
try{
this.parent.removeChild(this.parent.getChildByName(this.name));
}catch(e:Error){trace("kleine Error Msg ;)")}
}
|
|
|
|
Beiträge: 16 Registriert: Jan 2010
Themenautor/in
| 27.10.2010, 13:12
An und für sich ist das Skript ja auch in dem MC drin. Also ich habe in dem seinen Eigenschaften die passende Klasse eingebaut. Aber mit removeChild verschwindet ja, wenn ich das richtig weiß, der MC nur von der Bühne, aber er existiert weiterhin.
Ja, mit try catch würde das wohl auch gehen, aber dann hätte ich ja nach einiger Zeit Unmengen an Funktionen und Krimskrams laufen die ich nimmer brauch. Da versuche ich mir lieber eine Funktion zu basteln, die alles entfernt was mit dem MC zu tun hatte. |
|
|
Beiträge: 75 Registriert: May 2005
| 27.10.2010, 13:15
Mh nagut, das kann man natürlich auch machen ;P
evtl hiermit:
ActionScript:1 2 3 4 5 6 7 8 | if(this.y > this.stage.stageHeight) {
try{
this.parent.removeChild(this.parent.getChildByName(this.name));
removeEventListener(Event.ENTER_FRAME,deinListener)
}catch(e:Error){trace("kleine Error Msg ;)")}
}
|
|
|
|
Beiträge: 16 Registriert: Jan 2010
Themenautor/in
| 27.10.2010, 13:26
Hmmm, aber dann ist der Code für den MC ja immer noch da, obwohl ich ihn nimmer brauche.
Hatte hier folgendes gelesen:
parent.removeChild(this);
However, that will not remove the instance from memory, only the display list so it is not seen by the user. If you need the movie clip to be removed from memory, you will need to make sure there are no variables left that reference that movie clip. For class properties, null is used; for dynamic properties, delete.
Mal schauen wie ich das konkret umsetze. Warscheinlich einfach wie vorgeschlagen den EventListener und vielleicht einige Variablen löschen. |
Geändert von Orya am 27.10.10 um 13:30 Uhr | |
|