Comment avez les vieux jeux ne la détection de collision avec les murs, les planchers et les plafonds?
J'ai lu à propos de la détection de collision dans les jeux sur stackoverflow et d'autres sites. Beaucoup d'entre eux parler de Bsp, la délimitation de points de suspension, l'intégration, etc. Cependant, sur la NES, ils ont réussi à faire le plancher et le mur de la détection de collision dans les jeux et j'ai du mal à croire qu'ils l'ont fait de nombreux calculs pour détecter la paroi de collisions.
Je suppose que ma question est, étant donné un niveau constitué que de tuiles, comment ont-ils de détecter les collisions avec les murs et les planchers dans les jeux comme Mario et Megaman qui avait peu de puissance de traitement?
- Ont-ils suivre la trajectoire de mouvement et de déterminer le plus proche de la connexion tuile? (un peu de recherche) (à priori)
- Ont-ils déterminer une collision avec le sol et de déterminer la meilleure façon de régler le personnage? (a posteriori) C'est risqué avec la variable échéances, vous pouvez sauter à travers un carreau si vous avez été assez rapide. Bien que je suppose que jeux NES échéances ont été synchronisés avec la tv à la fréquence de rafraîchissement.
- La gravité est toujours touchant de votre personnage lorsque vous êtes sur le terrain? Ou avez-vous juste 'désactiver' quand vous êtes déterminé à marcher sur une tuile? Quel sujet lorsque vous marcher sur un bord de la falaise? Vous auriez besoin d'une sorte de moyen de déterminer tuiles en-dessous de vous.
- Si vous avez entré en collision avec une tuile, serait que tu viens de trouver le bord de la tuile et de déplacer votre personnage sur le côté de celui-ci (selon le sens de déplacement)?
- qu'en pente tuiles comme dans super metroid et mario?
- Ce sujet de "plates-formes", où vous pouvez sauter à travers le bas et de la terre sur le dessus. Comment voulez-vous gérer les collisions avec ces tuiles si vous le faisiez 'a posteriori'?
J'ai écrit certains de collision code qui est essentiellement 'a priori', comme il cherche la première tuile de vous frapper dans une certaine direction. Je me demandais simplement si il ya une meilleure façon. (juste après le fait de la détection de collision au lieu peut-être)
par exemple, le code de vérification pour les carreaux de collisions en mouvement à la baisse (je check vert puis un mouvement horizontal):
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
Vous devez vous connecter pour publier un commentaire.
Pour les types de NES de l'époque des jeux dont vous parlez, tout était en 2D. Seul, qui simplifie beaucoup les choses.
Certaines machines de l'époque (en particulier ceux avec du matériel de sprites, comme le Commodore 64) avaient matériel de détection de collision. La plupart des jeux qui n'étaient pas en s'appuyant sur le matériel de détection de collision soit de l'utilisation d'une boîte englobante ou un coup de masque (1 bit bitmap de l'image-objet).
De toute façon, la détection de collision est généralement fait "a posteriori", sauf pour les cas spéciaux comme les bords du monde. Certains jeux ont des bugs où va trop vite quand vous frappez quelque chose qui pourrait vous amener à passer à travers elle. (En fait, les examens des années 80 aux jeux souvent des commentaires sur le degré de précision de la détection de collision a été.)
Pour platformers, vous devez généralement vérifier pour voir si le personnage est mis à la terre avant d'appliquer la gravité.
Les plates-formes de chose n'est pas trop dur à faire face après le fait, puisque vous savez que le sprite du vecteur vitesse, de sorte que vous pouvez l'utiliser pour déterminer si oui ou non la collision devrait s'inscrire.
Il y a ici l'article qui est un regard en profondeur sur la programmation de la Nintendo Entertainment System (NES) "jeu de plateforme".
Je ne peut pas avoir été googler juste parce que je n'ai pas tombé sur cet article avant.
Pour des jeux tels que Super Mario World (SNES), le jeu stockés les niveaux, dans un format de mémoire qui le rend facile à prendre Mario X/Y de l'emplacement, de le convertir à une tuile d'adresse, et de vérifier ensuite les tuiles immédiatement autour de cette adresse. Depuis, les niveaux étaient toujours une largeur fixe (si la zone que vous puissiez le voir variées), il fait de la lutte plus facile à gérer car c'est toujours un décalage fixe de mario position, par exemple l'Adresse + 1 pour la tuile à côté de mario, Adresse + 0x300 pour la vignette ci-dessous de lui, etc.