Como os jogos mais antigos faziam a detecção de colisão com paredes, pisos e tetos?

Eu tenho lido sobre detecção de colisão em jogos em stackoverflow e outros sites. Muitos deles falam sobre BSPs, elipses limitantes, integração, etc. No entanto, no NES, eles conseguiram fazer detecção de colisão de chão e parede em jogos e acho difícil acreditar que eles fizeram muitos cálculos para detectar colisões de parede.

Eu acho que a minha pergunta é, dado um nível composto de apenas telhas, como eles detectaram colisões com paredes e pisos em jogos como Mario e Megaman, que tinham pouco poder de processamento?

Eles seguiram o caminho do movimento e determinaram o ladrilho de conexão mais próximo? (um pouco de pesquisa) (priori)Eles determinaram uma colisão com o chão e depois descobriram a melhor maneira de ajustar o personagem? (a posteriori) Isto é arriscado com timesteps variáveis, você poderia saltar através de um azulejo se você fosse rápido o suficiente. Embora eu assuma que os timesteps dos jogos da NES foram sincronizados com a taxa de atualização da tv.A gravidade está sempre afetando seu caráter quando você está no chão? Ou você simplesmente "desliga" quando você está determinado a andar em uma telha? E quando você sai de uma borda do penhasco? Você precisaria de algum modo de determinar as peças embaixo de você.Se você colidiu com um ladrilho, você apenas encontraria a borda daquele ladrilho e moveria seu personagem para o lado dele (dependendo da direção da viagem)?que tal telhas inclinadas como em super metroid e mario?E sobre "plataformas", onde você pode saltar pelo fundo e aterrissar no topo. Como você lidaria com colisões com essas peças se estivesse fazendo isso "a posteriori"?

Eu escrevi algum código de colisão que é basicamente 'priori' enquanto ele procura o primeiro bloco que você vai atingir em uma certa direção. Só estou me perguntando se há um jeito melhor. (usando a detecção de colisão depois do fato, talvez)

por exemplo, código para verificar colisões de ladrilhos para mover para baixo (eu verifico vert e depois movimento 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

questionAnswers(3)

yourAnswerToTheQuestion