Flashhilfe.de - Flash Community

Variablen nicht gültig [Flash 9]

 


AntwortenRegistrieren Seite1  

MegaMuetzenMike#1
Benutzerbild von MegaMuetzenMike
Beiträge: 26
Registriert: Jan 2008

25.08.2009, 23:18

Hallo,
Meine SWF hat nur einen einzigen Frame. Auf diesem befindet sich ein mc, der wiederum aus mehreren mc's besteht.
Ich möchte zuerst ein paar Variablen erstellen. Damit diese nicht öfters erstellt werden, erstelle ich diese nach dem Laden. Danach sollen die Eigenschaften des mc verändert werden (jedes Mal beim Betreten des Frames).

Bis jetzt hab ich Code (hier vereinfachter Code) auf den mc gelegt:
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
onClipEvent (load) {
   var a = 1;
   var b = 2;
}

onClipEvent (enterFrame) {
   this._x += a;
   this._y += b;
   this.mc1._rotation += a;
   this.mc2._rotation -= b;
}


Allerdings würde ich den Code lieber auf einer eigenen Ebene von meiner SWF haben. Aber wie schreibe ich den Code passend um?

Bei meinem Versuch spreche ich die Variablen außerhalb des Geltungsbereiches an, auf jeden fall passiert nichts (außer ich benutze globale Variablen):
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
_root.mc.onLoad = function () {
   var a = 1;
   var b = 2;
   trace ("geladen");
}

_root.mc.onEnterFrame = function () {
   _root.mc._x += a;
   _root.mc._y += b;
   _root.mc.mc1._rotation += a;
   _root.mc.mc2._rotation -= b;
}
Sleepingbeast#2
Benutzerbild von Sleepingbeast
Beiträge: 579
Wohnort: Halle
Registriert: Apr 2005

26.08.2009, 07:06

Hallo,

zunächst einmal Glückwunsch zu der Entscheidung, deine Scripte nicht mehr direkt auf MCs zu legen ;) Sie in einem eigenen Schlüsselbild zu haben hat jede Menge Vorteile!
Aber zu deinem Problem: du hast die Variablen a und b innerhalb einer (anonymen) Funktion definiert. Wenn du das machst, existieren sie auch nur in dieser Funktion. Von außerhalb (in deinem Fall also von deiner nächsten onEnterFrame-Funktion) sind die Variablen nicht benutzbar.
Eine Funktion kannst du dir als ein gekapseltes Gebilde vorstellen, von dem nichts nach draußen oder auch nach innen gelangt. Außer du "zwingst" die Funktion dazu. Im Falle deines Scripts würde ich die Variablen außerhalb aller Funktionen zunächst einfach instanzieren. Damit teilst du dem gesamten Script lediglich mit, dass es die Variablen gibt und von welchem Typ sie sind. Dann kannst du auch mit den Funktionen auf diese zugreifen und sie verändern. Dein Script würde dann etwa so aussehen:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var a:Number;
var b:Number;

_root.mc.onLoad = function () {
  a = 1;
  b = 2;
  trace ("geladen");
}

_root.mc.onEnterFrame = function () {
  _root.mc._x += a;
  _root.mc._y += b;
  _root.mc.mc1._rotation += a;
  _root.mc.mc2._rotation -= b;
}


Prinzipiell musst du den Typ (hier Number) nicht angeben. Solltest du aber der Ordnung halber tun.


Patrick
_________________________________________________________
Um Rekursion wirklich zu verstehen, muss man zuerst Rekursion verstehen.
null != 'null' != 0 != '0'
MegaMuetzenMike#3
Benutzerbild von MegaMuetzenMike
Beiträge: 26
Registriert: Jan 2008

Themenautor/in

26.08.2009, 14:00

Vielen Dank, schon einmal, aber das mit dem onLoad funktioniert noch nicht:
ActionScript:
1
2
3
4
// wird nicht ausgeführt, da der mc sich bereits auf der bühne befindet
_root.mc.onLoad = function () {
   trace ("geladen");
}

Ich müsste den mc dann erst per AS auf die Bühne laden, oder?
Wäre dann bereits ein Preloader nötig/sinnvoll?

Was passiert eigentlich, wenn ich sowas in der Art habe:
ActionScript:
1
2
3
4
5
6
7
8
var a:Number = 1;
trace (a);

var a:Number = 2;
trace (a);

var a:Number = 1;
trace (a);

Wird die alte Variable a gelöscht und eine neue Variable a mit einem anderen Wert erstellt
oder merkt Flash, dass die Variable bereits besteht und aktualisiert nur den Wert?
Sleepingbeast#4
Benutzerbild von Sleepingbeast
Beiträge: 579
Wohnort: Halle
Registriert: Apr 2005

26.08.2009, 14:23

Zum ersten Teil deiner Frage:

Wenn deine onLoad-Funktion nicht noch irgendetwas besonderes machen soll, dann brauchst du sie normalerweise nicht. Denn das Aufrufen/Ausführen der swf-Datei ist ja im Grunde ein onLoad. Deshalb kannst du das auch weglassen. Also dann so in die Richtung:
erste Hälfte: Variante 1
ActionScript:
1
2
3
4
5
6
var a:Number;
var b:Number;

