1&1 DSL
Flashhilfe.de - Flash Community

Problem mit setInterval und dynamisch geladenen Bildern - Zeit halbiert sich ??? [Flash CS5]

Forum > Flash Entwicklung > Problem mit setInterval und dynamisch geladenen Bildern - Zeit halbiert sich ???

 


AntwortenRegistrieren Seite1  

 28.09.2010, 16:44 
Beiträge: 20
Registriert: Jun 2010

Problem mit setInterval und dynamisch geladenen Bildern - Zeit halbiert sich ???
Hallo,

ich hab mir mit Hilfe von Euch folgendes Skript gebastelt:

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
var BilderGesamt:LoadVars = new LoadVars();
BilderGesamt.load("Pics/BilderGesamt.txt");

BilderGesamt.onLoad = function():Void {
     
     _global.bildcounter = 1;
        
     function Einblenden(){
     Bilder._alpha += 2;
     }
     
     Bilder._alpha = 0;
     Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
     setInterval (Einblenden, 50);
 
     rechts.onRelease = function(){
        if(_global.bildcounter != BilderGesamt.Anzahl){
           _global.bildcounter += 1;
          Bilder._alpha = 0
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
          setInterval(Einblenden, 50);
        }
        else {
           _global.bildcounter = 1;
          Bilder._alpha = 0
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
          setInterval(Einblenden, 50);
        }
     }
     
     links.onRelease = function(){
        if(_global.bildcounter != 1){
           _global.bildcounter -= 1;
           Bilder._alpha = 0
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
           setInterval(Einblenden, 50);
        }
        else {
           _global.bildcounter = BilderGesamt.Anzahl;
           Bilder._alpha = 0
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
           setInterval(Einblenden, 50);
        }
     }
}


Es werden externe jpg-Bilder geladen. Funktioniert soweit. Mit der Funktion "Einblenden" sollen sie langsam eingefadet werden. Dazu in jeweils die setInterval-Zeile. Das erste Bild blendet er hübsch langsam ein. Doch bei jedem klick auf links oder rechts halbiert (?) sich die Einblend-Zeit, oder es geht zumindest immer schneller. Kann mir jemand sagen, warum?
Geändert von UKJoerg am 28.09.10 um 16:49 Uhr

 29.09.2010, 10:26Re1
Benutzerbild von vindelFlashhilfe.de Moderator
Beiträge: 2855
Wohnort: Köln
Registriert: Oct 2007

Ich vermute maal, es liegt daran, dass du jedes mal ein neues Interval setzt.
Schreib mal oben in dem Script das:
ActionScript:
1interval1 = setInterval(Einblenden, 50);


und dann in deiner Funktion "Einblenden":
ActionScript:
1clearInterval(interval1);

Dann müsste es klappen!
public Weltformel(Problem){
      if (Problem gelöst) return Lösung;
      else Weltformel(kleiners Problem);
}
 29.09.2010, 15:34Re2
Beiträge: 20
Registriert: Jun 2010

Themenautor/in

ok, es sieht jetzt so aus und funktioniert (ich hab die Einblendzeiten bissel verändert) :

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
var BilderGesamt:LoadVars = new LoadVars();
BilderGesamt.load("Pics/BilderGesamt.txt");

BilderGesamt.onLoad = function():Void {
      
       _global.bildcounter = 1;
         
       function Einblenden(){
       Bilder._alpha += 3;
      clearInterval(interval1);
       }
     
      interval1 = setInterval (Einblenden, 5);
      
       Bilder._alpha = 0;
       Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
       setInterval (Einblenden, 5);
   
       rechts.onRelease = function(){
          if(_global.bildcounter != BilderGesamt.Anzahl){
             _global.bildcounter += 1;
            Bilder._alpha = 0
             Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
            interval1();
          }
          else {
             _global.bildcounter = 1;
            Bilder._alpha = 0
             Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
            interval1();
          }
       }
      
       links.onRelease = function(){
          if(_global.bildcounter != 1){
             _global.bildcounter -= 1;
             Bilder._alpha = 0
             Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
             interval1();
          }
          else {
             _global.bildcounter = BilderGesamt.Anzahl;
             Bilder._alpha = 0
             Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
             interval1();
          }
       }
}


Leider verstehe ich es nicht ganz. Also ich vermute mal, mein ursprüngliches Problem hängt damit zusammen, dass das Interval einfach im Hintergrund weiterläuft, auch wenn der Alpha-Wert 100 schon erreicht ist, richtig? Aber nach welchem Schritt bricht denn clearInterval das Ganze ab?

Komisch ist nämlich, dass die ganze Geschichte nicht funktioniert, wenn ich nach Zeile 17 noch ein clearInterval einfüge oder auch hier interval1() aufrufe. Da bleibt er bei (schätzungsweise) alpha=3 stehen.
 
nicht sichtbar bei eingeloggten Mitgliedern1&1 Webhosting
 29.09.2010, 19:39Re3
