Was wäre der beste Weg, um einen offenen Raum in einem Level zu finden?

7

Ich arbeite an einem 2D-Spiel, in dem Sie Farbe verwenden, um einem Level Kacheln hinzuzufügen, und im Moment arbeite ich daran, Warp-Kacheln hinzuzufügen. Ich habe es so eingerichtet, dass bestimmte richtungsorientierte Farben zwei Punkte (Anfang und Ende) verwenden, um zu bestimmen, in welche Richtung die Kacheln zeigen (links, rechts, oben, unten). Die Kettkacheln haben diese Punkte, aber sie werden es sein zu zwei weiteren Listen hinzugefügt (Warp Start und Ende). Die Warps funktionieren wie folgt: Wenn der Spieler ein Plättchen trifft, wird er auf das entsprechende Warpplättchen teleportiert. Wenn ich das jetzt richtig zum Laufen bringen will, muss ich es schaffen, damit der Spieler nicht in eine Wand oder von der Karte teleportiert werden kann. Also muss ich den Punkt auf eine offene Kachel verschieben, genau einen Raum von den Wänden entfernt.

Was wäre der beste Weg, dies zu tun?

IronGiraffe
quelle
Richten Sie diese Warp-Punkte vorher ein oder werden sie irgendwie automatisch generiert?
Richard Marskell - Drackir
Siehe meine Antwort und Beschreibung des Verpackungsproblems unter gamedev.stackexchange.com/questions/16054/…
Ingenieur
@Drackir Die Farbe ist nur eine Partikelspur, die nicht verschwindet oder sich bewegt, und jedes Partikel hat seinen eigenen Punkt, um seine Position abzubilden. Also habe ich eine for-Schleife erstellt, die jede Partikelposition überprüft, prüft, ob diese Kachel geöffnet ist, die Kollisionskarte entsprechend ändert und dann die Partikel entfernt. Die Kachelgrafiken werden gemäß der Kollisionskarte gezeichnet.
IronGiraffe
Ich bin unglaublich verwirrt. Vielleicht würde ein Bild den Leuten helfen, zu sehen, was Sie versuchen, und Ihnen solide Antworten geben.
Richard Marskell - Drackir
@Drackir Hier ist ein Video des Spiels. Jedes Mal, wenn Sie Kacheln ablegen, ändern Sie die Werte an dieser Stelle auf der Kollisionskarte (ein int-Array). Mit den Warp-Kacheln benötige ich 9 Kacheln mit offenem Raum (alle 9 Kacheln sind gleich 0) und die Warp-Kacheln sind Erstellt an den Endpunkten der violetten Linie (wo die Flags bei 1:32 erscheinen). Ich brauche eine Möglichkeit, einen Suchalgorithmus zu verwenden, um den alten Punkt nach einem neuen Punkt zu durchsuchen, der meinen Richtlinien entspricht (8 leere Kacheln herum) der neue Punkt, der ebenfalls leer ist.) Beispiel.
IronGiraffe

Antworten:

3

Wenn Sie nur sicherstellen möchten, dass die angeklickte Kachel offene Kacheln aufweist, würde ich einfach eine Funktion erstellen, die die Kacheln um sie herum überprüft. Und dann nenne das auf der angeklickten Kachel.

Sie können es in einer (verschachtelten) Schleife einrichten oder einfach if-Anweisungen dafür erstellen. Also im Pseudocode:

function IsTileOpen(tile)
  if tile NOT open
    return false because if the clicked tile isn't open, why check any others
  if tile on top row
    return false because we're against the top wall
  if tile on left column
    return false because we're against the left wall
  if tile on right column
    return false because we're against the right wall
  if tile on bottom row
    return false because we're against the bottom wall
  if top left tile NOT open
    return false
  if top tile NOT open
    return false
  if top right tile NOT open
    return false
  if left tile NOT open
    return false
  if right tile NOT open
    return false
  if bottom left tile NOT open
    return false
  if bottom tile NOT open
    return false
  if bottom right tile NOT open
    return false
  return true because all the surrounding tiles were open
