Ansatz für Sleep-Funktion?

wo0zy

Erfahrenes Mitglied
Hallo,

ich bin in Sachen Flash und Actionscript noch ein ziemlicher Anfänger, aber jeder hat ja mal angefangen! ;)

Zu meiner Frage:

Ich habe nach einer sleep() Funktion gesucht und leider feststellen müssen dass es so etwas nicht gibt.
Da hab ich mir überlegt wie man so eine Funktion selber auf die Beine stellen könnte, naja und unten sehr ihr das Resultat.
Code:
_global.sleep = function (x) {
	var zeit1, zeit2, tmp;
	
	zeit = new Date();
	 zeit1 = zeit.getSeconds();
	 tmp = zeit1 + x;
	 zeit2 = zeit.getSeconds();
	
	 while (tmp > zeit2){
		zeit2 = zeit.getSeconds();
	 }
}
Ich dachte mir, ich frage einfach so lange die Zeit ab, bis eine bestimmte Zeit(die der Funktion übergeben wird) verstrichen ist. Doch leider stürzt das ganze beim ausführen immer ab, allerdings weiß ich auch nicht so recht, ob ich die Funktion mit _global.sleep(30) auch richtig aufrufe. Macht man das so, oder muss das _global weg?

Wäre schön wenn mir da jemand helfen könnte!
 
Zuletzt bearbeitet:
Hi,

was genau soll passieren? Sollen wärend des Schlafens alle laufenden Clips angehalten werden? Ich würde eine Funktion sleep() schreiben, die alle relevanten Clips anhält (können in einem Array liegen), und mittels einer onEnterFrame-Methode nach Verstreichen der nötigen Zeit wieder abspielt:
PHP:
function sleep(s_time, s_clips_array) {
    for (var i=0; i<s_clips_array.length; i++) {
        this[s_clips_array[i]].stop();
    }
    var c_time = getTimer();
    this.onEnterFrame = function() {
        if (getTimer() - c_time > s_time) {
            for (var i=0; i<=s_clips_array.length; i++) {
                this[s_clips_array[i]].play();
            }
        delete this.onEnterFrame;
    }
}
Sind anzuhaltende MovieClips verschachtelt, so könnte in allen relevanten Clips entsprechende go()- und hold()-Methoden nach unten gereicht werden, die jene Clips anhalten bzw. wieder abspielen.

Gruß

P.S.: obwohl sich Deine Version komplett in einem Frame abspielt (was die Ursache für die Abstürze sein könnte), mag das funktionieren (nicht ausprobiert). Aber ich würde auf jeden Fall getTimer() statt den Sekunden eines Date()-Objektes verwenden, da diese ja mit jeder neuen Minute wieder auf Null gesetzt werden.
.
 
Ich möchte eigentlich nur ein Fenster machen in das nach einer bestimmten Zeit immer ein neues Foto eingeblendet wird, und dafür brauche ich eine sleep Funktion, und so wie ich mir das alles im Moment vorstelle, brauche ich auch nur einen Frame...aber ich werde deine Variante morgen auf alle Fälle mal ausprobieren.

Danke!
 
Hi,

onEnterFrame benötigt auch nur einen Frame, da auch wenn nur ein Frame existiert, Flash diese Methode periodisch mit der Framerate aufruft.

In Deinem Fall würde ich Dir allerdings zu der Funktion setInterval() raten, die eine bestimmte Funktion periodisch aufruft. Beispiel:
PHP:
var images = new Array("bild1.jpg", "ich.jpg", "bla.jpg", "nada.jpg");

var current = 0;

var iv = setInterval(function() { nextImage(); }, 2000); // 2000 ist die Anzahl der Milisekunden

function nextImage() {
    container.loadMovie(images[current]);
    current ++;
    if (current >= images.length) current = 0;
}

Gruß

.
 
Hallo,
ich habe das Ganze nun nochmal ausprobiert und ein bisschen bearbeitet, doch ich hab leider noch ein kleines Problem bei dem ich nicht weiter komme.
In der Funktion NextImage werden die MCs erstellt, eingeblendet und gelöscht, das ist ja auch alles in Ordnung. NextImage wird durch setInterval aufgerufen, doch nun zu dem Punkt bei dem ich hänge.
Nextimage wird nur so lange korrekt aufgerufen bis das letzte Bild(Bild8) aufgerufen wird. Danach passiert erstmal nichts und nach ner Weile wird dann plötzlich Bild4 eingeblendet, welches dann wieder von Bild8 abgelöst wird. Das geht dann immer munter so weiter.
Was muss ich tun, damit sozusagen NextImage zur endlosschleife wird?

Hier mal mein ActionScript
Code:
function fade_in(mc) { 
    if (_root[mc]._alpha<=100) { 
        _root[mc]._alpha++; 
    } 
} 

var ebene=1;
var current = 1; 
var images = new Array("bild1.jpg", "bild2.jpg", "bild3.jpg", "bild4.jpg", "bild5.jpg", "bild6.jpg", "bild7.jpg", "bild8.jpg"); 

function nextImage() { 
	createEmptyMovieClip("mc"+[current], ebene);
	_root["mc"+[current]]._alpha = 0;
	_root["mc"+[current]].loadMovie(images[current]);
	setInterval(fade_in, 5, "mc"+[current]);
    current ++; 
	ebene++;
    if (current >= images.length) current = 0;
} 

setInterval( nextImage, 5000);
Ich hoffe ihr könnt mir helfen.

MfG
 
Hi,

in meinem Beispiel sorgt diese Zeile
PHP:
if (current >= images.length) current = 0;
dafür, dass nach dem letzten Bild wieder das erste verarbeitet wird. Willst Du nach dem letzten Bild anhalten, kannst Du den Intervalaufruf mit clearInterval() beenden:
PHP:
if (current >= images.length) clearInterval(IV);
Damit Flash weiß, welches Interval zu löschen ist, wird beim ersten Aufruf ein Intervalhandler gespeichert:
PHP:
var IV = setInterval(nextImage, 5000)
In meinem ersten Posting habe ich das Interval auch gespeichert, allerdings nicht verwendet. ;)

