我一直致力于为我的最终项目制作一款类似于Gungeon的游戏。碰撞是使用网格系统进行的,并且碰撞从文本文件加载并转换为碰撞网格。我希望碰撞只限制与某物碰撞的轴。例如,如果您向西北方向进入垂直墙,则只能向北移动。所以我尝试实现这一点的方法是根据鼠标输入预测玩家的未来位置。我这样做是使用一个检测鼠标输入并返回'moveX'和'moveY'变量的函数,该变量是玩家在没有碰撞任何东西时应该移动的距离。
然后,我创建了两个矩形对象,我应用了水平移动,并应用了垂直移动。
newPlayerRectX = p.Rect(movePlayerRect[0]+moveX,movePlayerRect[1],movePlayerRect[2],movePlayerRect[3])
newPlayerRectY = p.Rect(movePlayerRect[0],movePlayerRect[1]+moveY,movePlayerRect[2],movePlayerRect[3])
然后我检查他们中的任何一个是否与任何东西发生碰撞,如果他们碰到了,我只是限制了那个方向的运动,如果他们没有,我只是移动了函数预测的数量。 'collideList'就是所有靠近玩家的碰撞对象。
#Check to see if the player collides with anything near it
for i in range(len(collideList)):
if newPlayerRectX.colliderect(collideList[i][-1]) == True:
xoffset = False
elif newPlayerRectY.colliderect(collideList[i][-1]) == True:
yoffset = False
#Move player
if xoffset == True:
curPlayer.X += moveX
if yoffset == True:
curPlayer.Y += moveY
然而,有时候玩家只会穿过固体块。我似乎无法弄明白为什么。我的玩家的碰撞盒比实际的地图碰撞小。如果有人能提供帮助,那将非常感激。