1&1 Webhosting
Flashhilfe.de - Flash Community

gotoAndPlay oder gotoAndStop - falsches Verhalten [Flash 10]

Forum > ActionScript 3.0 > gotoAndPlay oder gotoAndStop - falsches Verhalten

 


AntwortenRegistrieren Seite1  

 10.11.2011, 13:42 
Benutzerbild von flashdancer
Beiträge: 31
Wohnort: Heppenheim/Bergst raße
Registriert: Oct 2004

gotoAndPlay oder gotoAndStop - falsches Verhalten
Hallo meine Lieben,

gerade habt ihr mir aus dem Dilemma geholfen, und schon verzweifle ich an einer anderen, eigentlich primitiven Sache, wusste auch nicht, ob ich das unter AS2 oder AS3 posten soll, da es evtl. beide Versionen betrifft: Scheinbar funktioniert "gotoAndPlay" nicht immer so, wie es soll: Meine Anwendung soll in der Timeline einfach nur von Label zu Label springen, lässt aber dabei ein Label aus. Im Anhang befindet sich eine reduzierte fla mit sehr überschaubaren 20 Zeilen Code - wäre super, wenn sich jemand mal kurz erbarmen würde, da reinzusehen. Den Code hier zu posten, würde den Zusammenhang nicht so gut treffen, deswegen die fla.

Generell habe ich schon die Erfahrung gemacht, dass sich beide Funktionen manchmal merkwürdig verhalten. Meine Vorgehensweise ist meistens die: In jedem Zielbild eines Childs ein "stop()" setzen und dann vom Parent aus ein "child.gotoAndPlay('LABEL')" aufrufen; hat bisher auch immer geklappt, der Abspielkopf ist auch immer an diesem Bild stehengeblieben wegen des "stop()" in Zeile 1. Oft will man aber, dass der Abspielkopf zu einem Zielbild springt und von dort aus weiterläuft, was er aber manchmal nicht tut - trotz der Tatsache, dass im Zielbild KEIN "stop()" steht ... die Clips werden übrigens NICHT zur Laufzeit extern geladen oder auf der Bühne per "new" platziert!
Gerade habe ich auch dieses Problem und bisher keine Lösung gefunden.

Vielleicht kann jemand zu diesem scheinbar primitiven Thema weiterhelfen?! Das würde mich ganz extrem glücklich machen! Danke vorab!

versuch_hilfe.fla (19.63 KB)
Viele Grüße

flashdancer
 10.11.2011, 17:53Re1
Benutzerbild von ashitaka
Beiträge: 161
Registriert: Apr 2010

Du hast einen Denkfehler in deine script:

ActionScript:
1if(currentFrameLabel == "w1") gotoAndPlay("w2");


wenn der aktuelle Frame "w1" ist, geht er zu "w2" und spielt von dort ab, bis er bei "w3" stoppt.
gotoAndPlay funktioniert richtig, deine Programmlogik ist falsch.

probiers mal so:

ActionScript:
1if(currentFrameLabel == "w1") play();
Zeitleisten-Programmierung ist böse! löst euch von der Zeitleiste -> benutzt Flashdevelop!
Antworten auf Flash AS3 Fragen.
Flash Programmierer
 10.11.2011, 18:53Re2
Benutzerbild von flashdancer
Beiträge: 31
Wohnort: Heppenheim/Bergst raße
Registriert: Oct 2004

Themenautor/in

Hi ashitaka,

danke für deine Antwort. Wenn der Abspielkopf wirklich zu "w2" springt, dort weiterläuft und bei "w3" stoppt, müsste es doch eigentlich reichen, das "gotoAndPlay()" durch ein "gotoAndStop()" zu ersetzen, obwohl ja in jedem Bild schon ein "stop()" steht... habs gerade ausprobiert, das Ergebnis ist aber das gleiche - es ändert sich nichts. Dein Vorschlag "play()" zu verwenden, funktioniert nur, wenn 1. Start- und Zielframe aufeinander folgen und 2. wenn es in der Timeline nach rechts geht. Natürlich könnte man es - in meinem ersten Fall - auch mit "nextFrame()" und "previousFrame()" versuchen, aber das ist keine Lösung für alle Fälle; in vielen Fällen geht es nicht ohne "gotoAndPlay()".

Worin liegt also der Denkfehler? Die paar Zeilen machen mich echt wahnsinnig ... vor allem, was das zweite o.g. Problem mit "gotoAndPlay()" und dem Childmovie betrifft ...

Noch irgendwelche Lösungsvorschläge?

Danke nochmal!
Viele Grüße

flashdancer
 
nicht sichtbar bei eingeloggten Mitgliedern1&1 Webhosting
 10.11.2011, 20:06Re3
Benutzerbild von ashitaka
Beiträge: 161
Registriert: Apr 2010

ja ok, hab gerade ausprobiert, warum gotoAndStop auch nicht klappt:

ActionScript:
1
2
if(currentFrameLabel == "w1") gotoAndStop("w2");
if(currentFrameLabel == "w2") gotoAndStop("w3");


wenn du auf w1 bist, wird auf w2 gesetzt
dann kommt die nächste abfrage, und setzt direkt auf w3, weil ja in dem moment der currentframe schon w2 ist.

du müsstest das machen:

ActionScript:
1
2
if(currentFrameLabel == "w1") gotoAndStop("w2");
else if(currentFrameLabel == "w2") gotoAndStop("w3");