Gruß

P.S.: Du könntest übrigens Probleme bekommen, wenn Du für die Methode fade_in() keinen Handler vergibst - da diese Funktion ja nur für jeweils ein Bild aktiv sein muss, kannst Du immer den selben Handler verwenden; beim nächsten Bild wird er überschrieben. Dennoch ist es sinnvoll, auch dieses Intervall zu löschen, sobald das Bild die maximale Opazität erreicht hat:
PHP:
if (_root[mc]._alpha<=100) { 
    _root[mc]._alpha++; 
} else {
    clearInterval(IV2);
}
.
 
Zuletzt bearbeitet:
Hi,
PHP:
if (current >= images.length) current = 0;
Das hab ich ja auch drin, nur geht es leider trotzdem nicht.
Das Ding ist ja das alle Bilder einmal gezeigt werden, aber danach ist Schluss, egal wieviele Bilder es sind. Entweder setInterval hört auch zu arbeiten oder current wird nicht auf 0 gesetzt.

MfG
Mathias
 
Das hab ich ja auch drin, nur geht es leider trotzdem nicht.
- genau das meinte ich damit: Du hast das drin, aber Du solltest es durch jene andere Zeile erstetzen. Vielleicht habe ich mich unklar ausgedrückt; die Funktion soll doch genau achtmal aufgerufen werden, und jeweils eines der Bilder einblenden, oder? Damit nach dem achten Bild Schluss ist, ersetze "current = 0;" durch "clearInterval(IV);" und speichere den Rückgabewert von setInterval in der Variable IV.

Gruß
.
 
Ich hätte es gern genau andersrum, ich möchte das es immer und immer wieder ausgeführt wird, doch das klappt so leider nicht.
Gibt es in Flash irgendeine möglichkeit mit ner art Debugger zu schauen was gerade passiert?

MfG
Mathias
 
Ahhh... langsam verstehe ich, was Du meinst.

Nun, Du legst immer wieder einen neuen Clip an (ebene), daher werden unendlich neue Clips erstellt. Verzichte auf die Variable "ebene", und verwende statt dessen die Laufvariable "current", um die Stufe für die neuen Clips festzulegen. Damit schon existierende Clips nicht noch einmal angelegt werden, sondern einfach in den Vordergrund gebracht werden, kannst Du eine kleine Abfrage einbauen und den jeweiligen Clip ggf. mit getNextHighestDepth in den Vordergrund bringen:
PHP:
var current = 0; 
var images = new Array("bild1.jpg", "bild2.jpg", "bild3.jpg", "bild4.jpg", "bild5.jpg", "bild6.jpg", "bild7.jpg", "bild8.jpg"); 

function nextImage() { 
    trace("IMAGE: " + current);
    if (_root["mc" + current] == undefined) {
        createEmptyMovieClip("mc" + current, current);
       _root["mc" + current].loadMovie(images[current]);
    } else {
        _root["mc" + current].swapDepths(_root.getNextHighestDepth());
    }
    _root["mc" + current]._alpha = 0;
    setInterval(fade_in, 5, "mc" + current);
    current ++; 
    if (current >= images.length) current = 0;
}

Gruß

P.S.: Bedenke, dass es "online" etwas dauern kann, bis die ersten Bilder geladen sind - Du wirst also ggf. noch eine Erweiterung brauchen, um auf das onLoad-Ereignis zu warten (es sei denn, Du willst den Film lediglich lokal verwenden).
.
 
Zurück