3 回答

TA貢獻1827條經(jīng)驗 獲得超8個贊
您可以通過二分搜索輕松獲得精確(如果不是精確)解決方案:一旦在整個步驟結(jié)束時檢測到碰撞,請嘗試半步,然后是四分之一或四分之三,依此類推。這將碰撞測試視為移動距離的布爾值函數(shù)并尋找“零”(實際上是從未命中到命中的過渡)。
請注意,這無助于解決問題剪裁通過薄壁或角(在最初的碰撞測試未能檢測到障礙物時),并用復(fù)雜的障礙,會發(fā)現(xiàn)一個任意邊緣(不一定是第一個)停止在。

TA貢獻1801條經(jīng)驗 獲得超16個贊
我決定采用 skrx 在他的評論中建議的方法:基本上備份 1px 直到不再發(fā)生碰撞。
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
這是一個有點笨拙的方法,但它會滿足我現(xiàn)在的需要并保持矢量數(shù)學在海灣。對于那些正在尋找使用歸一化向量等解決此問題的正確方法的人,我建議使用提供的答案 skrx。我可能會回到這個問題并在將來更新它。但就目前而言,這將為用戶提供關(guān)于如何進行完美碰撞的幾個選項。
添加回答
舉報