Der vorher beschriebene Denkfehler mit gotoAndPlay besteht weiterhin ;)


EDIT:
das zurück geht natürlich nur mit gotoAndStop(),
weil gotoAndPlay nur vorwärts abspielt.

Du kannst höchstens per EnterFrame jeden Frame einen Frame zurückspulen, also so z.b.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
function playBackwards():void {
       addEventListener(Event.ENTER_FRAME, playBackwardsEnterFrame);
}

function playBackwardsEnterFrame():void {
       gotoAndStop(currentFrame-1);
      if (currentFrameLabel == "w1" || currentFrameLabel == "w2" || currentFrameLabel == "w3")    { 
  removeEventListener(Event.ENTER_FRAME, playBackwardsEnterFrame);
  }
}

Zeitleisten-Programmierung ist böse! löst euch von der Zeitleiste -> benutzt Flashdevelop!
Antworten auf Flash AS3 Fragen.
Flash Programmierer
Geändert von ashitaka am 10.11.11 um 20:12 Uhr

 11.11.2011, 21:51Re4
Benutzerbild von flashdancer
Beiträge: 31
Wohnort: Heppenheim/Bergst raße
Registriert: Oct 2004

Themenautor/in

Hi ashitaka,

danke für die ausführliche Antwort. Ja, das ELSE ist an dieser Stelle natürlich absolut notwendig, da hatte ich echt Tomaten auf den Augen, vielen Dank für den Hinweis - weiß nicht, wie lange ich gebraucht hätte, bis mir das aufgefallen wäre!
Was den Denkfehler betrifft, so besteht der nur dann, wenn im Zielbild kein stop() steht, MIT stop() läuft der Film nämlich auch trotz gotoAndPLAY nicht weiter - bisher hab ich immer so gearbeitet, und es hat auch immer gut funktioniert; aber dass das ELSE hier gefehlt hat, war echt der entscheidende Hinweis.

Ich habe aber inzwischen eine Lösung für mein anderes gotoAndPlay-Problem gefunden, weiß zwar nicht, warum es sich so verhält, aber folgender Code zeigt es:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
Folgendes Beispiel soll verdeutlichen, wie sich gotoAndPlay in verschiedenen Fällen verhält:

Button "button_1_btn" steuert "movie_1_mc", "button_2_btn" steuert "movie_2_mc" usw.
Buttons und MovieClips befinden sich in "childMovie".
Bei MOUSE_OVER, MOUSE_OUT und MOUSE_UP eines Buttons springt der Abspielkopf an verschiedene Stellen des zugehörigen Movies.
Beim MOUSE_UP sollen zuerst alle Steuer-Buttons deaktiviert werden, damit der User die Animation im Movie nicht stören kann.
Dies kann z. B. durch "mouseEnabled = false" oder "removeEventListener" geschehen, jedoch gibt es einen Unterschied, wie u.a.:

Anmerkung: Zur besseren Übersicht wurden die Funktionen buttonOver und buttonOut hier weggelassen.
*/




childMovie.button_1_btn.addEventListener(MouseEvent.MOUSE_UP, buttonUp);
childMovie.button_2_btn.addEventListener(MouseEvent.MOUSE_UP, buttonUp);
childMovie.button_3_btn.addEventListener(MouseEvent.MOUSE_UP, buttonUp);
childMovie.button_4_btn.addEventListener(MouseEvent.MOUSE_UP, buttonUp);




// mouseEnabled: funktioniert NICHT, der Abspielkopf läuft NICHT bei "ZIEL" weiter

function buttonUp(evt:MouseEvent):void
{
     // alle Buttons nach MOUSE_UP eines Buttons deaktivieren:
   for(var id:uint = 1; id < 5; id ++)
     {
        SimpleButton(childMovie.getChildByName("button_" + id + "_btn")).mouseEnabled = false;
     }
     
     // id aus Button-Namen auslesen:
   var no:uint = evt.target.name.split("_")[1];
     
     // childMovie.movie_[no]_mc.gotoAndPlay("ZIEL"):
   MovieClip(childMovie.getChildByName("movie_" + no + "_mc")).gotoAndPlay("ZIEL");
}




// removeEventListener: funktioniert, der Abspielkopf läuft bei "ZIEL" weiter

function buttonUp(evt:MouseEvent):void
{
     // alle Buttons nach MOUSE_UP eines Buttons deaktivieren, hier aber mit "removeEventListener" statt "mouseEnabled = false"
   for(var id:uint = 1; id < 5; id ++)
     {
        SimpleButton(childMovie.getChildByName("button_" + id + "_btn")).removeEventListener(MouseEvent.MOUSE_UP, buttonUp);
     }
     
     // id aus Button-Namen auslesen:
   var no:uint = evt.target.name.split("_")[1];
     
     // childMovie.movie_[no]_mc.gotoAndPlay("ZIEL"):
   MovieClip(childMovie.getChildByName("movie_" + no + "_mc")).gotoAndPlay("ZIEL");
}



Ich hoffe, das hilft dem einen oder anderen in seiner Notlage weiter!

Und danke nochmal, ashitaka!
Viele Grüße

flashdancer
 
Themen
Ähnliche Beiträge zum Thema
 

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.
Partner Webseiten: DesignerInAction.de   Designnation.de   Mediengestalter.info   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   PSD-Tutorials.de   Tutorials.de

Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2012 Sebastian Wichmann - Flashhilfe.de