end function

Bearbeiten basierend auf Kommentar

Es gibt zwei Möglichkeiten, wie Sie mit der Situation umgehen können:

  1. (Am einfachsten) Sie können einfach einen Sound abspielen und anzeigen, dass die von ihnen gewählte Position ungültig ist und sie eine andere Option auswählen müssen.
  2. Verwenden Sie einen Suchalgorithmus, um eine offene Kachel zu finden. Ich denke jedoch, dass es Grenzen geben sollte, wie Sie dies verwenden. Nehmen wir zum Beispiel eine Situation, in der sie auf die linke Seite der Karte klicken und der einzige offene Punkt weit rechts ist. Ihr Suchalgorithmus findet diesen offenen Punkt und platziert den anderen Warp dort. Dies scheint nicht sehr intuitiv zu sein und kann frustrierend sein. Mein Vorschlag in diesem Fall (vorausgesetzt, Sie möchten nicht # 1 machen, was mein Hauptvorschlag ist) ist, nur die Kacheln um die aktuelle Kachel herum zu durchsuchen (möglicherweise in einem Radius von n Kacheln). Auf diese Weise erscheint das Warp-Gate nicht zu weit von der Stelle entfernt, an der Sie geklickt haben. Um eine solche Suche durchzuführen (unter der Annahme eines Radius von 1 Kachel), müssen Sie nur die Funktion oben für die acht Kacheln um die aktuelle Kachel aufrufen (vorausgesetzt, die aktuelle Kachel war nicht verfügbar). Sie können dies in einer Schleife oder erneut mit if-Anweisungen tun.
Richard Marskell - Drackir
quelle
Ich weiß, wie das geht, bin mir aber nicht sicher, wie ich mit einem Suchalgorithmus einen neuen Punkt finden kann, wenn der alte Punkt nicht geöffnet ist. Ich habe über Pfadfindung nachgelesen und es scheint, als könnte ich etwas Ähnliches tun, bei dem ich den Dijkstra-Algorithmus oder den A * -Algorithmus verwenden würde, um den nächsten offenen Raum zu finden. Ich bin mir nur nicht sicher, wie ich das machen könnte, weil ich so etwas noch nie programmiert habe. Es tut mir leid, dass ich so nervig bin, ich bin ein bisschen neu in der Programmierung, also weiß ich noch nicht so viel.
IronGiraffe
@IronGiraffe - Oh, ich verstehe was du meinst. Ok, ich werde meine Antwort aktualisieren.
Richard Marskell - Drackir
@IronGiraffe - Aktualisiert.
Richard Marskell - Drackir
Tun Sie dies besser "schauen Sie, ob die Kachel geöffnet ist" während des Ladens oder der Generierung des Levels und speichern Sie das Ergebnis. Normalerweise müssen Sie zu diesem Zeitpunkt ohnehin alle Kacheln durchlaufen (zumindest alle geladenen / sichtbaren Kacheln, wenn Sie eine verzögerte Auswertung durchführen), dass wenig zusätzliche Arbeit keine Rolle spielt und die zusätzlichen Speicherbits auf den meisten Plattformen keine Rolle spielen sollten entweder.
Martin Sojka
@ Martin - Soweit ich weiß, ändert sich das Level beim Spielen. Schau das Video. Ich empfehle weiterhin Option 1 oben, aber wenn sie die zweite Option ausführen müssen, ist dies nur ein Klick, sodass es unwahrscheinlich ist, dass die Leistung spürbar beeinträchtigt wird.
Richard Marskell - Drackir
0

Ich denke, Sie müssen das nächste "freie" Rechteck zu einem Warp-Plättchen finden, in das der Spieler passen kann.

Es gibt eine ähnliche Frage zum Stapelüberlauf. Klicken Sie hier, um zu sehen .

e-MEE
quelle