mmofacts.com

Countdown - Gebäudebau etc.

gepostet vor 18 Jahre, 11 Monate von Kelturio
Hallo,

und zwar habe ich vor knapp 2 Wochen angefangen PHP zu lernen und habe mittlerweile ein paar Tutorials durch. Da ich HTML und MySQL schon in der Schule gelernt habe, habe ich nun damit angefangen mir ein erstes Browsergame zu erstellen.
Mein Loginscript, sowie das Registrierungsscript funktionieren auch alle wie gewünscht.
Jetzt habe ich wie bei den meisten BGs ein paar Gebäude erstellt, die man ausbauen können soll.

Nun besteht aber das Problem, dass ich es einfach nicht hinbekomme, dass eine Zeit abläuft, wenn man auf den Link bzw. den Button "Ausbauen" geklickt hat. Wenn diese beginnt zu laufen, soll der Button sich in einen Button "Abbrechen" verwandeln, damit der User die Zeit abbrechen kann - ich denke ihr wisst, was ich meine. ^^

Meine Frage: Was muss ich machen, um so eine Zeit ablaufen zu lassen ?

Ich habe auch schon ein Javascript im Net gefunden dafür, aber das startet immer automatisch und hat den Nachteil, dass der Countdown nicht weiterläuft, wenn der User sich mal ausloggen will.
gepostet vor 18 Jahre, 11 Monate von friedenspanzer
Speicher die Zeit, zu der das Gebäude endet (am einfachsten find ich es als timestamp) in der DB und ruf es immer wieder ab. Dann kannst du per Javascript einen Timer einbauen der bis zu diesem Zeitpunkt runterzählt. Da ich JS selbst nicht gut kann überlass ich den Code den anderen

Das mit dem "Abbrechen"-Button ist relativ leicht gelöst. Schreib dir einen Funktion/Baus in eine Klasse ein/mach sonstwas der/die/das überprüft ob ein Gebäude im Bau ist (Also ob der Timestamp der Endzeit>time()). Der Code sieht (am Beispiel von meinem System) in etwa so aus:

 

if ($insel->_buildInProgress)
echo 'Bauen';
else
echo 'Abbrechen'
gepostet vor 18 Jahre, 11 Monate von Kelturio
Vielen Dank für die Erklärung.

Ich habe auch gleich mal nach der timestamp Methode oder so gegoogelt, aber leider habe ich nur sowas hier gefunden:

 

echo date("l dS of F Y h:i:s A");


Nehmen wir an es ist 20.00 Uhr und das Gebäude dauert 2 Minuten. Wie speicher ich da die 20.02 Uhr als fertige Zeit in der DB ab ?
gepostet vor 18 Jahre, 11 Monate von Kallisti
mysql_query("UPDATE user SET buildtime = UNIX_TIMESTAMP() + ".$bauzeitinsekunden." WHERE id = ".$_SESSION['user_id']);

oder:
mysql_query("UPDATE user SET buildtime = ".(time() + $bauzeitinsekunden)." WHERE id = ".$_SESSION['user_id']);

bzw.

$bauzeit = time() + $gebaeudebauzeit;
mysql_query("UPDATE user SET buildtime = ".$bauzeit." WHERE id = ".$_SESSION['user_id']);

.... -> TIMTOWTDI
gepostet vor 18 Jahre, 11 Monate von Kelturio
Wow, das ich so eine genau Antwort bekomme hätte ich nicht gedacht und weiß es echt zu schätzen.
Ich werde mich morgen bzw. heute ^^ gleich mal hinsetzen und es dann testen.