Benutzerbild von vindelFlashhilfe.de Moderator
Beiträge: 2855
Wohnort: Köln
Registriert: Oct 2007

Also du musst überall den gleichen Interval-namen nutzen, wo du ein interval setzt, da ja alle die gleiche Funktionen ansprechen.
In der Funktion "Einblenden" (warum sitzt die eg in der onLoad-Funktion - das ist eg nciht zulässig funktionen ineinander zu verschachteln) musst du dann das Interval natürlich erst löschen, wenn dein Alpha-wert bei 100 angekommen ist.
also:
ActionScript:
1
2
3
4
5
6
function Einblenden(){
  Bilder._alpha += 3;
  if(Bilder._alpha >= 100) {
    clearInterval(interval1);
  }
         }
public Weltformel(Problem){
      if (Problem gelöst) return Lösung;
      else Weltformel(kleiners Problem);
}
 03.10.2010, 22:25Re4
Beiträge: 20
Registriert: Jun 2010

Themenautor/in

Arrrgh! Ich dreh noch durch hier!

Ich versuche seit Tagen wenigstens nachzuvollziehen, was er macht. Ich schau mir beispielsweise im Debugger den Wert von alpha an. Ich habe die Zeit in dem Intervall so verlangsamt, dass ich jeden einzelnen Schritt sehe. So ändert sich der Wert von alpha im ersten Schritt von 0 auf 2,73... undzerquetschte. Das sind nie ganze Zahlen. Wieso denn das?
Dann hab ich versucht, mit clearInterval zu arbeiten (Auch Deine Variante). Egal an welche Stelle ich das geschrieben habe und wie ich den Code angepasst habe, entweder der alpha-Wert wird nicht weiter erhöht, bleibt also bei 0 stehen oder er rennt über 100 hinaus und immer weiter. Ich kapier´s nicht.
Ich hab jetzt folgende Version, die is mit dem Ausgangscode fast identisch:

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
var BilderGesamt:LoadVars = new LoadVars();
BilderGesamt.load("Pics/BilderGesamt.txt");

BilderGesamt.onLoad = function(){
 
     _global.bildcounter = 1;
 
     function Einblenden(){
        Bilder._alpha += 3;
        }
 
     Bilder._alpha = 0;
     Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
     
     interval1 = setInterval(Einblenden, 5);
     
     rechts.onRelease = function(){
        if (_global.bildcounter != BilderGesamt.Anzahl){
           _global.bildcounter += 1;
           Bilder._alpha = 0;
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
           interval1();
        }
        else{
           _global.bildcounter = 1;
           Bilder._alpha = 0;
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
           interval1();
        }
     };
     
     links.onRelease = function(){
        if (_global.bildcounter != 1){
           _global.bildcounter -= 1;
           Bilder._alpha = 0;
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
           interval1();
        }
        else{
           _global.bildcounter = BilderGesamt.Anzahl;
           Bilder._alpha = 0;
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
           interval1();
        }
     };
};


So funktioniert es erst einmal, allerdings läuft der alpha-Wert über 100 hinaus bis man auf "rechts" klickt. Ist das schlimm, oder kann man das so lassen?
Ich glaube, in der ersten Version, die ich gepostet habe, überlagerte sich das Intervall in Zeile 14 des Ausgangscodes mit den Intervallen, die bei if bzw. else ausgelöst wurden.

Und um die Frage zu beantworten: Die ganzen Befehle sitzen in der onLoad-Funktion, da das sonst mit diesen ganzen LoadVars-Geschichten nicht hingehauen hat. Ich hatte die Vorlage hier aus dem Forum http://www.flashhilfe.de/forum/sonstige-flash-themen/bilder-extern-laden-ohne-php-232962-232962.html
 04.10.2010, 19:06Re5
Benutzerbild von vindelFlashhilfe.de Moderator
Beiträge: 2855
Wohnort: Köln
Registriert: Oct 2007

Mhh...

Das er das nicht mit glatten Zahlen amcht, irritiert mich jetzt auch, aber das ist ja nicht das Problem!

Mit der Funktion hast du dich dann wohl an das falsche Thema gehalten. Schreib Funktionen IMMER einzelnd - die in andere, wie in deinem Fall die onLoad.
Hab deinen Code mal so geändert wie ich meinte - konnte es natürlich nur bedingt testen, da ich keine Testelemente/mc etc hatte, aber so funktioniert 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
var BilderGesamt:LoadVars = new LoadVars();
BilderGesamt.load("Pics/BilderGesamt.txt");

