Antworten auf deine Fragen:
Neues Thema erstellen

In AS2 schon 100x gemacht - mit AS3 verzeifel ich!

F

frathomo

Guest

Hallo! Folgendes:

Ich habe einen Movieclip 1 (pum_bodyshape) auf der Haupbühne. Darin ist ein Button (button_1). Der Button soll beim Klick in einem anderen Movieclip 2 (bodyshape), der ebenfalls auf der Hauptbühne liegt, auf Bild Nr 2 wechseln. In dem Movieclip 1 habe ich folgenden Code stehen.

button_1.addEventListener(MouseEvent.MOUSE_UP, changeBodyshape);

function changeBodyshape(e:MouseEvent): void {
MovieClip(root).bodyshape.gotoAndStop(2);
}

Es passiert nichts und ich bekomme immer den Fehler:
TypeError: Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich.

Ich werd noch verrückt! Ich habe das schon sooo oft mit AS2 gemacht und bekomme das seit Tage nicht hin. Kann mir jemand helfen?
 

ssandner

Nicht mehr Newbie

Hallo! Der Null-Objekt-Fehler 1009 ist ziemlich nervig in flash, weil völlig nichtssagend. Er bedeutet, dass Du ein Objekt per AS anspricht, welches z.B. nicht vorhanden oder einen anderen Namen hat.
  • In AS3 steht actionscript nicht in einem movieclip, sondern in der Hauptzeitleiste in frame 1 (oder in einer gesonderten as-Datei) (nur ein stop() ist noch erlaubt)
  • wenn Dein button in dem Movieclip pum_bodyshape liegt, musst Du ihn mit
    Code:
     this.pum_bodyshape.button_1.addEventListener(MouseEvent.MOUSE_UP, changeBodyshape);
    ansprechen
  • Ob dein "MovieClip(root).bodyshape.gotoAndStop(2);" funktioniert, bin ich auch nicht ganz sicher. Der Code sieht verteufelt nach AS2 aus. Ich würde
    Code:
    this.bodyshape.gotoAndStop(2);
    verwenden


Gruß

Stephan
 
F

frathomo

Guest

Hallo Stephan, danke für deine Antwort!

Ich habe es mittlerweile hinbekommen was ich wollte. Das Einzige was ich verändert habe ist, dass ich den Code der den nicht funktionierenden button angesprochen hat in den gleichen Frame (auf neuer Ebene) verschoben habe. Funktioniert alles ohne Fehler.

Im AS3 ALLES nur im Frame 1 der Hauptzeitleiste zu schreiben ist doch total unübersichtlich? Ich kenne mich mit AS3 noch nicht aus, aber es spricht doch nichts dagegen den Code im entsprechenden Movieclip zu schreiben?
 

ssandner

Nicht mehr Newbie