Edit:
Was heißt eigentlich TIMTOWTDI ? Das habe ich ja noch nie gelesen. o.O
gepostet vor 18 Jahre, 11 Monate von Kallisti
there is more than one way to do it
gepostet vor 18 Jahre, 11 Monate von Chojin
Ich mag es lieber wenn die zeit der fertigstellung "humanreadable" ist...(DATETIME feldtyp nach ISO 8601 von 198

mysql_query("UPDATE user

SET bau_fertig_time = DATE_ADD( NOW( ) , INTERVAL '".$bauzeitinsekunden."' SECOND )
WHERE id = ".$_SESSION['user_id']);

Das query für die ausgabe von einem UTS für die javascript-verarbeitung ist dann:

mysql_query("SELECT UNIX_TIMESTAMP(bau_fertig_time) 

FROM user
WHERE id = ".$_SESSION['user_id']);
reg4rds
chojin
gepostet vor 18 Jahre, 11 Monate von KoMtuR
Da nun alle verschiedene Varianten vom Timestamp speichern geschrieben haben schreib ich mal den Counter dazu

Hoffe er geht, weil ich ihn nicht testen konnte:
 



Countdown


function countdown(end) {
timeend = new Date(end*1000); //Die Zeit wann Gebäude fertig ist
timenow = new Date(); //jetzt (lokale Zeit)

timediff = Math.floor((timeend.getTime() - timenow.getTime()) / 1000); //Anzahl der Sekunden, bis die Endzeit erreicht ist
if(timediff > 0) {
sekunden = timediff % 60;
timediff = Math.floor(timediff / 60);
minuten = timediff % 60;
timediff = Math.floor(timediff / 60);
stunden = timediff % 24;
timediff = Math.floor(timediff / 24);
tage = timediff;

document.getElementById('countdown').innerHTML = tage+"d "+stunden+"h "+minuten+"m "+sekunden+"s";
//document.getElementById('countdown').innerHTML = timediff;

setTimeout('countdown('+end+')', 1000);
} else {
document.getElementById('countdown').innerHTML = "Zeit erreicht.";
}
}



Noch solange wird gebaut:

var endtime = ; //hier den Timestamp für die Zeit eintragen, wann das Gebäude fertig ist
var servertime = new Date( * 1000);
var localtime = new Date();
//Ableich von Serverzeit und lokaler Zeit. Diese sind ja in den wenigstens Fällen wirklich gleich.
var local_server_t_diff = Math.floor((servertime.getTime() - localtime.getTime())/1000);
countdown(endtime - local_server_t_diff);



gepostet vor 18 Jahre, 11 Monate von Kelturio
Hmm, also es zeigt mir folgende Fehlermeldungen an mit deinem Script, KoMtuR.

Die erste lautet:
Syntaxfehler - Zeile 33 - Zeichen 18
-> Also direkt am Anfang von . Soll ich einfach durch eine beliebige Zahl ersetzen ?

Die zweite lautet:
Syntaxfehler - Zeile 34 - Zeichen 30
-> Also direkt vor dem .
Was soll ich hier genau verändern ?
gepostet vor 18 Jahre, 11 Monate von KoMtuR
Das ist eine php-Seite und muss auch so behandelt werden. Dies ist auch nur ein Codeschnipsel. Also du solltest dann schon die Zeiten aus der Datenbank herausladen und dann eben die entsprechende variabel da ersetzen.
gepostet vor 18 Jahre, 11 Monate von Kelturio
Hmm, ok. Also die Datei habe ich nun erst einmal im *.php Format abgespeichert.

Habe ich das jetzt richtig verstanden: Als erstes muss ich mir noch in meiner Tabelle in der DB die Zeile namens "end" erstellen, da diese die Variable bzw. der Parameter der Funktion Countdown ist, oder ?
Stufe 1 dauert bei Gebäude x dann z.b. 2 Minuten.
Wie soll ich diese 2 Minuten in die DB schreiben ? Als Sekunden ? Also dann 120 ?
gepostet vor 18 Jahre, 11 Monate von KoMtuR
Am besten du fängst erstmal unabhängig von deinem Spielprojekt mit einfachen Tutorials an, wenn du den Sinn des Ganzen noch nicht verstehst. Es bringt nichts auf Biegen und Brechen zu machen, weil man da eh nichts kapiert. Lieber ein schönes SQL-Tutorial und ausreichend php-tutorials pauken
gepostet vor 18 Jahre, 11 Monate von BuschnicK
Weil ich so einen Timer gerade selber brauche habe ich auch noch eine Version zum besten zu geben:

 









00:00:05

00:00:06

00:00:07

00:00:08

00:00:09






Verbesserungen natürlich gern genommen. Getestet habe ich kurz in IE und FireFox.

mfG,
Sören
gepostet vor 18 Jahre, 11 Monate von knalli
Lässt sich auch wunderbar in eine php-Funktion einbauen, mit einer allgemeinen javascript-Funktion.

Also nach dem Muster

printDynamicCountdown( UNIXTIMESTAMP ); 


Die Funktion macht dann nicht viel anderes, als ein Feld (span z.b.) mit dem Wert anzulegen, und einen javascript-timeout anzulegen, in bezug zu der allgemeinen javascript funktion.

Buschnick, diese "endlose" Schleife, funktioniert die wirklich? Gibts da keine Fehler? Da ist zwar eine Abbruchbedingung drin, aber irgendwie fühl ich mich bei sowas immer etwas unwohl...
gepostet vor 18 Jahre, 11 Monate von BuschnicK
Die funktioniert hervorragend, ja. Irgendwann liefert die GetElementById ja immer null zurück - unendlich viele Elemente in deinem Dokument wirst du schon nicht haben ;-) Das einzige Problem könnte sein, wenn man GetElementById immer mit demselben Namen aufruft, aber das tue ich ja nicht.

Das Math.abs in meinem Code ist ürbigens natürlich überflüssig an der Stelle. Das war nur noch drin, weil ich auch einen Timer habe, der nach Ablauf ins Negative weiterzählt.

Und ja, mit der allgemeinen PHP Funktion - genauso war das gedacht ;-)

mfG,
Sören
gepostet vor 18 Jahre, 11 Monate von Kelturio
Also ich denke jetzt, dass ich wirklich noch ein paar PHP und Java Tutorials durchstöbern sollte, denn ich habe in meinem Tutorial z.b. nix von Math.abs oder Math.floor oder expired etc. gelesen.

Ich habe versucht den Counter von BuschnicK mal zu nehmen und ihn meinen Wünschen anzupassen, was nich ganz gelungen ist.

Und zwar wollte ich auf einen Buttonklick den Timer erscheinen lassen (unter dem Button). Das ist mir auch gelungen, aber leider zählt der Timer dann nicht nach unten, da durch document.write, der Quelltext ja ersetzt wird und es somit keine Countdown Funktion mehr gibt.

Ich weiß nicht wie ich es sonst machen sollte.

Kennt ihr ein paar weitere gute Tutorials, bei denen ich die nötigen Grundlagen für einen Counter etc. erlesen kann ?

Dies war mein Quelltext:

 

















gepostet vor 18 Jahre, 11 Monate von BuschnicK
Also ich denke jetzt, dass ich wirklich noch ein paar PHP und Java Tutorials durchstöbern sollte, denn ich habe in meinem Tutorial z.b. nix von Math.abs oder Math.floor oder expired etc. gelesen.


Math.abs nimmt den absolut Wert einer Zahl.

Math.floor schneidet die Nachkommastellen einer Fliesskommazahl ab.

expired ist eine Variable, die ich angelegt habe. Die zählt einfach wie viele der Timer auf der Seite bereits abgelaufen sind. Wenn alle Timer abgelaufen sind schaltet sie den automatischen sekündlichen Aufruf der countDown Funktion aus - ist ja dann nicht mehr nötig.

Was den Rest deiner Frage angeht, geh hierhin:
de2.php.net/tut.php
und lerne ;-)

