Zurück   Flashforum > Flash > Flash Einsteiger

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-01-2012, 16:10   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 8
komplette Bühne leeren

hallo zusammen,
habe mal eine grundlegende Frage:
gibt es in AS3 einen Befehl, der meine komplette Bühne leert? also alles was im bisherigen Verlauf auf die Bühne platziert worden ist entfernt?
Habe einen Button und bei einem Klick möchte ich eine neue Ansicht erstellen; d.h. alles was bisher auf der Bühne ist und durch verschiedenen Klassen erstellt worden ist soll entfernt werden, und ich kann durch die Funktion bei meinem Klick die Bühne wieder mit neuen sachen füllen.
Danke schon mal für antworten!
grüße
student1 ist offline   Mit Zitat antworten
Alt 08-01-2012, 17:22   #2 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.164
Natürlich kann man alle Anzeigeelemente innerhalb eines beliebigen DisplayObjectContainers (also auch der stage) entfernen:
ActionScript:
  1. while(numChildren) removeChildAt(0);
Besser wäre es natürlich, garnicht erst so ein Chaos anzurichten, das man mit dieser Holzhammermethode aufräumen müsste:
  • Grundsätzlich gehört nur ein einziges Anzeigeobjekt direkt auf die stage, nämlich root (und das legt der FlashPlayer persönlich dorthin).

  • Alle anderen Anzeigeobjekte sollten Kinderelemente irgendwelcher Sprites oder MovieClips sein, die unterhalb von root liegen.

  • Dabei kapselt man sinnvollerweise zusammenhörende Anzeigeobjekte in gemeinsamen DisplayObjectContainer, mit dem man sie dann alle auf einen Rutsch entfernen kann.

  • Allerdings ist es damit noch nicht getan:
    Damit einem nicht irgendwann der Speicher volläuft und die Objekte von der GarbageCollection eingesammelt werden können, sollte man zusätzlich noch alle Referenzen (Variablen, Arrays) auf die gelöschten Anzeigeobjekte löschen. Da auch Event-Listener solche Referenzen darstellen, sollten auch diese entfernt werden (am einfachsten bei Event.REMOVED_FROM_STAGE).
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 08-01-2012, 17:30   #3 (permalink)
Keine Panik
 
