检测两个矩形之间的碰撞非常简单,但确保它们在2D游戏中不会碰撞墙壁是非常困难的。我已经管理了它,但是它有问题,并且每个刻度需要大约14个if语句以防止玩家穿过墙壁。
if wall_bottom > entity_top and wall_top < entity_bottom: # is player between y min and max
if entity_left >= wall_right - entity.max_velocity: # is the player on the right side of the box (in or out)
if (entity_left + entity.x_velocity) < wall_right: # will the player be past the right side
if entity.x_velocity < 0: # is the player's velocity heading left (into right side)
entity.x = wall_right # x coord changed to edge of wall
entity.x_velocity = 0 # velocity reset, wall stops player
elif entity_right <= wall_left + entity.max_velocity and \
(entity_right + entity.x_velocity) > wall_left and \
entity.x_velocity > 0:
entity.x = wall_left - entity.x_length
entity.x_velocity = 0
if wall_right > entity_left and wall_left < entity_right: # is player between x min and max
if entity_top >= wall_bottom - entity.max_velocity and \
(entity_top + entity.y_velocity) < wall_bottom and \
entity.y_velocity < 0:
entity.y = wall_bottom
entity.y_velocity = 0
elif entity_bottom <= wall_top + entity.max_velocity and \
(entity_bottom + entity.y_velocity) > wall_top and \
entity.y_velocity > 0:
entity.y = wall_top - entity.y_length
entity.y_velocity = 0
我定义了所有实体的边缘,并检查玩家是否会在未来碰撞一帧,然后将坐标设置为玩家所在框的一侧。这个解决方案不够优雅,并且有很多错误。我一直试图想出一个更好的解决方案,但似乎无法找到一种简单的方法。我错过了一些明显的东西吗
答案 0 :(得分:0)
由于您的代码非常适合您的项目,我将帮助您使用此概念,然后您可以将其应用于您的程序。 一种方法是将玩家的位置与移动功能内边缘的位置进行比较,假设你有类似的东西:
glpk-hs.cabal
你可以看到条件在移动函数内,通过这样做,玩家永远不会与墙碰撞,因为移动函数本身正在检查玩家的位置是否永远不会与墙的位置相匹配,或者其他什么你想避免的障碍,包括其他玩家。