mfG,
Sören
gepostet vor 18 Jahre, 11 Monate von KoMtuR
Math.abs und Math.floor sind javaSCRIPT-Funktion. Ich hoffe du hast dich nur verschrieben und meintest, du willst die javascript-Tutorials anschauen. Das sind nämlich 2 paar schuhe
gepostet vor 18 Jahre, 11 Monate von knalli
Kurioserweise heißen die Java-Methoden aber nicht viel anders.. aber gleich mit Javaprogrammieren loszulegen, wäre dann doch etwas übers Ziel hinausgeschossen..
gepostet vor 18 Jahre, 11 Monate von KoMtuR
Das ist mir schon klar, dass die so heißen, aber der Code, der zu den Countdowns gepostet wurde hat im wenigswtens Fall was mit Java zu tun Das meinte ich damit
gepostet vor 18 Jahre, 11 Monate von Kelturio
Ok, vielen Dank. Ich werde gleich mit lernen beginnen. ^^
Aber nochmal zu meinem Quelltext oben:

Wie will man es mit dem Bsp sonst machen, damit die Zeit erst nach Buttonklick erscheint wie bei einem BG ?
Also das der nicht weiter zählt ist böd.
gepostet vor 18 Jahre, 11 Monate von Kelturio
Also das die Zeit nach dem Buttonklick erscheint, habe ich hinbekommen.
Meine Funktion wechselt dann zusätzlich noch den Wert Value des Buttons in Abbrechen.
Wenn man nun wieder auf den Button klickt, soll der Counter abbrechen.
Wie kann ich das realisieren, meine Funktion habe ich angefangen, aber ich komme nicht weiter - ich bitte um Vorschläge.

