我一直在阅读有关在计算器和其他网站游戏的碰撞检测。 他们中的很多谈论的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