gpt4 book ai didi

collision-detection - 旧游戏如何与墙壁、地板和天花板进行碰撞检测?

转载 作者:行者123 更新时间:2023-12-03 11:34:31 26 4
gpt4 key购买 nike

我一直在阅读有关 stackoverflow 和其他网站上游戏中的碰撞检测的信息。他们中的很多人都在谈论 BSP、边界椭圆、集成等。然而,在 NES 上,他们设法在游戏中进行地板和墙壁碰撞检测,我发现很难相信他们做了很多计算来检测墙壁碰撞。

我想我的问题是,给定一个仅由瓷砖组成的关卡,他们如何检测像马里奥和洛克曼这样处理能力很小的游戏中与墙壁和地板的碰撞?

  • 他们是否遵循运动路径并确定最近的连接瓷砖? (有点搜索)(先验)
  • 他们是否确定了与地板的碰撞,然后找出了调整角色的最佳方式? (后验)这对于可变的时间步长来说是有风险的,如果你足够快,你可以跳过一块瓷砖。虽然我假设 NES 游戏时间步长与电视的刷新率同步。
  • 当你在地面上时,重力是否总是影响你的角色?或者当你决定在瓷砖上行走时,你只是“关掉它”?当你走下悬崖边缘时呢?否则,您需要某种方式来确定您下方的瓷砖。
  • 如果您撞到了一块瓷砖,您是否会找到该瓷砖的边缘并将您的角色移动到它的一侧(取决于行进方向)?
  • super 银河战士和马里奥中的倾斜瓷砖怎么样?
  • 可以跳过底部并降落在顶部的“平台”呢?如果你做“事后”,你会如何处理与这些瓷砖的碰撞?

  • 我编写了一些基本上是“先验”的碰撞代码,因为它会搜索您将在某个方向上碰到的第一个图块。我只是想知道是否有更好的方法。 (可能只是使用事后碰撞检测)

    例如,检查瓷砖碰撞以向下移动的代码(我检查垂直然后水平移动):
      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

    最佳答案

    对于您所谈论的 NES 时代游戏类型,一切都是 2D。仅此一项就可以简化很多事情。

    那个时代的一些机器(特别是那些带有硬件 Sprite 的机器,比如 Commodore 64)有硬件碰撞检测。大多数不依赖硬件碰撞检测的游戏要么使用边界框,要么使用命中掩码( Sprite 的 1 位位图)。

    无论哪种方式,碰撞检测通常是“后验”完成的,除了像世界边缘这样的特殊情况。有些游戏确实存在一些错误,即当您击中某物时移动速度过快可能会导致您通过它。 (事实上​​,对 80 年代早期游戏的评论通常会评论碰撞检测的精确程度。)

    对于平台游戏,您通常会在施加重力之前检查角色是否“接地”。

    单向平台的事情事后处理起来并不难,因为您知道 Sprite 的速度向量,因此您可以使用它来确定是否应该记录碰撞。

    关于collision-detection - 旧游戏如何与墙壁、地板和天花板进行碰撞检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1129512/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com