Browsergame: 2 Fragen <> Zeitverzögert und Koordinatensystem

String

Erfahrenes Mitglied
Hallo zusammen,

also ich entwickel gerade ein Browsergame und habe dazu zwei Fragen.

1) Wie löst ihr es am besten, dass ein User etwas bauen kann, was dann "Zeitverzögert" fertig wird. Also z.b. ein Gebäude bauen, welches dann 10 Minuten später fertig ist!?

Macht ihr einen extra DB eintrag "User, baut, Fertig-Timestamp" und prüft bei jedem Zeitenaufruf, ob fertig und wenn ja, DB-Eintrag für den User, dass er das Gebäude nun nutzen kann? Oder gehts auch unkomplizierter? :)

2) Ich habe ein Koordinatensystem von 0/0 bis 500/500.
Jeder User kann sich frei bewegen und seine "Zielkoordinaten" jeder Zeit ändern.
Ich hatte jetzt an ca. so etwas gedacht:

Tabelle User_Koordinaten:
UserID, start_x, start_y, ziel_x, ziel_y, startzeit, zielzeit

Jetzt könnte ich ja einfach errechnen, wann der User auf welcher Koordinate ist. Allerdings fehlt mir jetzt ein bisschen die Idee, wie ich herausfinden kann, welcher User bei wem in der "nähe" ist. Also wenn ein User eine Sichtweite von 5 "koordinaten" hat ginge das ja mit mysql:
"BETWEEN x-5..."

Aber daher die aktuellen Koordinaten ja nicht immer gespeichert werden können/werden, müsste ich erst ausrechnen, wo jeder User ist und dann prüfen ob er in der nähe ist. Auch ziemlich umständlich, aber irgendwie fällt mir nicht ein wie ich es hätte besser machen können.

Sollte ich lieber die MySQL-Tabelle anders aufbauen, gehe ich das ganze von anfang an falsch an ? Wie würdet ihr das Lösen?

Bin für jeden Vorschlag sehr Dankbar :)

string
 
Also zu ersten Frage:
Vielleicht ist es besser, wenn du diese DB mit einer anderen DB (die vorhandenen Gebäude) zusammenführst, z.B so:
Code:
User | Gebäude
Un in "Gebäude" packst du einen serialisiertes Array von PHP, indem alle Zeiten drin stehen, Namen der Gebäude...

Und bei jedem Seitenaufruf kontrollierst du, ob der User Gebäude x hat
 
Vielen Dank für die schnelle Antwort.
Aber wäre das im Prinzip nicht das gleiche?

Und hat jemand eine Idee zu meiner zweiten Frage..!?
 
Naja, bei meiner Version brauchst du keine zwei Tabellen.

Zu deiner zweiten Frage ist mir folgendes eingefallen (eher eine Frage):

Wieso kannst du nicht immer die Koordinaten speichern?

PS: In deiner Signatur steht busaku.de, ist das dein Browsergame?
 
Du müsstest die Koordinaten immer in der DB speichern, sonst weißt du auch nicht welche Spieler in der Nähe sind ;)
 
Ich würde ehrlich gesagt eine extra Tabelle benutzen.
Das gibt dir mehrere Möglichkeiten an die Hand:
a) du kannst dem Benutzer eine Bauhistorie an die Hand geben (wann er was gebaut hat)
b) du kannst speichern wieviel er für das Gebäude bezahlt hat und bei Bauabbruch etwas zurückerstatten o. ä.
c) Die Tabelle ist jederzeit erweiterbar, während das nachträgliche Umziehen auf eine zweite Tabelle eine erhebliche Änderung in der Programmlogik bedeutet

Meine Wahl wäre:
buildId int auto_increment
userId int Fremdschlüssel auf User Tabelle
building int Fremdschlüssel auf Gebäude Tabelle
start Timestamp des Baustarts
finished Timestamp wann es aufhört


Ich würde den Anfang und das Ende der Bauzeit getrennt sondern, weil es ja eventuell später Fälle geben könnte, in denen sich die Bauzeit verlängert (bei einem Angriff oder sonstigen Zuständen) oder auch verkürzt (durch den Einsatz besonderer Items, o. ä.).
 
Hi,

viele Dank nochmals für die ganzen Antworten.
Also ich werd dass dann wohl mit der Lösung der zweiten Tabelle nehmen. Mit der Bau-History ist ne coole sache und werde ich dem Benutzer wohl ermöglichen :)

Ja, busaku.de ist mein Browsergame ;) - Wird von mir Programmiert. Grafiker und Ideenbringer sind nochn paar Kollegen von mir :)

Aber das mit den Koordinaten wird wohl noch ein Problem werden.
Der User kann z.b. einfach sagen "fahre dort und dort hin" und auch wenn der User off ist soll er sich "bewegen" - deshalb kann ich nicht immer speichern wo er gerade "Live" ist. Und auch wenn er online ist, hat er mehrere Figuren (in meinem Fall Schiffe) die er "steuern" darf.
Habt ihr da nochn paar coole Ideen? :)

string
 
Hab immernoch keine Idee zu den Koordinaten.
Kann da keiner Helfen?
Irgendjemand muss sowas doch schonmal gelöst haben oder? :)

paD
 
Du kannst doch berechnen wo sicher der Nutzer nach t Sekunden befindet und dann updaten, wenn ein anderer Spieler ihn "sieht".
 
Du könntest den Move eines Spielers mit einer vorgegebenen Taktung auch vor berechnen. Nehmen wir an, ein Spieler benötigt für die Bewegung um ein Feld 10 Sekunden, kann dabei nur horizontal und vertikale Bewegungen ausführen (nicht diagonal).

Start: A1
Ziel: D10
Felder: 12
Zeit: 120 Sek

Datenstruktur:
user_id|timestamp|x|y|...
1|2010-07-29 23:00:03|A|1|...
1|2010-07-29 23:00:03|A|2|...
1|2010-07-29 23:00:03|A|3|...
1|2010-07-29 23:00:13|A|4|...
1|2010-07-29 23:00:23|A|5|...
1|2010-07-29 23:00:33|A|6|...
1|2010-07-29 23:00:43|A|7|...
1|2010-07-29 23:00:53|A|8|...
1|2010-07-29 23:01:03|A|9|...
1|2010-07-29 23:00:13|A|10|...
1|2010-07-29 23:00:23|B|10|...
1|2010-07-29 23:00:33|C|10|...
1|2010-07-29 23:00:43|D|10|...

So kannst du zu jedem Zeitpunkt feststellen, ob sich ein Spieler zu diesem Zeitpunkt in der Nähe von x|y befindet. Am Ende des Moves könnte die Position in eine andere Tabelle übernommen und der Move archiviert oder gelöscht werden. Alternativ könnte auch der letzte Punkt stehen bleiben.

Grüße BN
 
Zurück