a = 1;
b = 2;
trace ("geladen");

oder wenn du die Werte der Variablen unbedingt in einer Funktion haben willst, kannst du das auch so machen
erste Hälfte: Variante 2
ActionScript:
1
2
3
4
5
6
7
8
9
var a:Number;
var b:Number;
function setzeVariablen() {
  a = 1;
  b = 2;
  trace ("geladen");
}

setzeVariablen(); //Ruft die Funktion auf

Natürlich kannst du die Variablen auch direkt beim instanzieren mit Werten versehen.
erste Hälfte: Variante 3
ActionScript:
1
2
var a:Number = 1;
var b:Number = 2;

Danach kannst du dann den zweiten Teil deines Scripts normal verwenden.
zweite Hälfte
ActionScript:
1
2
3
4
5
6
_root.mc.onEnterFrame = function () {
  _root.mc._x += a;
  _root.mc._y += b;
  _root.mc.mc1._rotation += a;
  _root.mc.mc2._rotation -= b;
}



Zum zweiten Teil deiner Frage:

Probier doch einfach aus, was passiert ;) Ausgegeben bekommst du 1 2 3, weil du ja direkt nach jeder Variablendefinition diese per trace() ausgeben lässt. Aber du hast mit deiner ersten Vermutung recht. Die "alte" Variable wird einfach von der neueren überschrieben. Nun kommt es jedoch auf die verwendete ActionScript-Version an. Mit AS2 bekommst du normalerweise keine Fehlermeldung. Nutzt du AS3, dann wirst du auf die doppelte Variablendefinition hingewiesen und das Script wird nicht ausgeführt.


Patrick
_________________________________________________________
Um Rekursion wirklich zu verstehen, muss man zuerst Rekursion verstehen.
null != 'null' != 0 != '0'
Geändert von Sleepingbeast am 26.08.09 um 14:24 Uhr
MegaMuetzenMike#5
Benutzerbild von MegaMuetzenMike
Beiträge: 26
Registriert: Jan 2008

Themenautor/in

26.08.2009, 14:29

Nochmals vielen Dank ^^
Ist doch gut zu wissen, wie das geregelt ist. Vor allem, wenn ich in ferner Zukunft eventuell auf AS3 umsteigen sollte.
Sleepingbeast#6
Benutzerbild von Sleepingbeast
Beiträge: 579
Wohnort: Halle
Registriert: Apr 2005

26.08.2009, 14:33

Kein Problem....dafür sind wir ja da ;)

Lass dir nicht allzu viel Zeit mit dem Umstieg auf AS3. Ich habs auch immer vor mir hergeschoben, hab vor etwa 3 Monaten aber dann doch den Schritt gewagt. So wild ist es gar nicht, teilweise sogar um einiges logischer als AS2. Den vielgepriesenen Geschwindigkeitszuwachs konnte ich aber noch nicht wirklich feststellen, wobei er aber rational erklärbar wäre.
_________________________________________________________
Um Rekursion wirklich zu verstehen, muss man zuerst Rekursion verstehen.
null != 'null' != 0 != '0'
MegaMuetzenMike#7
Benutzerbild von MegaMuetzenMike
Beiträge: 26
Registriert: Jan 2008

Themenautor/in

26.08.2009, 14:52

Wie hast du AS3 gelernt bzw. bist du umgestiegen?
Wenn ich die Zeit und die Möglichkeit hätte, dann würde ich sofort damit Anfangen.
Kann man eigentlich alleine über die mitgelieferte Dokumentation von Adobe Actionscript lernen oder ist dies eher nur zum Nachschlagen geeignet?
Sleepingbeast#8
Benutzerbild von Sleepingbeast
Beiträge: 579
Wohnort: Halle
Registriert: Apr 2005

26.08.2009, 15:10

Die mitgelieferte Dokumentation sehe ich tatsächlich eher als Nachschlagewerk. Zum Lernen finde ich sie nicht sonderlich hilfreich. Ich hab mir das Buch "Das Praxisbuch ActionScript3" von Galileo Design zugelegt (ohne Werbung machen zu wollen ;) ). Das war für den Einstieg ganz gut. Das meiste habe ich dann aber doch per Trial&Error gemacht. Und natürlich mit unserem Forum hier bzw. ein paar anderen Tutorial-Websites. Wenn du das Grundprinzip von AS2 bzw. anderer Programmiersprachen aber einigermaßen verstanden hast - also weist, was Funktionen, Schleifen, Arrays usw. sind - dann ist der Umstieg nicht so extrem schwer. Das wichtigste (und meines Erachtens auch das beste) an AS3 sind eigentlich die EventListener, die einfach auf ein bestimmtes Ereignis warten und wenn dieses dann irgendwann auftritt eine Funktion aufrufen.
_________________________________________________________
Um Rekursion wirklich zu verstehen, muss man zuerst Rekursion verstehen.
null != 'null' != 0 != '0'

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2022 Sebastian Wichmann - Flashhilfe.de