我一直在阅读有关 stackoverflow 和其他网站上游戏中的碰撞检测的信息。他们中的很多人都在谈论 BSP、边界椭圆、积分等。然而,在 NES 上,他们设法在游戏中进行地板和墙壁碰撞检测,我发现很难相信他们做了很多计算来检测墙壁碰撞。
我想我的问题是,给定一个仅由瓷砖组成的关卡,他们如何检测像马里奥和洛克曼这样的处理能力很小的游戏中与墙壁和地板的碰撞?
- 他们是否遵循运动路径并确定最近的连接瓷砖?(有点搜索)(先验)
- 他们是否确定了与地板的碰撞,然后找出了调整角色的最佳方法?(后验)这在时间步长可变的情况下是有风险的,如果你足够快,你可以跳过一个瓷砖。虽然我假设 NES 游戏的时间步长与电视的刷新率同步。
- 当你在地上时,重力是否总是影响你的性格?或者当你决定在瓷砖上行走时,你只是“关掉它”?当你从悬崖边缘走下来的时候呢?否则,您需要某种方法来确定您下方的瓷砖。
- 如果您与瓷砖相撞,您是否会找到该瓷砖的边缘并将您的角色移动到它的一侧(取决于行进方向)?
- 像超级银河战士和马里奥这样的倾斜瓷砖怎么样?
- 那些你可以从底部跳到顶部的“平台”呢?如果你在做“后验”,你将如何处理与这些瓷砖的碰撞?
我已经编写了一些基本上是“先验”的碰撞代码,因为它会搜索您将朝某个方向撞到的第一块瓷砖。我只是想知道是否有更好的方法。(也许只是使用事后碰撞检测)
例如,检查瓷砖碰撞是否向下移动的代码(我检查垂直然后水平移动):
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