2012-04-03 16 views
2

Ich beginne meine Hand bei der Erstellung eines Multi-Player-Spiel mit HTML 5/Javascript.Javascript Multiplayer Game - Serverseitige Validierung.

Ich mache derzeit einige Prototypen zu verschiedenen Ideen, wie man Leute davon abhält zu betrügen. Jetzt weiß ich, ich muss alles Server-Seite tun und nur den Client senden "Aktionen".

Mein Problem ist, kann ich nicht den besten Weg trainieren, den Spielstatus für jeden Spieler zu speichern.

Also nur etwas Grundlegendes betrachten; Zwei Spieler, die um eine leere Karte herumlaufen.

Derzeit ist meine Idee

Beiden Clients (sockets.io) ihre Aktionen zu einem Node.JS Server senden, der dann mit einem X/Y-Koordinaten zum Runterladen reagiert. Das ist in Ordnung. Aber natürlich müssen beide Kunden wissen, wo der andere Spieler ist.

Ich dachte darüber nach, indem ich für jedes Spiel eine neue Datenbanktabelle erstellen und den Spielstatus dort speichern würde, damit die beiden node.js-Verbindungen miteinander kommunizieren können.

Meine Frage ist, ist dies der beste Weg, um zwischen zwei node.js Verbindungen zu interagieren, wäre es schnell genug? Oder gibt es einen Design-Patten für diese spezielle Aufgabe, die ich vermisse?

dank

+0

Im Allgemeinen sollte kein System dynamisch * Tabellen * in einer Datenbank erstellen, Datensätze innerhalb einer Tabelle erstellen, feine, aber tatsächliche physische Tabellen - nein. – Jamiec

+0

Ich habe das ursprünglich gedacht. Aber mein ich dachte, es könnte mehr optimiert werden, um viele Tische mit sehr wenigen Platten zu haben? – james

+0

@Jamiec das klingt nach Weisheit, aber ich bin nicht überzeugt. Warum sollte das eine allgemeine Regel sein? Sind Tabellen wirklich mehr physisch als Datensätze? – paislee

Antwort

1

eine neue Tabelle pro Spiel erstellen wird in der Regel eine schreckliche Idee betrachtet.

Wenn Sie keine Persistenz benötigen - dh. Wenn Ihr Node.js-Server krächzt, kann ein Spiel verloren gehen - Sie können die Spiele einfach im Speicher speichern, in einem Objekt, sagen wir games, das ein Objekt mit einem Array von players enthalten könnte enthalten x und y Koordinaten etc.

var games = { 
    123019240: { 
    players: { 
     123: {x: 1, y: 1, name: 'Joe'}, 
     456: {x: 2, y: 2, name: 'Jimbob'} 
    } 
    } 
}; 

Wenn Sie Ausdauer tun müssen, obwohl, sollten Sie wirklich wahrscheinlich schauen Sie in einigen anderen Datenbanken als SQL - zum Beispiel Rediskönnte eine gute Wahl für die Aufgabe sein.

In jedem Fall fühlt sich SQL wie das falsche Werkzeug an und das Erstellen neuer Tabellen bei Bedarf noch mehr. (Wenn Sie SQL verwenden, sollten Sie jedoch eine Tabellenlayout mit game_id, player_id, x und y und sicher sein, einen Index für game_id :) haben)

+0

danke für die Antwort. Ich dachte ursprünglich, das zu tun, was du oben gesagt hast. Aber ich kann nicht sehen, wie die zwei Verbindungen in der Lage wären, die Daten jedes anderen Spielers zu lesen? z.B. Joe ist über einen Browser mit einem node.js-Server verbunden. Jimbob ist auch über einen Browser mit demselben Server verbunden. Aber wird node.js zwei Instanzen erstellen, die nicht miteinander kommunizieren können? und deshalb Objektdaten nicht lesen können, ohne sie irgendwo zu speichern? – james

+0

Nein, es ist alles im selben Prozess (außer Sie sagen es ausdrücklich nicht über das 'cluster' Modul). Alle globalen Variablen sind für beide (oder besser alle) Clients zugänglich. – AKX

+0

Und es kann hinzugefügt werden, dass Sie auch einen zweiten Node.js (oder andere Sprache) -Prozess haben könnten, der Ihre (In-Memory, wenn Sie möchten) Datenbank, wenn Sie nicht sicher sein können, dass Ihr Spiel uni-process bleiben wird . – AKX

1

Der Ansatz, den Sie nehmen müssen, ist die folgende:

Jeder Client sendet seine Koordinaten in bestimmten Intervallen (unter Verwendung von emit) an den Server. Der Server überprüft diese Position auf Gültigkeit und speichert sie in der Datenbank. Es verwendet dann eine Broadcast-Nachricht (http://socket.io/#how-to-use - Broadcasting Nachrichten), um diese Position an alle Clients zu senden. Jeder Mandant aktualisiert die angezeigte Position des Spielers/Spielers, der sich bewegt hat.

Sie können keine direkte Verbindung zwischen zwei Spielern erstellen, da sie einen Browser verwenden. Jede Verbindung muss einen einzelnen node.js-Server durchlaufen.

können Sie einige Tutorials sehen hier: http://www.nodejs-news.com/nodejs-tech/Nodejs-Socketio-Building-HTML5-game/

(Sie verwenden den Motor Auswirkungen aber die Prinzipien sind die gleichen)

0

Meiner Erfahrung nach, wenn Benutzer in einem Cluster-Server miteinander interagieren Umgebung, ist es am besten, wenn sie auf demselben Server interagieren.

Beispiel:

5 Game-Server, erstellen Leute Spiele zusammen in einer Lobby. Ein Spiel enthält eine maximale Anzahl von Personen. In diesem Szenario ist es viel viel einfacher, das Spiel auf einem Server zu behalten und alle Benutzer mit diesem einen Spielserver verbinden zu lassen. Dies verhindert das notwendige Convo zwischen den Servern und hält den Spielzustand konstant und schnell!

Eve Online ist ein großartiges Beispiel dafür. Jede "Region" ist ihr eigener Server, und wenn Sie weit genug durch das Universum reisen, werden Sie transparent auf einen anderen Spielserver verschoben. Wenn du gegen jemanden kämpfst, sind sie wahrscheinlich auf demselben Server. Dann ist es dem Spieleserver freigestellt, periodisch Daten in die DB zu schreiben. Dies ist der beste Weg, da der Benutzer nie auf die DB warten muss. Sie kommunizieren direkt mit dem Gameserver, der Gameserver kommuniziert ab und zu mit der DB. Ihr Benutzer würde höchstens einige Sekunden Daten verlieren (und auch alle anderen auf diesem Spielserver).

Verwandte Themen