Wie haben ältere Spiele Kollisionserkennung mit Wänden, Böden und Decken gemacht?
Habe ich gelesen, über die Detektion von Kollisionen in spielen auf stackoverflow und anderen Webseiten. Viele von Ihnen sprechen über BSPs, begrenzenden Ellipsen, integration usw. Aber auf dem NES, gelang es Ihnen, das zu tun (Wand und Boden Kollisionsabfrage im Spiele-und ich finde es schwer zu glauben, dass Sie haben vielen Berechnungen, um zu erkennen, Wand-Kollisionen.
Ich denke, meine Frage ist, da eine Ebene aus Fliesen, wie haben Sie Kollisionen mit Wänden und Böden in Spiele wie Mario und Megaman hatte wenig Prozessorleistung?
- Haben Sie Folgen dem Weg der Bewegung und die Bestimmung der engsten Verbindung Kachel? (ein bisschen suchen) (priori)
- Haben Sie bestimmen, um eine Kollision mit dem Boden und dann herauszufinden, der beste Weg, die Anpassung der Charakter? (posteriori) Das ist riskant mit Variablen Zeitintervallen, die Sie springen könnte durch eine Kachel, wenn Sie schnell genug waren. Auch wenn ich davon ausgehen NES-Spiele Zeitintervallen wurden synchronisiert mit den tv refresh rate.
- Ist die Schwerkraft immer auf Ihre Zeichen, wenn Sie auf dem Boden? Oder haben Sie einfach 'ausschalten', wenn Sie sich entschlossen haben, zu Fuß auf einer Fliese? Was ist, wenn Sie zu Fuß aus, ein Rand der Klippe? Sie müssten eine Art und Weise der Bestimmung der Fliesen unter Ihnen anders.
- Wenn Sie haben, kollidierte mit einem Plättchen, würden Sie gerade finden, die Kante der Fliese und bewegen Sie Ihren Charakter auf der Seite (je nach Fahrtrichtung)?
- was über schräge Fliesen wie in super metroid und mario?
- Was über "Plattformen", wo können Sie springen durch den Boden und landet auf der Spitze. Wie würden Sie umgehen mit Kollisionen mit diesen Kacheln, wenn Sie es Taten, 'posteriori'?
Ich geschrieben habe, einige Kollisions-code-das ist im Grunde 'priori', wie es sucht nach dem ersten Ziegel, die Sie treffen, in eine bestimmte Richtung. Ich Frage mich nur, ob es einen besseren Weg. (nur unter Verwendung der nach-der-Tatsache Kollisionserkennung statt vielleicht)
eg, code zu überprüfen, für Fliesen-Kollisionen bei der Bewegung nach unten (ich check vert dann horizontale Bewegung):
def tile_search_down(self, char, level):
y_off = char.vert_speed
assert y_off > 0
# t_ are tile coordintes
# must be int.. since we're adding to it.
t_upper_edge_y = int( math.ceil((char.y+char.h) /self.tile_height ) ) #lowest edge
while (t_upper_edge_y*self.tile_height) < (char.y+char.h+y_off): # lowest edge + offset
t_upper_edge_x = int( math.floor(char.x/self.tile_width) )
while (t_upper_edge_x*self.tile_width) < (char.x+char.w):
t_x = t_upper_edge_x
t_y = t_upper_edge_y
if self.is_tile_top_solid(t_x, t_y, plane):
char.y = t_y*self.tile_height - char.h
char.vert_speed = 0.0
char.on_ground = True
return
t_upper_edge_x += 1
t_upper_edge_y += 1
char.y += y_off
InformationsquelleAutor der Frage Nick Sonneveld | 2009-07-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für die Arten der NES-ära, Spiele, die Sie sprechen, war alles 2D. Allein das vereinfacht viele Dinge.
Einige Maschinen der damaligen Zeit (besonders diejenigen, die mit hardware-sprites, wie der Commodore 64) hatte hardware Kollisionserkennung. Die meisten Spiele, die nicht unter Berufung auf hardware-Kollisionserkennung würde entweder eine bounding-box oder einen Treffer mask (1-bit-bitmap-sprite).
Entweder Weg, Kollisionserkennung Regel "a posteriori", außer für spezielle Fälle, wie die Ränder der Welt. Einige Spiele hatten bugs, wo bewegen sich zu schnell, wenn Sie etwas schlagen, könnte dazu führen, dass Sie durch Sie hindurch. (In der Tat, die Bewertungen der frühen 80-Spiele würden oft kommentieren, wie präzise die Kollisionserkennung wurde.)
Für Jump ' N ' runs, würden Sie in der Regel überprüfen, um zu sehen, ob der Charakter wird "geerdet" vor der Anwendung der Schwerkraft.
Den one-way-Plattformen, was nicht allzu schwer zu behandeln, nachdem die Tatsache, da Sie wissen, der sprite ist geschwindigkeitsvektor, so können Sie es verwenden, um zu bestimmen, ob oder nicht die Kollision registrieren sollen.
InformationsquelleAutor der Antwort Laurence Gonsalves
Für Spiele wie Super Mario World (SNES) das Spiel gespeichert, die Ebenen in einem Speicher-format, das machte es einfach, Mario ist die X/Y Lage, konvertieren Sie es in ein Kachel-Adresse, und überprüfen Sie dann die Fliesen sofort rund um die Adresse. Da waren die Level immer eine Feste Breite (wenn der Bereich, den Sie anzeigen konnte, abwechslungsreich), es erfolgt die Adressierung einfacher zu verwalten, da war es immer ein fester offset von mario ' s position, z.B. Adresse + 1 für den Titel neben mario, Adresse + 0x300 für die Fliesen unter ihm, etc.
InformationsquelleAutor der Antwort Sukasa
Gibt es Artikel hier, ist einen tiefen Einblick in die Programmierung eines Nintendo Entertainment System (NES) "Plattform-Spiel".
Ich kann nicht googlen, ist richtig, denn ich habe nicht stolperte auf diesem Artikel vor.
InformationsquelleAutor der Antwort Nick Sonneveld