If, else, =>end?

Hallo Profis,
ich will eine Grafik über den Monitor laufen lassen, von 100,100 bis 400,400.
Dort soll der Spaß dann aufhören. Welcher Befehl macht das? (break hat nicht geklappt, end gibt es irgendwie nicht)

Was muß also statt der vielen??? in das Script?
x=400
y=400
soll es nicht sein.

Carlo

______________

<!–
var x1=300;
var y1=25;

function move_it() {
if (document.layers) { //Netscape
document.gif1.left=x1;
document.gif1.top= y1;
}
else { //Internet Explorer
document.all.gif1.style.left=x1;
document.all.gif1.style.top= y1;
}

if(y1 >= 400) {
???
}
else{

x1=x1+1;
y1=y1+2;
}

setTimeout(„move_it()“,20);
}

//–>

Hallo Carlo,
Den Befehl den du suchst heisst: return
Damit wird die Funktion beendet. Es ist auch möglich mit return einen Wert zurückzugeben z.B. return resultat
Zum Script
Du machst einen rekursiven Aufruf der Funktion move_it().
Dies nicht ganz ungefährlich. Eleganter wäre eine simple for-schleife. z.B.

function move_it() {
if (document.layers) { //Netscape
document.gif1.left=x1;
document.gif1.top= y1;
}
else { //Internet Explorer
document.all.gif1.style.left=x1;
document.all.gif1.style.top= y1;
}

for (; y1 >= 400; x1+=1, y1+=2)
setTimeout(„do_nothing“,20);
}

function do_nothing {
}

WAAAAAAAAA!!!

Sorry, aber wenn ich sowas lese kann ich erstmal nur schreien :o)
Erstmal zum klarstellen:

Der ursprüngliche Aufruf von Carlo ist NICHT Rekursiv!!!

Grund: Die Methode ruft sich nicht selbst auf, sondern teilt dem Timer mit, dass der den Aufruf in 20ms wiederholen soll. Der entscheidende Unterschied hierbei ist, das bei einer Rekursion eine Aufrufkette entsteht. Jeder Methodenaufruf wartet auf das Ergebnis des nachfolgenden Aufrufes, solange bis in der untersten Ebene ein Abbruchkriterium erfüllt ist. Das ist bei Carlos Version nicht der Fall.

Die simple for-Schleife ist FALSCH!!

Ziel ist es doch die Grafik zu bewegen und 20ms zu warten. Die angegebene for-Schleife kann das aber nicht leisten. Hier werden auf einen Rutsch beim Timer 150 Aufrufe registriert, die alle in 20ms stattfinden sollen. D.H. nach 20ms werden alle do_nothing()-Aufrufe ausgeführt. Das hat mit einer Animation dann nix mehr zu tun. Je nach Implementation des Timers könnte diese Version dann auch eine massive Nebenläufigkeit verursachen, in der alle 150 Methodenaufrufe parallel ausgeführt werden.

Carlo:
Dein Ansatz war richtig. Du brauchst nur den setTimeout mit in den if-Zweig aufnehmen, wo die Addition stattfindet, da du ansonsten die Methode endlos aufrufst.
Probleme KÖNNTE es noch mit den 20ms Wartezeit geben, da der Hardware-Timer eines PC (zumindest damals, als ich mich direkt mit dem Timer beschäftigt habe) eine Auflösung von nur ca. 25ms hatte. Wenn die Timer Implementation von JavaScript auf dem HW-Timer beruht können die 20ms nicht aufgelöst werden.

Generell ist bei solchen Timer-geschichten natürlich zu beachten, das die Ausführungszeit der Methode nicht länger dauern sollte, als die Zeit bis zum nächsten Aufruf, da sonst unerwünschte Nebenwirkungen auftreten können.

Gruß
Benky

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi,
Tut mir leid. Benky hat natürlich recht :frowning:
Die Lösung war wohl ein Schnellschuss. Werde das nächste Mal das Script ausprobieren, bevor ich es hier puliziere.

Gruss, Simon

vielen Dank für die Tips,
ich bin aber etwas zu neu in JavaScript…
Der setTimeoutBefehl gibt doch die Pausenlänge an, oder?
Wie kann ich jetzt der Funktion sagen, daß sie einfach aufhören soll zu rechnen?

so in etwa
if {x1>400}
do nothing() ?

setTimeout ist nicht zu vergleichen mit einer Warteschleife, also einer Pause im Programm! setTimeout stellt einen Wecker, der halt nicht klingelt sondern nach der angegebenen Zeit die ebenfalls angegebene Funktion aufruft.

function tuWas() {
// ich tu wirklich was :wink: !
}


setTimeout( tuWas, 1000 );
// berechne die Mandelbrotmenge

In diesem Beispiel wird (durch was auch immer) der Teil mit dem setTimeout ausgeführt. Es wird also der Wecker auf 1000ms gestellt und ihm mitgeteilt, dass er nach Ablauf der Zeit die Funktion tuWas aufrufen soll. !ABER! Das Programm bleibt dann nicht für 1000ms stehen, sondern fährt mit dem berechnen der Mandelbrotmenge fort! Sind die 1000ms um, dann wird die Berechnung zur Ausführung von tuWas unterbrochen.

In deinem ursprünglichen Problem hat die Funktion immer sich selbst vom Wecker aufrufen lassen, solange x400 wird durch das if der setTimeout ja nicht mehr aufgerufen und das Bild wird nicht mehr weiter bewegt.

Ich hab jetzt auf die Schnelle keinen Befehl gefunden, mit dem man eine echte Pause realisieren kann. Aber dafür kann man mit folgendem Code auch das setTimeout missbrauchen.

var nochwarten = true;

function fertig() { nochwarten = false; }

function pause(ms) {
nochwarten = true;
setTimeout( fertig, ms );
while( nochwarten );
}

Gruß
Benky