Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 26-04-2011, 10:05   #1 (permalink)
gelegenheitsflasher
 
Registriert seit: Jul 2001
Ort: zu hause
Beiträge: 68
Question Arrayeintrag als Instanzname verwenden

Hallo,

ich bearbeite gerade mein erstes größeres Projekt in AS3 und stoße gerade an eine Verständnisgrenze, bin dementsprechend ziemlich frustriert.

Was ich habe:
Ich habe mehrere ineinander verschachtelte Reiternavigationen gebaut. Jeder Reiter ist ein MC mit weiteren Unter-MCs, inklusive der Animation für den Reiterwechsel. Soweit kein Problem. Ich klicke die Reiter an, sie ändern ihre Position, allerdings nur einmal, danach gehts nicht mehr. Keine Ahnung wieso... Weiterhin will ich ein paar Funktionen ausführen, was auch (noch) nicht geht, da kommen Fehlermeldungen.

Was ich will:
Ich will, wenn ich einen beliebigen Reiter anklicke, dass sich alle anderen Reiter in ihrer Anordnung nacheinander wie am Anfang sortieren, und dass sich dann der angeklickte Reiter oben drauf setzt. Dann würde ich gerne eine globale Funktion ausführen und bestimmte Textfelder innerhalb des Reiters mit Arraywerten füllen...

Was ich nicht kann:
Ich weiß nicht, wie ich die Instanz-Namen ansprechen soll, in Flash 8 konnte ich alles machen, was ich wollte, hier (CS5) stehe ich da wie ein Anfänger... Es gibt eine endliche Zahl an Instanznamen, denen ich mit setChildIndex() einen Wert zuweisen will, das mache ich für jeden Reiter momentan so:

Code:
addEventListener(Event.ENTER_FRAME, fl_EnterFrameHandler);

function fl_EnterFrameHandler(event:Event):void
{
	(parent as MovieClip).setChildIndex(this, parent.numChildren-1);
}
Aber: Das funktioniert nur EINMAL, und wenn ich für "this" einen anderen Instanznamen einsetze hagelt es Fehler. Ich habe mir ein globales Array erstellt, mit allen Instanznamen, die ich "resetten" will. Ich denke mir die in einer Schleife durchzuspulen. Ich kann die Array-Werte aufrufen und auch tracen, aber mehr auch nicht. Solange das nicht geht, kann ich auch die Textfelder nicht befüllen...

Ich bin gerne bereit zu lernen, aber das Konzept von AS3 verstehe ich nicht. Tutorialseiten habe ich mir angesehen, Adobe-Web ebenfalls konsultiert, aber englisch ist nicht meine Stärke und ich drehe mich im Kreis.

Was ich brauche:
Ich bitte um eine kurze, verständliche Erklärung, wie ich in AS3 Instanzen anspreche, wie ich in der Hierarchie vorwärts und rückwärts denke (früher ging das mal mit "parent" oder dem Pfad innerhalb der MC-Instanznamen) und wie ich einen String so zu einem Instanznamen konvertieren kann, dass ich damit weiterarbeiten kann.

Ich bedanke mich und hoffe auf Hilfe
rHamsys ist offline   Mit Zitat antworten
Alt 26-04-2011, 10:16   #2 (permalink)
brand new user
 
Benutzerbild von RustyCake
 
Registriert seit: May 2002
Ort: Laimbach 6 1/2
Beiträge: 16.884
Du möchtest im Prinzip, den jeweilig Aktiven MovieClip nach oben hohlen, richtig?
Warum setzt Du da auf EnterFrame?
__________________
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muß erst gehen lernen"
RustyCake ist offline   Mit Zitat antworten
Alt 26-04-2011, 10:19   #3 (permalink)
gelegenheitsflasher
 
Registriert seit: Jul 2001
Ort: zu hause
Beiträge: 68
Zitat:
Zitat von RustyCake Beitrag anzeigen
Du möchtest im Prinzip, den jeweilig Aktiven MovieClip nach oben hohlen, richtig?
Ja, richtig.

Zitat:
Zitat von RustyCake Beitrag anzeigen
Warum setzt Du da auf EnterFrame?
Weil das "Hervorholen" erst an einer bestimmten Stelle der Animation passieren soll, nicht bereits, wenn ich auf den MC klicke.
rHamsys ist offline   Mit Zitat antworten
Alt 26-04-2011, 10:43   #4 (permalink)
brand new user
 
Benutzerbild von RustyCake
 
