Frage

vor kurzem wurde ich mit der Hand versucht, ein Spiel in C # bei Codierung. Ich bin nicht XNA für diese Verwendung, wie ich dachte, ich würde mehr lernen, wenn ich das Spiel von Grund auf neu codiert (obwohl ich eine Multimedia-Engine verwende).

Ich versuche, ein 2D-RPG-Spiel zu entwerfen - ein bisschen ehrgeizig ich weiß, aber ich habe recht gut ein Verständnis von zumindest den grundlegenden Teilen des Spiels (dh den ‚Kesselblech‘ Code), und ich habe einen Teil erreicht, an dem ich nicht weiß, wohin man von hier gehen.

In dem 2D-Spiel, Sie Fortschritte durch das Spiel über herumlaufen verschiedene ‚Bereiche‘. Sobald Sie eine ‚Portal Kachel‘ Hit werden Sie in den nächsten Bereich transportiert etc.

Ich habe Probleme zu verstehen, wie diese Fläche Objekt eingerichtet werden soll. Dies war meine erste Idee: Jeder Bereich ein paar verschiedene Sammelstrukturen (zum Beispiel eine Sicht Quadtree, eine Kollision Quadtree, eine KI-Entity-Liste etc.) hat. Also, wenn ich einen Feind Einheit in das Spiel hinzufügen, würde es ausdrückte in die Sichtbarkeits Quadtree werden, die Kollision Quadtree und die KI-Entity-Liste (weil Sie mit Einheiten kollidieren können). Wenn der Bereich ein Update-Anforderung empfängt, sagt er jede dieser Strukturen selbst zu aktualisieren, was wiederum die Entitäten sagen, sich selbst zu aktualisieren. Alles ist gut, bis jetzt.

Meine Frage ist: Was passiert, wenn dieser Feind mit anderen Objekten kommunizieren muss? Zum Beispiel könnte muß es wissen, ob der Spieler in einem bestimmten Bereich davon war. Oder ob es war vom Spieler getroffen. Oder wo alle Collidable Objekte in der Umgebung sind (so könnte es pathfind).

Die erste (und schlecht) Lösung für dieses Problem einfach wäre jede Entität zu jeder Kollektion einen Verweis zu übergeben. Aber dies offensichtlich ermutigt eng gekoppelter Objekte, die nicht gut ist.

Die zweite Lösung kam ich mit für jede Einheit war in der Lage sein auf den Bereich abgefragt wird, über Nachrichtenstrukturen. So würde ein Feind der Lage sein, zu sagen: „Gib mir eine Liste der einzelnen Unternehmen innerhalb X Abstandes von meiner Position“ und der Bereich würde eine Antwort zurück. Dies würde sich jedoch immer schwieriger, als ich mehr und mehr Möglichkeiten in den Bereich codieren würde ( „Gib mir eine Liste von Unternehmen, die nicht innerhalb von X Abstand von mir sind“, „Gib mir eine Liste aller Organisationen, die mit Gesundheit niedriger als X“usw.).

Was ich suche ist eine Zeit Lösung für dieses Problem der Inter-Objekt-Kommunikation getestet, und im Grunde wie eine Fläche einzurichten. Ich nehme an, es wäre auch eine Art von Messaging-System benötigen, obwohl ich nicht sicher bin.

Danke für das Lesen.

War es hilfreich?

Lösung

Sie könnten den Blick in Mediator Muster . Es würde dir erlauben, geringe Kopplung zu haben, aber ja, du würde eine Menge Code in dem Mediator bezweckt (n) die Kommunikation zwischen den anderen Objekten zu erleichtern. Aber ich denke, es ist entweder das eine oder das andere. Und dann ist dies bevorzugt. Es wäre auch Ihnen mehr Freiheit ermöglichen Tricks zu tun, wie bestimmte Update-Anfragen Warteschlangen und die Anforderungen an mehr opportun mal handhaben, oder die Stapelverarbeitung von vielen Anfragen zu tun, anstatt sie eins nach dem anderen zu tun, die (theoretisch) eine Art auferlegen würde von Overhead.