Registriert seit: Apr 2010
Ort: Düsseldorf (im ernst)
Beiträge: 1.868
PHP-Code:
while(numChildrenremoveChildAt(0); 
aber damit sind die Objekte nur aus den Augen, nicht aus dem Sinn.

wenn sie noch Event-Listener haben, oder Verweise auf die Objekte bestehen bleiben die weiter im Speicher erhalten.

am besten du fügst den Objekten eine dispose-Funktion zu, die sich um das aufräumen kümmert. um am Beispiel deiner ViewStart-Klasse zu bleiben, die du im anderen Thread gezeigt hast:
PHP-Code:
public function dispose():void
{
    if(
d_auged_auge.dispose();
    if(
c_augec_auge.dispose();
    if(
parentparent.removeChild(this);

hier geh ich davon aus, dass die beiden Objekte ebenfalls eine dispose-Methode besitzen.
__________________
greetz Thomas

plz RTFM & Coding Conventions
thomas_E ist offline   Mit Zitat antworten
Alt 08-01-2012, 18:10   #4 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 8
danke nochmal für eure Antworten!
dafür bekommt ihr auch den Link für das Spiel wenn es fertig ist

@thomas: hab auch gar kein so großes Chaos, mich vielleicht nur etwas unverständlich ausgedrückt. in meiner Main lege ich auch nur ein Objekt (m_ViewStart) auf die stage. "m_ViewStart" greift auf die "startansicht" aus der Klasse ViewStart zu, wo Objekte aus unterschiedlichen Klassen erstellt werden.
hier mein Code:
Zitat:
public function Main() {
m_ViewStart.startansicht();
addChild(m_ViewStart);
}
jetzt möchte ich eben diese startansicht von meiner stage entfernen, und z.b. die ansicht für das erste Level anzeigen wenn ich auf nen Button klicke.

wenn ich das jetzt richtig verstanden habe, müsste ich doch "nur" eine function in der Main schreiben die m_ViewStart aus dem display nimmt und auch löscht (geht das auch mit "=null"?).
z.b.
Zitat:
public function remove() {
removeChild(m_ViewStart);
m_ViewStart = null;
}
das müsste ich ja aber dann in der Main machen, oder? aber kann von anderen Klassen nicht auf die Main (default package) zugreifen.

das mit der dispose-Methode habe ich noch nicht ganz verstanden...werde mich aber diesbezüglich mal schlau machen

hoffe meine Fragen sind nicht allzu doof...
student1 ist offline   Mit Zitat antworten
Alt 08-01-2012, 18:35   #5 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.164
Zitat:
Zitat von student1 Beitrag anzeigen
wenn ich das jetzt richtig verstanden habe, müsste ich doch "nur" eine function in der Main schreiben die m_ViewStart aus dem display nimmt und auch löscht (geht das auch mit "=null"?).
Ja.

Zitat:
Zitat von student1 Beitrag anzeigen
das müsste ich ja aber dann in der Main machen, oder? aber kann von anderen Klassen nicht auf die Main (default package) zugreifen.
Von wo aus willst Du denn m_ViewStart entfernen?
»Von egal wo« ist keine zulässige Antwort
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 08-01-2012, 20:23   #6 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 8
hatte gerade noch eine andere Idee, was aber mein problem nicht löst. habe eine neue Klasse LogicView erstellt, die meine ganzen Menüansichten verwalten soll. also konkret bei mir jetzt ob es meine Startansicht oder Infoansicht anzeigen soll. von der Main aus will ich nur die LogicView ansprechen, die dann die entsprechenden Sachen an die Main weitergibt.
hier meine Main:
ActionScript:
  1. package {
  2.    
  3.     import flash.display.Sprite;
  4.     import logic.LogicView;
  5.    
  6.     public class Main extends Sprite {
  7.        
  8.         public var m_LogicView:LogicView = new LogicView();
  9.        
  10.         public function Main() {
  11.             addChild(m_LogicView);
  12.         }
  13.     }
  14. }
und meine LogicView:
ActionScript:
  1. package logic {
  2.    
  3.     import view.ViewStart;
  4.     import view.ViewInfo;
  5.     import flash.display.Sprite;
  6.    
  7.     public class LogicView extends Sprite {
  8.        
  9.         public var m_ViewStart:ViewStart = new ViewStart();
  10.         public var m_ViewInfo:ViewInfo = new ViewInfo();
  11.        
  12.         public function LogicView() {
  13.             showViewStart();
  14.         }
  15.        
  16.         public function showViewStart() {
  17.             addChild(m_ViewStart);
  18.         }
  19.        
  20.         public function changeStartToInfo() {
  21.             removeChild(m_ViewStart);
  22.             addChild(m_ViewInfo);
  23.         }
  24.    
  25.     }
  26.  
  27. }
bekomme jetzt einen Error: Error #1023: Stapelüberlauf. sobald ich das ganze teste.

...glaube habe jetzt mein Problem verstanden, weiß aber keine Lösung dafür. ich versuch es mal zu erklären:
in meiner ViewStart erstelle ich in anderen Klassen Sprites und Buttons die dann jeweils mit addChild() wieder an die ViewStart gegeben werden und somit angezeigt werden. einer der Buttons ist auch der "Info-Button", mit dem ich in die ViewInfo gelangen sollte. wenn ich jetzt in der Klasse, in der sich der Info-Button befindet, die function changeStartToView aufrufe, gibt es den darin enthaltenen Code durch addChild() an die Klasse weiter in der der Info-Button drin ist.
hätte jetzt gerne, dass ich aus den jeweiligen Klassen in denen meinen Buttons sind, der LogicView sagen kann, welche Views an die Main weitergegeben werden bzw. entfernt werden.
(glaube auch, das die Lösung mit dem Aufruf des Konstruktors der LogicView in der Main und der darin enthaltene Aufruf der Methode showViewStart() nicht optimal ist; weiß aber hier nicht mehr weiter.)

das war jetzt zwar etwas ausführlich, aber hoffe ich hab dadurch jetzt mein problem genau beschrieben und mir kann jemand weiterhelfen

Geändert von Martin Kraft (09-01-2012 um 11:07 Uhr) Grund: Code formatiert
student1 ist offline   Mit Zitat antworten
Alt 08-01-2012, 22:27   #7 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.164
  • Was meinst Du mit »mit addChild() irgendwas an irgendwas weitergebengegeben« addChild gibt nichts weiter, sondern fügt nur in dem DiplayObjectContainer DisplayObjects zur Anzeigeliste hinzu, in dem die Funktion aufgerufen wird.

  • Wie sehen ViewStart und ViewInfo aus?
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!
Martin Kraft ist offline   Mit Zitat antworten
Alt 09-01-2012, 10:52   #8 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 8
ViewStart:
ActionScript:
  1. package view {
  2.     import flash.display.Sprite;
  3.     import data.DataElemente;
  4.     import data.DataAuge;
  5.     import data.DataButton;
  6.    
  7.     public class ViewStart extends Sprite {
  8.        
  9.         public var element1:DataElemente = new DataElemente();
  10.         public var element2:DataAuge = new DataAuge();
  11.         public var d_button:DataButton = new DataButton();
  12.        
  13.         public function ViewStart() {
  14.             element1.addrepository();
  15.             addChild(element1);
  16.             element1.adds_therepository();
  17.             addChild(element1);
  18.             element2.addauge();
  19.             addChild(element2);
  20.             d_button.addbuttoninfo();
  21.             addChild(d_button);
  22.         }
  23.     }
  24. }
ViewInfo:
ActionScript:
  1. package view {
  2.    
  3.     import data.DataElemente;
  4.     import flash.display.Sprite;
  5.     import data.DataButton;
  6.    
  7.     public class ViewInfo extends Sprite {
  8.        
  9.         public var element:DataElemente = new DataElemente();
  10.         public var d_button:DataButton = new DataButton();
  11.        
  12.         public function ViewInfo() {
  13.             element.adds_infoszumspiel();
  14.             addChild(element);
  15.             d_button.addbuttonstart();
  16.             addChild(d_button);
  17.         }
  18.     }
  19. }
in der Klasse, in der ich meinen InfoButton erstelle rufe ich folgenden Konstrukter der Klasse ControllerButton auf und möchte dadurch dann in der LogicView meine Ansicht "wechseln".
ActionScript:
  1. package controller {
  2.     import flash.display.DisplayObject;
  3.     import flash.events.*;
  4.     import logic.LogicView;
  5.    
  6.     public class ControllerButtonInfo {
  7.        
  8.         private var buttonclick:DisplayObject;
  9.         public var l_button:LogicView = new LogicView();
  10.        
  11.         public function ControllerButtonInfo(objekt:DisplayObject) {
  12.             buttonclick = objekt;
  13.             buttonclick.addEventListener(MouseEvent.CLICK, clicked);
  14.         }
  15.        
  16.         public function clicked(e:Event):void {
  17.             l_button.changeStartToInfo();
  18.         }
  19.     }
  20. }

Geändert von Martin Kraft (09-01-2012 um 11:04 Uhr)
student1 ist offline   Mit Zitat antworten
Alt 09-01-2012, 11:20   #9 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.164
Dir ist hoffentlich bewusst, dass jedes mal wenn Du new LogicView() ausführst, eine neue unabhängige Instanz erzeugt wird?! m_LogicView in Main zeigt also auf ein ganz anderes Objekt als l_button in ControllerButtonInfo.

Und das ist auch der Grund für diese Endlosscheife:
Soweit ich das überblicke (was bei der Struktur ewcht nicht leicht ist), erzeugst Du in LogicView über zig andere Instanzen eine Instanz von ControllerButtonInfo, die wiederum eine Instanz von LogicView erzeugt, womit das ganze wieder von vorne anfängt...

Diese Konstruktionen find ich überigens (unnötig) verwirrend:
Zitat:
Zitat von student1 Beitrag anzeigen
ViewStart:
ActionScript:
  1. element1.addrepository();
  2. addChild(element1);
  3. element1.adds_therepository();
  4. addChild(element1);
  5. element2.addauge();
  6. addChild(element2);
  7. d_button.addbuttoninfo();
  8. addChild(d_button);
  • Wieso rufst Du die Funktionen, die Du hier im übergeordneten Objekt direkt nach der Instanzierung aufrufst, nicht einfach im Konstruktor der jeweiligen Klasse auf?
  • Wieso legst Du element1 zweimal hintereinander in die Anzeigeliste?
  • Das Wörtchen »Data« kling für mich im Übrigen nach etwas, was nicht vom View instanziiert werden sollte...

P.S.: Bitte markier Deinen Code hier im Forum als [AS] oder [PHP] (so wie ich es jetzt für Dich getan habe) und nicht als [QUOTE], dann kann man ihn deutlich besser lesen!
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (09-01-2012 um 11:29 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 09-01-2012, 12:15   #10 (permalink)
Neuer User
 
Registriert seit: Jan 2012
Beiträge: 8
Zitat:
Dir ist hoffentlich bewusst, dass jedes mal wenn Du new LogicView() ausführst, eine neue unabhängige Instanz erzeugt wird?! m_LogicView in Main zeigt also auf ein ganz anderes Objekt als l_button in ControllerButtonInfo.
ja, das hab ich mittlerweile verstanden dass das mein problem ist, und ich mit l_button das nicht in der LogicView() ändern kann. und das ich mit ControllerButtonInfo eine neue Instanz von LogicView erstelle klingt auch logisch.
aber wie komme ich aus dieser Endlosschleife raus?
mein spiel ist ja nicht das erste bei dem man mit einem ButtonClick auf eine neue Ansicht kommt. wie wird das denn "normal" gelöst?

meine Idee von der unnötig verwirrenden Konstruktion war:
ich hab eine klasse DataElement in der all meine Sprites, die ich während des spiels habe, angelegt werden und eine Klasse DataButton in der alle meine Buttons sind. in der jeweilig View rufe ich dann diejenigen die ich gerade brauche durch
ActionScript:
  1. element1.addrepository();
  2. addChild(element1);
auf. (element2 ist eine ausnahme in der ViewStart, weil es in DataAuge erstellt wird und noch andere Funktionen beinhaltet wie der Rest in DataElemente)
habe die elemente bis jetzt ja nur zu Test zwecken in der ViewStart bzw. ViewInfo. würde also noch öfter element1 in die Anzeigeliste legen, da noch mehr Sprites aus der DataElemente angezeigt werden sollen. (bin ziemlicher Anfänger und weiß grad auch nicht ob meine Idee/ der Sinn von dieser Konstruktion gut oder schlecht ist.)

Aber mein Problem ist ja jetzt diese blöde Endlosschleife...und hab echt keine Ahnung wie ich da rauskomme. wäre super wenn Du dazu noch nen Tipp hättest. gerne auch allgemein erkärt wie man sowas löst und nicht auf meinen Code bezogen. Wie gesagt, es ist ja bestimmt nicht das erste mal dass man durch einen Click auf eine andere Ansicht wechselt...
student1 ist offline   Mit Zitat antworten
Alt 09-01-2012, 12:48   #11 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.164
Zitat:
Zitat von student1 Beitrag anzeigen
aber wie komme ich aus dieser Endlosschleife raus?
Indem Du nicht neue Instanzen erzeugst, wenn Du auf bestehende zugreifen willst.
Und indem Du darauf verzichtest Klassen zu instanziieren, die dann automatisch (direkt oder indirekt) wieder die Klasse instanziieren, von der sie selbst instanziiert wurden.
Zitat:
Zitat von student1 Beitrag anzeigen
mein spiel ist ja nicht das erste bei dem man mit einem ButtonClick auf eine neue Ansicht kommt. wie wird das denn "normal" gelöst?
Der Button im View sollte nur ein Event auslösen, der Controller dieses Event abfangen und dann die entsprechenden Aktionen ausführen (z.B. das wechslen der Ansicht).

Der Controller sollte also (wie der Name schon sagt) die Views kontrollieren und nicht umgekehrt!

Zitat:
Zitat von student1 Beitrag anzeigen
ich hab eine klasse DataElement in der all meine Sprites, die ich während des spiels habe, angelegt werden und eine Klasse DataButton in der alle meine Buttons sind.
Wenn Du mit »angelegt« »instanziiert« meinst, ist das keine gute Idee. Klassen sollten erst dann instanziiert werden, wenn man diese Instanzen auch benötigt!

Generell finde ich Deine Struktur so verschachtelt, dass man bereits jetzt kaum durchblickt. Wenn man ständig in neue Klassen springen muss, um zu verstehen, was da eigentlich vor sich geht, ist das ein Zeichen dafür, dass es entschieden zu viele Abhängigkeiten gibt.

In der OOP sollte sich schließlich jede Klasse erstmal möglichst autark um ihren ****** kümmern und möglichst wenig von anderen abhängig sein.
__________________
Viele Grüße // Martin

Martin Kraft // Interaktionsdesign

Hilfreiche Websites:
// Hilfe zur Adobe Flash Plattform
// ActionScript 2 Referenz
// ActionScript 3 Referenz
// ActionScript 3 Arbeitshandbuch
// weitere Flash Ressourcen

Bitte keine Flashfragen per PM oder Profilnachricht! Dafür ist das Forum da!

Geändert von Martin Kraft (09-01-2012 um 12:50 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Flash CS4] Bühne leeren snatch-ic Flash Einsteiger 3 19-06-2009 18:01
Bühne komplett leeren? TheFreeman ActionScript 2 2 21-08-2008 20:35
Bühne leeren? spott74 ActionScript 1 2 25-02-2008 14:58
komplette Bühne zoomen dervish ActionScript 1 3 22-11-2005 10:58
komplette hp MiM Softwarearchitektur und Entwurfsmuster 1 16-07-2003 21:49


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:47 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele