Ho letto sul rilevamento delle collisioni nei giochi su StackOverflow e altri siti. Molti di loro parlano di BSP, elipsing di delimitazione, integrazione ecc. Tuttavia, sul NES, sono riusciti a eseguire il rilevamento di collisioni di pavimenti e pareti nei giochi e trovo difficile credere che abbiano fatto molti calcoli per rilevare le collisioni tra mura.Come hanno fatto i vecchi giochi il rilevamento delle collisioni con muri, pavimenti e soffitti?
Credo che la mia domanda sia, dato un livello composto da solo tessere, come hanno rilevato collisioni con muri e pavimenti in giochi come Mario e Megaman che avevano poca potenza di elaborazione?
- Hanno seguito il percorso di movimento e determinato la tessera di connessione più vicina? (un po 'di ricerca) (priori)
- Hanno determinato una collisione con il pavimento e poi hanno trovato il modo migliore per regolare il personaggio? (a posteriori) Questo è rischioso con timestep variabile, potresti saltare da una tessera se eri abbastanza veloce. Anche se presumo che i timestep dei giochi NES siano stati sincronizzati con la frequenza di aggiornamento della tv.
- La gravità influisce sempre sul tuo personaggio quando sei a terra? O semplicemente "spegni" quando sei determinato a camminare su una tessera? E quando uscirai da una scogliera? Avresti bisogno di un qualche modo per determinare le piastrelle sotto di te altrimenti.
- Se vi siete scontrati con una tessera, troverete il bordo di quella tessera e spostate il vostro personaggio sul lato di essa (a seconda della direzione di marcia)?
- che dire di piastrelle in pendenza come in super metroid e mario?
- Che dire di "piattaforme" in cui è possibile saltare attraverso il fondo e atterrare in cima. Come gestiresti le collisioni con queste tessere se lo facessi a posteriori?
Ho scritto un codice di collisione che è fondamentalmente 'priori' mentre cerca la prima tessera che verrà colpita in una certa direzione. Mi sto solo chiedendo se c'è un modo migliore. (Usando solo rilevamento delle collisioni dopo-il-fatto invece forse)
esempio, il codice per verificare le collisioni piastrelle per spostare verso il basso (posso controllare vert quindi movimento orizzontale):
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
Vorrei sottolineare che dopo aver trovato la piastrella, Mario World usata una tabella di ricerca di funzioni per gestire le collisioni di piastrelle, il che significava che ogni piastrella eseguito solo il codice che ha voluto eseguire. – Sukasa