老游戏是如何做到的碰撞检测与墙壁,地板和天花板?(How did older games do co

2019-06-26 00:08发布

我一直在阅读有关在计算器和其他网站游戏的碰撞检测。 他们中的很多谈论的BSP,包围省略号,整合等。然而,在NES,他们能够做到在游戏地板与墙的碰撞检测和我很难相信,他们做了很多的计算,以检测墙壁碰撞。

我想我的问题是,仅给定的瓷砖由一个水平,他们怎么检测游戏像马里奥和洛克人其中有一点的处理能力与墙壁和地板的碰撞?

  • 他们是否遵循运动的路径和确定最接近的连接瓦? (有点搜索的)(先验)
  • 难道他们决定与地面发生碰撞,然后计算出调整字符的最佳方式? (事后)这是有风险的可变时间步长,你可以通过并列式窗口,如果你是速度不够快跳。 虽然我假设NES游戏时间步长用电视的刷新率同步。
  • 重力总是影响你的性格,当你在地上? 或者你只是“把它关掉”正在确定为在瓦片上行走时,你? 怎么样,当你走了悬崖的边缘? 你会需要某种确定的瓷砖下面你其他方式。
  • 如果你已经有瓷砖相撞,将您只是发现瓷砖的边缘,你的角色移动到它的一侧(根据行驶方向)?
  • 怎么样在超级银河战士和马里奥倾斜砖怎么样?
  • 什么“平台”在那里你可以通过底部和土地在上面跳。 你将如何处理与这些瓷砖的碰撞,如果你在做它的后验“?

我已经写了一些碰撞的代码,基本上是“先验”,因为它搜索,你会在某个方向击中了第一个瓷砖。 我只是想知道是否有更好的方法。 (只是用后的,其实碰撞检测,而不是也许)

例如,代码来检查瓷砖碰撞用于向下移动(I检查VERT然后水平运动):

  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

Answer 1:

对于你在谈论类型的NES时代的游戏,一切都是2D。 这本身就简化了很多东西。

那个时代的某些机器(特别是那些与硬件精灵,像64代)有硬件的碰撞检测。 不依赖于硬件的碰撞检测,大多数游戏要么使用边框或命中面具(精灵的1位位图)。

无论哪种方式,碰撞检测,通常是做“后天”,除特殊情况下,像世界的边缘。 有些游戏居然也有错误,其中移动太快,当你打的东西可能会导致你穿过它。 (事实上​​,80年代初期的游戏评论往往会在碰撞检测精确程度是发表评论。)

对于平台游戏,您最好检查是否该字符应用重力之前的“接地”。

单向平台的东西不是太难对付的事实后,因为你知道精灵的速度矢量,所以你可以用它来确定碰撞是否应该注册。



Answer 2:

这里有一篇文章, 是在深入了解编程任天堂娱乐系统(NES)“平台游戏”。

  • 编程MC童装

我可能没有被正确使用Google,因为我还没有这篇文章时偶然发现之前。



Answer 3:

对于游戏,如超级马里奥世界(SNES),游戏存储在存储器中的格式,使得它容易把马里奥的X / Y位置,将其转​​换成片地址,然后立即检查该地址周围的瓷砖的水平。 由于水平始终有固定的宽度(尽管该地区,你可以查看变化),这使处理更容易管理,因为它总是一个固定的从马里奥的位置,例如马里奥旁边的瓷砖地址+ 1地址+是0x300的偏移他下面瓦等



文章来源: How did older games do collision detection with walls, floors and ceilings?