Ich find es umgekehrt viel schlimmer. Wenn ich eine AS2-Animation analysiere, dann kann überall Code sein, selbst in einem Movieclip der sich in einem Movieclip befindet. (Dies ist übrigens in AS3 nicht mehr erlaubt (außer einem stop())
Meine AS3 Animationen haben in der Hauptzeitleiste nur EINEN Frame und ganz oben (oder unten) steht der AS-Code in einer sonst leeren Ebene "AS". Alle Zeitleisten-animationen finden in eigenen Movieclips statt
Im empfehlen, die das auch:

In der Flash-Authoring-Umgebung können Sie jedem Bild in einer Zeitleiste ActionScript-Code hinzufügen. Dieser Code wird immer dann ausgeführt, wenn der Film abgespielt wird und der Abspielkopf dieses Bild erreicht. Durch das Platzieren von ActionScript-Code in Bildern können Sie den im Flash-Authoring-Tool erstellten Anwendungen ein bestimmtes Verhalten hinzufügen. Sie können jedem Bild in der Hauptzeitleiste oder jedem Bild in der Zeitleiste eines beliebigen Movieclip-Symbols Code hinzufügen. Diese Flexibilität hat jedoch ihren Preis. Wenn Sie größere Anwendungen erstellen, verlieren Sie leicht die Übersicht, welche Skripts in welchen Bildern enthalten sind. Als Folge ist die Anwendung mit der Zeit immer schwieriger zu verwalten. Viele Entwickler vereinfachen die Struktur des ActionScript-Codes im Flash-Authoring-Tool, indem sie Code nur im ersten Bild einer Zeitleiste oder nur auf einer bestimmten Ebene in ein Flash-Dokument einfügen. Dadurch kann der Code in den Flash-FLA-Dateien einfacher gefunden und gepflegt werden.
Und bevor jetzt die Flash-Päpste auf dieser Plattform sich zu Wort melden: Noch optimaler ist es, den Code in einer separaten AS-Datei als Actionscript-Klassen zu schreiben.
Ich empfehle Dir das AS3-Programmierhandbuch, wenn Du öfter mit Flash arbeitest.

Gruß

Stephan
 

keul3

3dsMax | 3D-Contest

Im AS3 ALLES nur im Frame 1 der Hauptzeitleiste zu schreiben ist doch total unübersichtlich? Ich kenne mich mit AS3 noch nicht aus, aber es spricht doch nichts dagegen den Code im entsprechenden Movieclip zu schreiben?
Der Vorteil ist, du hast den ganzen Code an einem Ort. D.h. du musst dich nicht durch die möglicherweise tief verschachtelten Buttons/MovieClips quälen, also an sich sehr übersichtlich.
Wichtiger noch, wenn du den Code über mehrere Objekte/Frames verteilst, steigt das Risiko von Fehlern, wie z.B. dein Null-Objektverweis.
Unübersichtlich wird es erst bei komplexeren Anwendungen, aber dafür gibts auch ne Lösung, siehe...
Und bevor jetzt die Flash-Päpste auf dieser Plattform sich zu Wort melden: Noch optimaler ist es, den Code in einer separaten AS-Datei als Actionscript-Klassen zu schreiben.
 
F

frathomo

Guest

Jetzt ging schon wieder was nich und ich habe nochmal umgebaut.
Dieser Code steht auf der Hauptzeitleiste im 1. Frame und ich bekomme #1009?
Ist denn hier was falsch?

"pum_bodyshape" und "guitar" liegen auf der Hauptzeitleiste. In diesen Movieclips sind jeweils noch weitere Movieclips.

P.S. Es soll ein Konfigurator werden.

Code:
stop();

pum_bodyshape.options_bodyshape.button_ascensia.addEventListener(MouseEvent.MOUSE_UP, setAscensia);
pum_bodyshape.options_bodyshape.button_gemina.addEventListener(MouseEvent.MOUSE_UP, setGemina);
pum_bodyshape.options_bodyshape.button_facilia.addEventListener(MouseEvent.MOUSE_UP, setFacilia);
pum_bodyshape.options_bodyshape.button_facilia_sc.addEventListener(MouseEvent.MOUSE_UP, setfaciliaSc);

function setAscensia(e:MouseEvent) {
     guitar.bodyshape.gotoAndStop("ascensia");
}
function setGemina(e:MouseEvent) {
    guitar.bodyshape.gotoAndStop("gemina");
}
function setFacilia(e:MouseEvent) {
     guitar.bodyshape.gotoAndStop("facilia");
}
function setfaciliaSc(e:MouseEvent) {
     guitar.bodyshape.gotoAndStop("facilia_sc");
}
 

keul3

3dsMax | 3D-Contest

Instanznamen haben alle angesprochenen Objects?
Setze mal ein paar trace() um zu sehn welche Objects wirklich da sind
Code:
stop();
trace(pum_bodyshape);
trace(pum_bodyshape.options_bodyshape.button_ascensia);
trace(pum_bodyshape.options_bodyshape.button_gemina);
trace(pum_bodyshape.options_bodyshape.button_facilia);
trace(pum_bodyshape.options_bodyshape.button_facilia_sc);
trace(guitar);
trace(guitar.bodyShape);

pum_bodyshape.options_bodyshape.button_ascensia.addEventListener(MouseEvent.MOUSE_UP, setAscensia);
pum_bodyshape.options_bodyshape.button_gemina.addEventListener(MouseEvent.MOUSE_UP, setGemina);
pum_bodyshape.options_bodyshape.button_facilia.addEventListener(MouseEvent.MOUSE_UP, setFacilia);
pum_bodyshape.options_bodyshape.button_facilia_sc.addEventListener(MouseEvent.MOUSE_UP, setfaciliaSc);

function setAscensia(e:MouseEvent) {
     guitar.bodyshape.gotoAndStop("ascensia");
}
function setGemina(e:MouseEvent) {
    guitar.bodyshape.gotoAndStop("gemina");
}
function setFacilia(e:MouseEvent) {
     guitar.bodyshape.gotoAndStop("facilia");
}
function setfaciliaSc(e:MouseEvent) {
     guitar.bodyshape.gotoAndStop("facilia_sc");
}
Ich gehe davon aus dass eines der Child-Objects nicht auf dem ersten Frame vom Parent liegt, und deshalb nicht ansprechbar ist.
 
F

frathomo

Guest

Ja genau! Ich möchte Pop-up Menüs haben (pum_bodyshape) und da liegen die Buttons im Frame 2. Bei AS2 war das immer kein Problem ... Mmh, wie mach ich das jetzt?
 
F

frathomo

Guest

Noch ein Problem! :/

Struktur: Root --> guitar --> bodyshape --> body_wood

1- Ich ändere per gotoandstop den Frame in einem child-Movieclip ("bodyshape") eines Movieclip ("guitar") auf der Hauptzeitleiste. Das geht.
2- Als nächstes ändere ich per gotoandstop den Frame in einem child-Movieclip ("body_wood") des Movieclip ("bodyshape"). Auch das geht.
3- Ändere ich jetzt wieder den Frame in "bodyshape", springt der child-Movieclip ("body_wood") auf Anfang?

Das verhalten kann ich mir nicht erklären!? War in AS2 kein Problem!
Kann mir jemand helfen?
 

keul3

3dsMax | 3D-Contest

Ja genau! Ich möchte Pop-up Menüs haben (pum_bodyshape) und da liegen die Buttons im Frame 2. Bei AS2 war das immer kein Problem ... Mmh, wie mach ich das jetzt?
Mit den EventHandlern wechselst du nur die Frames um deine PopUp-Menues anzuzeigen?
Leg alles auf den 1. Frame, und statt die Frames zu wechseln arbeitest du mit der visible-Property. Alles was zu Anfang nicht zu sehn sein soll, machste unsichtbar (parent.child.visible = false) und bei deinen Handlern setzt du es wieder auf true.
Dein Vorhaben lässt sich mit etwas mehr Code höchstwahrscheinlich eleganter lösen (Instanzen aus der Library via Code ziehen usw.), denn ich persönlich finde diese Verschachtelung zu unübersichtlich, so ist z.B. das Referenzieren von Objekten mittels der Parents nicht so schön, als diese direkt anzusprechen.
 
Zuletzt bearbeitet:
F

frathomo

Guest

Danke für deinen Input! Ja, das mag alles sein, aber ich finde es komisch, dass das, was ich im AS2 schon mehrfach ohne Probleme gemacht habe im AS3 nicht gehen soll?

"(Instanzen aus der Library via Code ziehen usw.)" - Was meinst du damit?
 

keul3

3dsMax | 3D-Contest

Danke für deinen Input! Ja, das mag alles sein, aber ich finde es komisch, dass das, was ich im AS2 schon mehrfach ohne Probleme gemacht habe im AS3 nicht gehen soll?
war halt auch ein großer Schritt von 2 zu 3, aber wirklich viel sagen kann ich zu AS2 nicht, da ichs nie benutzt hab.

"(Instanzen aus der Library via Code ziehen usw.)" - Was meinst du damit?
Ich gehe von einer leeren Stage aus, alles was du hast sind die MovieClips/Buttons in der Library.
Code:
var mc:ClassName = new ClassName() //den ClassName kannst du beim Symbol ---> Linkage angeben und für den Export in AS bereitstellen
mc.x = 20;
mc.y = 10;
addChild(mc);
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
118.621
Beiträge
1.538.378
Mitglieder
67.546
Neuestes Mitglied
tyed
Oben