3 回答
TA贡献1827条经验 获得超7个赞
您可以通过二分搜索轻松获得精确(如果不是精确)解决方案:一旦在整个步骤结束时检测到碰撞,请尝试半步,然后是四分之一或四分之三,依此类推。这将碰撞测试视为移动距离的布尔值函数并寻找“零”(实际上是从未命中到命中的过渡)。
请注意,这无助于解决问题剪裁通过薄壁或角(在最初的碰撞测试未能检测到障碍物时),并用复杂的障碍,会发现一个任意边缘(不一定是第一个)停止在。
TA贡献1801条经验 获得超16个赞
我决定采用 skrx 在他的评论中建议的方法:基本上备份 1px 直到不再发生碰撞。
if pressed_keys[pygame.K_s]:
temp_position = [robot.rect.x, robot.rect.y]
temp_position[1] += speed
offset_x = temp_position[0] - obstacle.rect.x
offset_y = temp_position[1] - obstacle.rect.y
overlap = obstacle.mask.overlap(robot.mask, (offset_x, offset_y))
if overlap is None:
robot.rect.y += speed
else:
for step_speed in range(1, speed - 1):
collision[1] -= 1
offset_x = collision[0] - obstacle.rect.x
offset_y = collision[1] - obstacle.rect.y
overlap_adj = obstacle.mask.overlap(robot.mask, (offset_x, offset_y))
if overlap_adj is None:
robot.rect.y += (speed - step_speed)
break
这是一个有点笨拙的方法,但它会满足我现在的需要并保持矢量数学在海湾。对于那些正在寻找使用归一化向量等解决此问题的正确方法的人,我建议使用提供的答案 skrx。我可能会回到这个问题并在将来更新它。但就目前而言,这将为用户提供关于如何进行完美碰撞的几个选项。
添加回答
举报