Browsergame: Tick-System, aber wie?

KGD92

Mitglied
Moin Jungs,
also ich programmiere gerade an einem Browsergame (ja ich weis es gibt schon tausende, aber ich habe eine neue Herausforderung gesucht und bei denen die es gibt, fehlt mir nach gewisser Zeit immer etwas :D). Nun hab ich heute meine DB Struktur erstellt und erste Funktionen implementiert. Nun möchte ich ein Tick-System schreiben, d.h. nach jedem Tick (in meinem Fall 10 Min) soll die Datenbank aktualisiert werden. Also jeder bekommt sein Geld, das er in dieser Zeit verdient hat gutgeschrieben usw. Aber wie lasse ich auf dem Server dieses Tick System permanent laufen, egal ob jmd eingeloggt ist oder nicht. Vll sehe ich auch den Wald vor lauter Bäumen nicht mehr, wäre euch aber sehr verbunden, wenn ihr mit helfen könntet :D

Grüße Kai
 
Du schreibst ein Skript, was deine Datenbank aktualisiert, wenn es ausgeführt wird. Dieses Skript musst du dann nur alle zehn Minuten mit einem Cronjob ausführen. Fertig. Aber normalerweise führt man das Aktualisieren immer dann durch, wenn der Nutzer auf seine Daten zugreift, da sonst die Datenbank zu sehr belastet wird.
 
Wie aber soll das Tick-System funktionieren, wenn der user nich eingeloggt ist?

Das war es, was er meinte.
Wenn ein User nicht eingeloggt ist, muss er auch nicht wissen, wieviel Geld er hat. :-)

Wenn er eingeloggt ist, könntest du bspw. ermitteln, wieviel Zeit seit seiner letzten Aktion verstrichen ist und ihm das Geld gutschreiben.
 
Okay, danke, ich werde mal schaun, ob ich das hinbekomme, oder ob mir da andere Programmteile über den Weg laufen, die vll ständig neue Infos brauchen :D

Grüße Kai
 
So jetzt bin ich auch schon auf das nächste Problem gestossen. Und zwar das bauen von Gebäuden. Sobald ein Spieler eine Gebäude baut, wir ein neues Objekt erzeugt. Dieses träg die Operation in die DB ein und macht die nötigen Berechnungen. Jetzt hätte ich gerne, dass das Objekt die Bauzeit abwartet und dann die Operation aus der DB löscht und das Gebäude auf die nächste Stufe hebt. Nun dachte ich da an den Sleep befehl. Allerdings geht die HTML an den Client ja erst zurück, nachdem die Zeit abgelaufen ist -> BLÖD ;). Nur wie bekomme ich es jetzt hin, das das Objekt erst sein HTML sendet, dann schläft und dann den Rest macht :confused:

Danke schon mal, Kai

PHP:
<?php

include "dbconnect.php";

$process = new process();

class process
{

var $id_player;
var $stage;
var $number;
var $id_building;
var $time_end;
var $time_start;

function process ()
{

	$this->id_player = 1; //TODO: Abfrage Cockie
	$this->id_building = $_POST['id'];
	$this->number = $_POST['no'];
	$this->getStage();
	$time_new = 10*/*multiplokator*/1*$this->stage*$this->number;
	$this->time_end = strtotime("+".$time_new." minutes"); 
	$this->time_start = time();
	echo "Baubeginn <br />";
	time_sleep_until($this->time_end);
	echo "Gebäude Fertigestellt";
}

function getStage ()
{
	$query = "SELECT stage_".$this->id_building." FROM user_building WHERE id=".$this->id_player." LIMIT 1";
	$result = mysql_query($query);
	$row = mysql_fetch_array($result);
	$this->stage = $row["stage_".$this->id_building];
}

function setProcess ()
{
	$query = "INSERT INTO user_processes (id,type,id_product,time_start,time_end) VALUES ('".$this->id_player."','1','".$this->id_building."','".$this->time_start."','".$this->time_end."')"; //ID=1 means it's a building
	$insert = mysql_query($query);
}

function completeProcess ()
{
	$query = "DELETE FROM user_processes WHERE id='id' AND time_start='time_start'"; //TODO Querie anpassen
}

}

?>
 
Ich habe schoneinmal just 4 fun ein Browsergame geschrieben...
Müsste aber den Code für den Timer suchen... Werde diesen Beitrag editieren, wenn ich ihn gefunden habe...
 
Danke, aber ich habe glaube ich eine lösung gefunden. Und zwar werden die Operationen wie gehabt in die DB eingetragen aber nur dann aktualisiert oder gelöscht, falls der User eine der betreffenden Seiten betrifft. Genaue Lösung werde ich später mal posten, falls es so klappt wie ich mir das vorstelle :D
 
@ Daniel0108: Wäre schön falls du, oder jmd anderes mir diese Funktion geben könnte, da sich meine Lösung als etwas umständlich herausgestellt hat. :(

Edit: hab jetzt versucht mit flush() den Content schonmal zu verschicken und dann das Objekt weiterlaufen zu lassen, aber die dinge die Geflusht werden sollen kommen auch erst an nachdem die Zeit abgelaufen ist. Irgendeine Idee?
 
Zuletzt bearbeitet:
Javascript!

Zähl die Zeit runter, wenns auf 0 ist, auf die gleiche Seite weiterleiten, die Berechnung wird dann vom PHP-Skript übernommen.

Das ist die Kurzversion, wenn du es nicht verstehst, erkläre ich es nacher ausführlicher.
 
Zurück