2009-07-12 4 views
1

Jeder Feindtyp in meinem Spiel ist eine andere Klasse und die Instanzen werden in einem C-Array gespeichert. Im Hauptspiel wird loop update() für jede Gegner/Item Instanz ausgeführt, und draw() wird ausgeführt. Einige der update() - Befehle erfordern Kenntnisse darüber, wo sich der Hauptspieler befindet. Was wäre der beste Weg, um diese Informationen an die Instanz zu senden? Ich denke nicht, dass eine globale Variable der schlaue Weg ist, dies zu tun, da Multiplayer-Optionen später hinzugefügt werden können.Wie sollte ich meine Spieleinheiten über die Dinge in ihrer Umgebung informiert wissen?

Dies ist nur ein Beispiel für das größere Problem, wie Dinge im Spiel über einander wissen sollen. Wie würden Feinde wissen, dass sie zum Beispiel mit anderen Feinden kollidieren?

Antwort

3

Ihren Bedarf hilft, eine mehrfach verzweigte Baumtyp-Struktur (nicht einfacher binärer Baum) zu bauen. Die Knoten sind die Orte im Spiel. Jeder Knoten kann mehrere einfache Strukturen/Objektzeiger enthalten (abhängig von Ihrer Programmiersprache). Während sich der Spieler im Spiel bewegt, bewegen Sie den Zeiger für die Spielerposition auf den Baumknoten, der die Position darstellt. Wenn du das Spiel startest, ist diese Baumstruktur mit Dingen gefüllt, die du abholen kannst, Monstern usw. Ein zufälliger Samen kann auch benutzt werden, um Monster zu zerstreuen.

Dies hilft die Geschwindigkeit des Spiels, da Sie nur aktuelle Knoten und Knoten einen Schritt weg von Ihrem aktuellen Standort/Knoten suchen müssen. Wenn Routinen ausgelöst werden, bewegen sich die Monster zum nächsten Knoten oder zu den nächsten Knoten. Wenn ein med Packung verwendet wird, dann wird dessen Zeiger aus dem Raum/Knoten zerstört, dass es in ist.

Viel Glück

0

Eine Controller-Einheit?

Sie müssen sorgfältig über die Verwendung von einfachen Arrays nachdenken, lineare Suchvorgänge durch große Arrays können sehr zeitaufwendig sein, um nach Kollisionen zu suchen.

+0

Ich denke, ich weiß es nicht besser. Was sollte ich stattdessen verwenden? – Jameson

+0

Ein Array ist für die Speicherung der Entitäten geeignet. Bei einer Kollision können Sie eine andere Struktur (ein Weltgitter) haben, in der jede Zelle jede Entität darin auflistet. Auf diese Weise müssen Sie nicht jede Entität gegen jede andere Entität testen. – Nosredna

+0

Es kommt darauf an ;-) Wie viele Entitäten sprichst du, welche Operationen wirst du ausführen und gibt es eine Möglichkeit den Raum irgendwie zu partitionieren, so dass es einfach ist zu bestimmen, welche Entitäten du überprüfen musst. Unabhängig davon können Sie immer mit einfachen Arrays beginnen und dann zu einem anderen Mechanismus umgestalten, solange Sie Methoden haben, die eine Abstraktionsschicht bilden, zB: bool entity.IsCollision() {für jede Entität e in this.controller.entities {if (e ! = dieses && e.IsIntersecting (this)) gibt true zurück; } falsch zurückgeben ; } Dies kann so umgestaltet werden, dass es keine lineare Suche ist. –

3

Eine Möglichkeit, die Suche ein wenig effizienter zu machen, besteht darin, die Entitäten, die aktualisiert werden, in einen Quadbaum aufzuteilen. Der Baum wird basierend auf dem Ort auf dem Bildschirm oder in der von Ihnen eingerichteten Spielwelt geteilt. Auf diese Weise können Sie es so einrichten, dass nur in der Nähe von Entitäten aktualisiert wird. Wenn Sie zum Beispiel eine Treffererkennung durchführen, können Sie große Gruppen ignorieren.

quad trees

Hoffnung, die

0

Alle Einheiten im Spiel, einschließlich der Spieler, sollte im gleichen Behälter sein. Ihre KI durchläuft sie in jedem Frame und ruft eine Funktion auf, die alle Ziele jeder Entität ausführt.

Entitäten (wie der Player) haben über denselben Container Zugriff auf alle anderen Entitäten.

Sie müssen sich über den Container schlau machen, damit die Entität effizient auf den Container zugreifen kann.

Verwandte Themen