|
You last visited: Today at 22:35
Advertisement
[JS] OOP - Rekursiver aufruf mit "setTimeout"?
Discussion on [JS] OOP - Rekursiver aufruf mit "setTimeout"? within the Web Development forum part of the Coders Den category.
08/31/2013, 22:17
|
#1
|
elite*gold: 8
Join Date: Apr 2009
Posts: 2,977
Received Thanks: 855
|
[JS] OOP - Rekursiver aufruf mit "setTimeout"?
Hallo liebe Community,
ich bräuchte eine Möglichkeit, damit sich die Methode eines Objekts rekursiv aufrufen kann.
Bisher habe ich es so versucht:
Code:
setTimeout("this.move('down', 0)", 5);
oder (player ist die Klasse):
Code:
setTimeout("player.move('down', 0)", 5);
funktionieren tut es so (player1 ist das Objekt):
Code:
setTimeout("player1.move('down', 0)", 5);
allerdings will ich es relativ Adressieren und nicht absolut, da ich nicht nur 1 Spieler / Objekt habe. Hat wer eine Idee wie ich das machen kann?
|
|
|
08/31/2013, 22:21
|
#2
|
elite*gold: 25
Join Date: Apr 2010
Posts: 1,009
Received Thanks: 316
|
Nunja, sich ne Variable bauen die das ganze steuert.
PHP Code:
var keepMoving = true; var move = function() { if(keepMoving) { move(); } };
|
|
|
08/31/2013, 22:29
|
#3
|
elite*gold: 8
Join Date: Apr 2009
Posts: 2,977
Received Thanks: 855
|
Quote:
Originally Posted by Synatex
Nunja, sich ne Variable bauen die das ganze steuert.
PHP Code:
var keepMoving = true; var move = function() { if(keepMoving) { move(); } };
|
Normalerweise wäre das eine Möglichkeit, allerdings glaube ich das dadurch keine flüssige Animation ensteht bzw sie zu schnell ausgeführt wird. Und mit einem Sleep Befehl würde sich ein anderer Teil des Skriptes verzögern was ich vermeiden möchte.
|
|
|
08/31/2013, 23:16
|
#4
|
elite*gold: 25
Join Date: Apr 2010
Posts: 1,009
Received Thanks: 316
|
PHP Code:
var keepMoving = true;
var move = function() { if(keepMoving) { // Verzögerung um 0,5 Sekunden setTimeout(function() { move(); }, 500); } };
Ist ja wohl nicht wirklich schwer die da reinzubauen^^
|
|
|
08/31/2013, 23:19
|
#5
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
"Sleep" gibt es in Javascript nicht. Du kannst nur asynchron programmieren.
Ja, das würde zu schnell ausgeführt - es führte (in der ersten Form) zu einem Stapelüberlauf, da es in Javascript kein gleichzeitiges Ausführen gibt: alle Funktionen und Rückrufe werden schön nacheinander ausgeführt.
Möglich ist es aber so (mit setInterval):
Code:
function Player (x, y, speed) {
this.x = x;
this.y = y;
this.speed = speed;
}
Player.prototype.move = function (x, y) {
if (x != this.x && y != this.y) {
var dx = x - this.x;
var dy = y - this.y;
var distance = Math.sqrt (dx * dx + dy * dy);
if (distance <= this.speed) {
this.x = x;
this.y = y;
clearInterval (this.interval);
delete this.interval;
} else {
this.x += this.speed * dx / distance;
this.y += this.speed * dy / distance;
}
if (this.move_callback)
this.move_callback (this);
} else {
clearInterval (this.interval);
delete this.interval;
}
};
Player.prototype.moveTo = function (x, y) {
this.interval = setInterval (this.move.bind (this), 300 /*ms*/, x, y);
};
Player.prototype.onMoved = function (callback) {
this.move_callback = callback;
};
var player = new Player (0, 0, 1);
player.onMoved (function (player) {
console.log (new Date ().toGMTString () + " - player moved to (" + player.x + "," + player.y + ")");
});
player.moveTo (10, -5);
Es könnte auch setTimeout statt setInterval verwendet werden, dann müsste entsprechend in move erneut setTimeout aufgerufen werden, wie Synatex schrieb.
|
|
|
09/01/2013, 00:22
|
#6
|
elite*gold: 1329
Join Date: Jun 2009
Posts: 1,873
Received Thanks: 960
|
Ein sleep zu programmieren ist aber wirklich nicht schwer.
Einfach aktuelle Zeit in ne Variable und in ner while Schleife gegen die aktuelle Zeit testen, bis die aktuelle Zeit größer oder gleich der gespeicherten Zeit plus der time2wait ist.
Aber nur, falls dir der sequentielle Ansatz lieber ist.
|
|
|
09/01/2013, 00:42
|
#7
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
Wem es Spaß macht, die Oberfläche einzufrieren, kann das gerne tun (sofern es im Kontext einer Seite ausgeführt wird, wie es normalerweise der Fall ist). In Javascript gibt es kaum eine synchrone Operation, nur new XMLHttpRequest ().open ("GET", url, false), alert und ein paar andere Funktionen (welche aus genau diesem Grund nicht genutzt werden sollten), sowie eine synchrone API für IndexedDB und FileSystem - aber diese beiden nur in einem WorkerGlobalScope (Thread oder Prozess). Für WebSockets etwa gibt es keine synchrone API (auch in einem WorkerGlobalScope), weil es dabei durchaus mehrere Sekunden bis zu einer Antwort brauchen kann, im Gegensatz zu einigen Millisekunden.
|
|
|
09/01/2013, 03:35
|
#8
|
elite*gold: 1329
Join Date: Jun 2009
Posts: 1,873
Received Thanks: 960
|
wenn er nur eine Verzögerung im Millisekundenbereich braucht, dann wäre diese Lösung durchaus nutzbar. Bzw. es kommt auch darauf an, wie der Rest programmiert ist...
Ich selbst habe noch nie einen solchen Sleep benötigt, kenn also die genauen Auswirkungen nicht.
|
|
|
09/01/2013, 09:40
|
#9
|
elite*gold: 8
Join Date: Apr 2009
Posts: 2,977
Received Thanks: 855
|
Habe in einem anderen Forum die Lösung erhalten. Funktioniert indem ich eine Referenz angebe.
|
|
|
09/01/2013, 12:34
|
#10
|
elite*gold: 0
Join Date: Apr 2005
Posts: 323
Received Thanks: 114
|
Du solltest ebenfalls die Lösung posten.
|
|
|
Similar Threads
|
[AUFRUF] An alle, die von "[Aimee]", "Blck-Sellerx" & ".Ava" betrogen worden sind!
03/23/2010 - Last Chaos - 34 Replies
Hallo libe ehrlichen Member von e*PvPers!
Im LastChaos und Metin Bereich im TBM Forum soll ".Ava" mehrere Leute abgezogen haben. Nun kommen aber plötzlich Gegenstimmen in der iTrader Bewertung die positiv ausfallen von "Black-SellerX" und "" bei genauerem Hinsehen bemerkt man, dass diese 3 Forenuser sich gegenseitig immer wieder positiv bewerten, dennnoch werden diese von vielen Usern negativ bewertet. Von "" wurde ich selber betrogen, daher mein Interesse.
Deshalb vermute ich, dass hinter...
|
All times are GMT +2. The time now is 22:35.
|
|