Hier der Quellcode:

 













onclick="javascript:CountDown(); this.form.Ausbauen1.value = 'Abbrechen'; javascript:Bauabbruch()">






gepostet vor 18 Jahre, 11 Monate von KoMtuR
Original von BuschnicK
Die funktioniert hervorragend, ja. Irgendwann liefert die GetElementById ja immer null zurück - unendlich viele Elemente in deinem Dokument wirst du schon nicht haben ;-) Das einzige Problem könnte sein, wenn man GetElementById immer mit demselben Namen aufruft, aber das tue ich ja nicht.

Das Math.abs in meinem Code ist ürbigens natürlich überflüssig an der Stelle. Das war nur noch drin, weil ich auch einen Timer habe, der nach Ablauf ins Negative weiterzählt.

Und ja, mit der allgemeinen PHP Funktion - genauso war das gedacht ;-)

mfG,
Sören


Ich hab mich mal ein wenig hingesetzt und konnte es einfach nicht hinnehmen, dass Javascript so eine Möglichkeit nicht zulässt, dass man Objekte mit mehreren IDs hat. Deswegen dachte ich mir, dass ich mir nen eigenen Identifier bastle. Herausgekommen ist dieses konstrukt hier:
 

document.getElementsByAttribute = function(attribute, value) {
var children = document.getElementsByTagName('*') || document.all;
var elements = new Array();

for (var i = 0; i < children.length; i++) {
var child = children[i];
if (value == child.getAttribute(attribute)) {
elements.push(child);
}
}

return elements;
}

Dies erweitert das "document"-Objekt mit einer neuen Funktion "getElementsByAttribute", welche als ersten Parameter den Attributesnamen will und als 2. den Wert des Attributes.

Hier mal ein Beispiel:
 


Dies ist ein Text

var node = document.getElementsByAttribute('jstimer', '10')[0];
alert(node.firstChild.nodeValue);




Somit kannste nun einen eigenen Identifier nutzen, ohne die Id-Sache zu verunstalten

Achja getestet im Firefox, Opera und IE hat ich noch keine Zeit, da ich dann erstmal windows starten müsste.

edit: Nochmal eine abgeänderte Version, wenn man nur testen will, ob ein Html-Tag nur das bestimmte Attribut hat, aber im wesentlichen der Wert nicht interressiert:
 

document.getElementsByAttribute = function(attribute) {
var children = document.getElementsByTagName('*') || document.all;
var elements = new Array();

for (var i = 0; i < children.length; i++) {
var child = children[i];
if (child.getAttributeNode(attribute) instanceof Object)
elements.push(child);
}
return elements;
}


Damit könnte man auch ein Attribut ohne Wert einem Tag zuweisen und es wird gefunden (Beispiel: Das "selected" beim Tag )

Auf diese Diskussion antworten