Registriert seit: May 2002
Ort: Laimbach 6 1/2
Beiträge: 16.884
Zitat:
Zitat von rHamsys Beitrag anzeigen
Weil das "Hervorholen" erst an einer bestimmten Stelle der Animation passieren soll, nicht bereits, wenn ich auf den MC klicke.
Welche Animation, Timeline-Base?
Wenn ja erzähl mal wo das passieren soll, wenn nicht auch
__________________
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muß erst gehen lernen"
RustyCake ist offline   Mit Zitat antworten
Alt 26-04-2011, 11:06   #5 (permalink)
gelegenheitsflasher
 
Registriert seit: Jul 2001
Ort: zu hause
Beiträge: 68
Question

So wie es aussieht, habe ich es wohl nicht exakt genug erklärt:

Es gibt auf der Bühne ein MC namens "gui", der beinhaltet 7 Reiter-MCs namens "qa_mc", "qb_mc" usw. Innerhalb dieser MCs befinden sich weitere Elemente (Schaltflächen, Texte, Bilder). Damit der Effekt des "Herausziehens" eines Reiters realistisch erscheint, muss ich ja alle Elemente animieren, also geschieht das hier: Diese MCs werden auf einer Zeitleiste animiert, aber erst, nachdem sie angeklickt wurden.

Zitat:
Zitat von RustyCake Beitrag anzeigen
Welche Animation, Timeline-Base?
Ja, ein klassisches Tween.

Zitat:
Zitat von RustyCake Beitrag anzeigen
Wenn ja erzähl mal wo das passieren soll, wenn nicht auch
Ich würde gerne eine globale Funktion definieren, wo alle meine Aktionen dieses Ereignis betreffend, geschehen können. Das habe ich so gemacht:

