我一直在从stackoverflow和其他网站上阅读有关游戏中碰撞检测的文章。很多文章都谈到BSP、边界椭圆、积分等。但是在NES上,他们成功地实现了游戏中的地面和墙壁碰撞检测,我很难相信他们会做出许多计算来检测墙壁碰撞。
我猜我的问题是,在由瓷砖组成的关卡中,像马里奥和洛克人这样的游戏如何检测与墙壁和地板的碰撞,考虑到处理能力很小。
- 他们是否遵循运动路径并确定最接近的连接瓷砖?(搜索)(先验) - 他们是否先确定与地面发生碰撞,然后找出最佳的调整方式?(后验)这在可变时间步长下很冒险,如果你够快,你可能会跳过一个瓷砖。尽管我认为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