Andere Tipps

Ich denke, die beste Option für diese Art von Dingen ist eine Menge, die Beobachter-Muster zu verwenden ... Ereignisse erstellen (die Entscheidung, wie allgemein oder konkret ein anderes Design decission ist) und machen Sie Ihre Objekte auf diejenigen abonnieren sie benötigen.

Zum Beispiel kann der Motor collission oder Proximity Ereignisse ausgelöst, wenn zwei Einheiten in der Nähe sind, aber diese werden nur von den Einheiten empfangen werden, die daran interessiert sind. Sie können einige Optimierungen tun nur die Bedingungen zu überprüfen, mit den Beobachtern abonniert.

Ich weiß nicht, ob dies in den Spielen gemeinsamer Ort ist, und ich habe eigentlich nie es in jedem Spiel (noch) nicht verwendet, aber ich habe viele Male darüber nachgedacht und es ist die Option, die ich am meisten mag.

Nun ja, eine aproach wäre ein Client / Server-Architektur eingerichtet werden. So würde der Server alle Spielwelten Updates und interne Logik handhaben und der Client würde nur den Server fragen, ob es bestimmte Aktionen ausführen kann. Der Server würde dann reagieren und der Kunde würde nur dann ziehen und das Spiel Bildschirm aktualisieren. Nicht-Spieler-Einheiten würden das gleiche tun. Der einzige Unterschied wäre der Kunde ist die menschliche controled und die anderen Einheiten sind Computer gesteuert. Dies würde ermöglichen es Ihnen, die Spielwelt Setup und Ereignisse und Updates von Entity-Logik zu trennen.

Das „Nachrichtensystem“ Du erwähnt wird das Anwendungsprotokoll genannt und kann ein komplexes esoterisches binäres System, oder einfach für Menschen lesbare Zeichenkette sein, die ich empfehlen würde. Wenn der Spieler bewegt sich der Server eine Liste von Entitäten senden, die in Sichtweite des Kunden sind. Nicht-Spieler-Einheiten würden die gleiche Art und Weise arbeiten. Das ist durch den Server für die Erlaubnis zu bitten, Dinge zu tun, oder für Informationen über ein anderes Unternehmen, dass der Server zuvor es gesendet, wie es etwa bewegte und kam in die Ansicht der Einheit, und der Server mit der entsprechenden Antwort oder Informationen zu reagieren.

Wenn Sie dies mit Steckdosen implementieren wären, würden Sie offensichtlich Nutzen intrinsischen Netzwerk zu spielen haben, wie der Server nicht kümmern würde, wenn der Client auf demselben Rechner verbinden wurde der Server oder wenn der Kunde des Kontinent ausgeführt wird, über. Dies kann Ihre Frage speziell mit dem Code nicht beantwortet, aber ich hoffe, dass es zumindest zum Nachdenken war.

Dies ist in der Regel viel einfacher, wenn Sie ein Objekt über das Unternehmen tut das Management haben. (Z. B. die ‚Welt‘ oder das ‚Spiel‘.) Es kann leicht sehen, welche Unternehmen in der Nähe ist, auf die anderen und dementsprechend Ereignisse und Benachrichtigungen senden.

Wenn Personen, die ein bisschen mehr Kontext brauchen sinnvolle Entscheidungen zu treffen, wenn sie aktualisiert sind zu werden, können Sie immer die Welt Pass in diesem Zusammenhang in irgendeiner Form. Aber lassen Sie die Welt um die Partitionierung und die Platzierung der Einheiten zu verwalten, anstatt Einheiten benötigen um diese direkt zu kümmern.

(Auch, warum ein Quadtree? Für ein 2D-RPG ein grobes Raster wahrscheinlich viel einfacher wäre zu implementieren und gleichermaßen nützlich.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top