Code:
package {

public class MyGlobal {

public static var Liste_Hauptreiter:Array = new Array("qa_mc","qb_mc","qc_mc","qd_mc","qe_mc","qf_mc","qg_mc");
public static var Liste_Inforeiter:Array = new Array("bild_mc","info1_mc","info2_mc","exit_mc");

public function resetDepth()
{
trace("jetzt wird resettet!");	
//setChildIndex(qa_mc,0);
// etc.
} 
}

}
Ich rufe die Funktion in dem Frame auf, wo ich die Aktion haben möchte:
Code:
addEventListener(Event.ENTER_FRAME, MyGlobal.resetDepth);
Leider kann ich nicht meine Funktion "resetDepth" aufrufen (Fehler: "TypeError: Error #2007: Parameter listener darf nicht 'null' sein.
at flash.events::EventDispatcher/addEventListener()").

Was hat das alles zu bedeuten? Bin echt ratlos... hab sicher einen globalen Denkfehler... ich brauch mal einen Anschubser in die richtige Richtung bitte.
rHamsys ist offline   Mit Zitat antworten
Alt 26-04-2011, 11:23   #6 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Die Fehlermeldung kommt daher, dass Du versuchst, eine Instanzfunktion direkt über ihre Klasse aufzurufen und diese zudem keine Parameter erwartet. Lösung:
  • Funktion static deklarieren und so der Klasse zuordnen
  • Außerdem sollte die Funktion einen Parameter event:Event erwarten
Generell würd ich Dir aber empfehlen etwas anders vorzugehen...
__________________
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 26-04-2011, 11:26   #7 (permalink)
gelegenheitsflasher
 
Registriert seit: Jul 2001
Ort: zu hause
Beiträge: 68
Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Die Fehlermeldung kommt daher, dass Du versuchst, eine Instanzfunktion direkt über ihre Klasse aufzurufen und diese zudem keine Parameter erwartet. Lösung:
  • Funktion static deklarieren und so der Klasse zuordnen
  • Außerdem sollte die Funktion einen Parameter event:Event erwarten
Danke dir!
edit: das Einfügen von event:Event macht Fehler (Typ wird nicht erkannt), füge ich static ein kommt das:
"ArgumentError: Error #1063: Nicht übereinstimmende Argumentzählung für MyGlobal$/resetDepth(). 0 erwartet, 1 erhalten."

Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Generell würd ich Dir aber empfehlen etwas anders vorzugehen...
Ich würde mich sehr freuen, wenn du mich mit einem besseren Ansatz unterstützen könntest...

Geändert von rHamsys (26-04-2011 um 11:29 Uhr)
rHamsys ist offline   Mit Zitat antworten
Alt 26-04-2011, 11:35   #8 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Generell sollte man:
  • globale oder statische Methoden und Eigenschaften vermeiden, wenn sie (wie in diesem Fall) nicht nötig sind. Und auch globale Sammlungen (wie Deine Klasse MyGlobal) schaffen mehr Probleme als sie lösen.

  • wenn möglich Objekte nicht über einen String ansprechen, sondern direkte Referenzen verwenden.

  • Bei der Deklaration von Arrays und Objekten die zugehörigen Literale statt des Konstruktors verwenden:
    PHP-Code:
    var a:Array = [123];
    //statt:
    var a:Array = new Array (123);

    // und

    var ob:Object = {};
    //statt
    var ob:Object = new Object(); 
  • Funktionen nur dann ausführen, wenn sie nötig sind.
    Die Reiter müssen ja nur sortiert werden, wenn der aktuelle Reiter wechselt und nicht bei Event.ENTER_FRAME.
__________________
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 (26-04-2011 um 11:39 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 26-04-2011, 11:37   #9 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von rHamsys Beitrag anzeigen
edit: das Einfügen von event:Event macht Fehler (Typ wird nicht erkannt), füge ich static ein kommt das:
"ArgumentError: Error #1063: Nicht übereinstimmende Argumentzählung für MyGlobal$/resetDepth(). 0 erwartet, 1 erhalten."
Wie ich bereits sagte: Eine Listener-Funktion muss einen Parameter vom Typ Event erwarten:
PHP-Code:
import flash.events.Event;

public static function 
resetDepthevent:Event ):void {
// usw. 
__________________
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 26-04-2011, 11:47   #10 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Hier mal ein AlternativVorschlag (Achtung ungetestet!):
PHP-Code:
import flash.display.DisplayObject;
import flash.events.MouseEvent;

var 
hauptreiter:Array = [qa_mcqb_mcqc_mcqd_mcqe_mcqf_mcqg_mc];
var 
activerReiter:DisplayObject;

function 
activiereReiter(event:MouseEvent):void {
    var 
reiter:DisplayObject event.currentTarget as DisplayObject;
    
    if (
reiter && reiter.parent) {
        
reiter.parent.setChildIndex(reiterreiter.parent.numChildren-1);
        
activerReiter reiter;
    }
}

for 
each (var reiter:Sprite in hauptreiter) {
    
reiter.addEventListener(MouseEvent.CLICKactiviereReiter);

__________________
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 (26-04-2011 um 11:50 Uhr)
Martin Kraft ist offline   Mit Zitat antworten
Alt 26-04-2011, 11:52   #11 (permalink)
gelegenheitsflasher
 
Registriert seit: Jul 2001
Ort: zu hause
Beiträge: 68
Question

Ich danke dir, allerdings bleiben eine Menge Fragen...

Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Generell sollte man:[LIST][*]globale oder statische Methoden und Eigenschaften vermeiden
Ich würde es halt gern vermeiden, 7 mal die gleiche Anweisung für jeden Reiter zu schreiben. Ich hab einfach keinen Plan wie das gehen kann...

Zitat:
Zitat von Martin Kraft Beitrag anzeigen
[*]wenn möglich Objekte nicht über einen String ansprechen, sondern direkte Referenzen verwenden.
Das verstehe ich nicht. Nach meinem Verständnis hat ein MoviClip einen Namen, den ich ansprechen muss, damit Flash weiß, wo ich etwas ändern will. Ist das ein Denkfehler von mir? Und was ist eine Referenz? Sicher nicht das, was ich mir darunter vorstelle...

Zitat:
Zitat von Martin Kraft Beitrag anzeigen
[*]Bei der Deklaration von Arrays und Objekten die zugehörigen Literale statt des Konstruktors verwenden:
[/PHP]
Ok, ich geb mir Mühe...

Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Die Reiter müssen ja nur sortiert werden, wenn der aktuelle Reiter wechselt und nicht bei Event.ENTER_FRAME.
Hehe, "nur", ja... Fast alles, was ich aufrufe in Flash, macht Fehler, intuitiv war das früher mal, jetzt nicht mehr. Was schlägst du denn vor? Ich hab keine Idee, wie das gehen kann. Ich spiele eine Animation ab und will, dass im Moment von Frame 3 sich etwas ändert, teilweise in anderen Moviclips und Ebenen, die ich aber mit "parent" usw. auch nicht mehr ansprechen kann. Die Funktionslisten bei Adobe helfen mir leider nicht weiter in diesem Punkt.
rHamsys ist offline   Mit Zitat antworten
Alt 26-04-2011, 11:57   #12 (permalink)
gelegenheitsflasher
 
Registriert seit: Jul 2001
Ort: zu hause
Beiträge: 68
Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Hier mal ein AlternativVorschlag (Achtung ungetestet!):
Ich danke dir, ich teste das mal. Die Frage ist nur noch, wo genau schreibe ich das denn rein (ich merke grad, dass aus Flash ein völlig anderes Programm geworden ist)?

edit:
"ReferenceError: Error #1065: Variable qa_mc ist nicht definiert."

Geändert von rHamsys (26-04-2011 um 12:02 Uhr)
rHamsys ist offline   Mit Zitat antworten
Alt 26-04-2011, 12:05   #13 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von rHamsys Beitrag anzeigen
Ich danke dir, ich teste das mal. Die Frage ist nur noch, wo genau schreibe ich das denn rein
Einfach in die Zeitleiste; auf den ersten Frame in dem alle Reiter definiert sind, die oben im Array eingetragen sind.

Zitat:
Zitat von rHamsys Beitrag anzeigen
(ich merke grad, dass aus Flash ein völlig anderes Programm geworden ist)?
So wild ist's jetzt auch wieder nicht: Zeitleiste und ActionScript-Fenster sind immer noch da, wo sie schon immer waren.

Zitat:
Zitat von rHamsys Beitrag anzeigen
"ReferenceError: Error #1065: Variable qa_mc ist nicht definiert."
Dann hast Du entweder die Instanz anders benannt, oder qa_mc existiert auf dem Frame noch nicht, auf dem jetzt das Script steht.
__________________
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 26-04-2011, 12:14   #14 (permalink)
gelegenheitsflasher
 
Registriert seit: Jul 2001
Ort: zu hause
Beiträge: 68
Zitat:
Zitat von Martin Kraft Beitrag anzeigen
Einfach in die Zeitleiste; auf den ersten Frame in dem alle Reiter definiert sind, die oben im Array eingetragen sind.
Okay, habich gemacht und wieder was dazugelernt. Und der Fehler mit den Variablennamen ist auch weg.

Zitat:
Zitat von Martin Kraft Beitrag anzeigen
So wild ist's jetzt auch wieder nicht: Zeitleiste und ActionScript-Fenster sind immer noch da, wo sie schon immer waren.
Ja, das beruhigt mich...

Allerdings sehe ich keinen Effekt und ich erkenne (noch) nicht, wo denn eigentlich der Effekt ausgelöst wird, wenn ich auf einen Reiter klicke. Ich glaube, wenn ich das begreife, hat sich der Tag schon gelohnt Kannst du mir noch ein bisschen weiter helfen durchzublicken?

Achso, sollte ich mal die Datei dranhängen?
rHamsys ist offline   Mit Zitat antworten
Alt 26-04-2011, 12:22   #15 (permalink)
Flash-Designer
 
Benutzerbild von Martin Kraft
 
Registriert seit: May 2006
Ort: Wiesbaden
Beiträge: 6.162
Zitat:
Zitat von rHamsys Beitrag anzeigen
Allerdings sehe ich keinen Effekt und ich erkenne (noch) nicht, wo denn eigentlich der Effekt ausgelöst wird, wenn ich auf einen Reiter klicke. Ich glaube, wenn ich das begreife, hat sich der Tag schon gelohnt Kannst du mir noch ein bisschen weiter helfen durchzublicken?
Beim Klick auf einen der Reiter wird die Funktion activiereReiter aufgerufen und sollte diesen reiter nach vorne bringen. Wenn Du keinen Effekt siehst, bau Dir mal ein trace in die Funktion und lass Dir so ausgeben, ob sie überhaupt aufgerufen wird und ob dort reiter belegt ist.
__________________
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
Antwort

Lesezeichen

Stichworte
array, as3, instanzname, setchildindex, string

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
Instanzname aus Array verwenden = Alptraum? xanku ActionScript 3 13 08-03-2011 19:38
Instanzname in Variable weiter verwenden rohweds ActionScript 3 1 14-05-2009 10:59
instanzname llcoola-02 Flash Einsteiger 2 16-07-2007 20:40
Arrayeintrag > Instanzname Vererbungsproblem axl.r Flash Einsteiger 5 21-09-2006 11:37
Ordner zählen, ArrayEintrag löschen... moneyman Flash und Datenbanken 4 03-03-2002 19:07


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele