我已经花费了几天的时间对此主题进行广泛的研究,但似乎找不到解决我的确切问题的答案。
所以,我设置了一个简单的游戏,在这个游戏中,玩家位于0,0点,宽度为10x10。
player= pygame.Rect(0, 0, 10, 10)
除此以外,玩家的速度为x: 0, y: 10,这将使他下落(因为屏幕的原点在左上角,所以y是正数)。
而我有一个瓦片在0, 100的位置,如下图所示:
dirt= pygame.Rect(0, 100, 10, 10)
那么,我该如何处理碰撞呢?我已经知道我可以使用Rect.colliderect(Rect)来检测它。
我已经尝试了一些方法,但遇到了一些问题:
当玩家撞到物体时,我不能将他的速度减为0并将他移回到刚好触摸到物体的位置,因为这仍然会导致走路时的问题。当他行走时,我在x轴上施加+10的速度,但不幸的是,游戏仍然会处理他正在下落、碰撞和侧向移动,所以它只会将他移回到起始位置。
我是个初学者,所以希望得到一个简单的答案,并且如果可能的话,我希望不必使用任何第三方模块,除了pygame。
更新:
以下是我尝试过的粗略测试代码:
def sim(obj, time, world):
time= time / 1000
obj.physProp['vel']= (obj.physProp['vel'][0] + (accel[0] * time), obj.physProp['vel'][1] + (accel[1] * time))
if obj.physProp['vel'][1] > terminalY:
obj.physProp['vel']= (obj.physProp['vel'][0], terminalY)
obj.pos= (obj.pos[0] + (obj.physProp['vel'][0] * time) + ((accel[0] / 2) * (time ** 2)), obj.pos[1] + (obj.physProp['vel'][1] * time) + ((accel[1] / 2) * (time ** 2)))
for ID in world:
if obj.getRect().colliderect(world[ID].getRect()) == True:
pass
return (obj.pos, obj.physProp['vel'])