BilderGesamt.onLoad = function():Void  {
 
      _global.bildcounter = 1;
 
      Bilder.loadMovie("Pics/"+_global.bildcounter+".jpg");
      Bilder._alpha = 0;
      var interval1 = setInterval(Einblenden, 50);
 
      rechts.onRelease = function() {
          if (_global.bildcounter != BilderGesamt.Anzahl) {
              _global.bildcounter += 1;
              Bilder._alpha = 0;
              Bilder.loadMovie("Pics/"+_global.bildcounter+".jpg");
              var interval1 = setInterval(Einblenden, 50);
          } else {
              _global.bildcounter = 1;
              Bilder._alpha = 0;
              Bilder.loadMovie("Pics/"+_global.bildcounter+".jpg");
              var interval1 = setInterval(Einblenden, 50);
          }
      };
      links.onRelease = function() {
          if (_global.bildcounter != 1) {
              _global.bildcounter -= 1;
              Bilder._alpha = 0;
              Bilder.loadMovie("Pics/"+_global.bildcounter+".jpg");
              var interval1 = setInterval(Einblenden, 50);
          } else {
              _global.bildcounter = BilderGesamt.Anzahl;
              Bilder._alpha = 0;
              Bilder.loadMovie("Pics/"+_global.bildcounter+".jpg");
              var interval1 = setInterval(Einblenden, 50);
          }
      };
};

function Einblenden() {
      Bilder._alpha += 2;
      if (Bilder._alpha>=100) {
          clearInterval(interval1);
          Bilder._alpha = 100;
      }
      trace(Bilder._alpha);
}
public Weltformel(Problem){
      if (Problem gelöst) return Lösung;
      else Weltformel(kleiners Problem);
}
 
nicht sichtbar bei eingeloggten Mitgliedern
 05.10.2010, 00:04Re6
Beiträge: 20
Registriert: Jun 2010

Themenautor/in

Ich hab mal Deinen Code probiert, da is wieder das ursprüngliche Problem, dass sich die Einblend-Zeit immer geringer wird.
Also hab ich meinen Code gelassen und nur wie Du die Einblenden-Funktion aus der onLoad rausgenommen. Wenn ich clearInterval deaktiviere, funktioniert alles, nur der alpha-Wert erhöht sich die ganze Zeit. Sobald ich clearInterval aktiviere, bleibt das 2. Bild bei alpha=0 stehen. Warum auch immer. Was passiert denn, wenn alpha immer weiter erhöht wird? Sonst lass ich das halt so...

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
var BilderGesamt:LoadVars = new LoadVars();
BilderGesamt.load("Pics/BilderGesamt.txt");

function Einblenden(){
        Bilder._alpha += 3;
        /*if (Bilder._alpha>=100) {       
               clearInterval(interval1);
               Bilder._alpha = 100;
              }*/

        trace (Bilder._alpha);
}

BilderGesamt.onLoad = function(){
 
     _global.bildcounter = 1;
 
     Bilder._alpha = 0;
     Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
     
     interval1 = setInterval(Einblenden, 5);
     
     rechts.onRelease = function(){
        if (_global.bildcounter != BilderGesamt.Anzahl){
           _global.bildcounter += 1;
           Bilder._alpha = 0;
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
           interval1();
        }
        else{
           _global.bildcounter = 1;
           Bilder._alpha = 0;
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
           interval1();
        }
     };
     
     links.onRelease = function(){
        if (_global.bildcounter != 1){
           _global.bildcounter -= 1;
           Bilder._alpha = 0;
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
           interval1();
        }
        else{
           _global.bildcounter = BilderGesamt.Anzahl;
           Bilder._alpha = 0;
           Bilder.loadMovie("Pics/" + _global.bildcounter + ".jpg");
           interval1();
        }
     };
};
Geändert von UKJoerg am 05.10.10 um 00:05 Uhr

 05.10.2010, 00:26Re7
Beiträge: 20
Registriert: Jun 2010

Themenautor/in

Ha, mir is was aufgefallen: Dein Code funktioniert, wenn man langsam auf rechts bzw. links klickt. Sobald man schnell hintereinander klickt (und das hatte ich zum Testen immer getan) nimmt er das wahrscheinlich als Doppelklick und weist dem mc den alpha-Wert 100 zu, und zwar immer wieder (jedenfalls wird die Liste der getracten alpha-Werte immer länger). 

Wie kann ich ihm sagen, dass der Doppelklick kein Doppelklick ist, sondern zwei einzelne Klicks?
 06.10.2010, 10:13Re8
Benutzerbild von vindelFlashhilfe.de Moderator
Beiträge: 2855
Wohnort: Köln
Registriert: Oct 2007

ok, dass hatte ich vergessen - du musst jeweils ein clear-Interval an den Anfang der Buttons schreiben - sodass es kein aktives Interval gibt, wenn ein neues gesetzt wird.
ActionScript:
1
2
3
4
links.onRelease = function(){
  clearInterval(interval1);
          if (_global.bildcounter != 1){
  [...]
public Weltformel(Problem){
      if (Problem gelöst) return Lösung;
      else Weltformel(kleiners Problem);
}
 06.10.2010, 13:28Re9
Beiträge: 20
Registriert: Jun 2010

Themenautor/in

Juhu,

es läuft. Alles perfekt, vielen Dank.
 
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