我正在尝试在pygame中制作平台游戏。我是个白痴,不使用课程,这可能会使我的工作更容易。这是针对学校项目的,这是在2天内到期的,所以我没有时间实施课程。我正在试图使玩家与地面碰撞,但是当它做到时,我会得到精灵抖动(如Sprite稍加弹跳》中)
这是功能(触摸台处理地面碰撞):
def touching(entityDat,entityRect,rlist,cpos):
entityRect.center = (entityDat[0] - cpos[0],entityDat[1] - cpos[1])
entityDat[4] = False
for i in rlist:
if entityRect.colliderect(i):
entityDat[4] = True
return True
def touchingGround(entityDat,entityRect,rlist,cpos,gravity):
while touching(entityDat,entityRect,rlist,cpos):
if entityDat[5]:
entityDat[1] += gravity/10
else:
entityDat[1] -= gravity/10
entityDat[3] = 0
if touching(entityDat,entityRect,rlist,cpos):
if entityDat[5]:
entityDat[1] += entityDat[3]
else:
entityDat[1] -= entityDat[3]
entityDat[3] = 0
def walk(entityDat,entityRect,rlist,cpos):
entityDat[0] += entityDat[2]
if touching(entityDat,entityRect,rlist,cpos):
entityDat[0] -= entityDat[2]
entityDat[2] = 0
这是运动处理程序:
if not moveLock:
#player movement
touching(playerDat,playerRect,rlist,cpos)
if jump or playerDat[3] < 4:
playerDat[3] += gravity
elif not touching(playerDat,playerRect,rlist,cpos):
playerDat[3] += gravity * 2
touchingGround(playerDat,playerRect,rlist,cpos,gravity)
playerDat[1] += playerDat[3]
playerDat[2] *= 0.7
if moveRight:
playerDat[2] += 3
if moveLeft:
playerDat[2] -= 3
if playerDat[2] > -0.5 or playerDat[2] < 0.5:
walk(playerDat,playerRect,rlist,cpos)
if touching(playerDat,playerRect,rlist,cpos) and jump == True:
playerDat[3] = 20
jump = False
playerRect.center = (playerDat[0] - cpos[0],playerDat[1] - cpos[1])
这是所有playerdat值的关键:
playerDat = [0:xPos,1:yPos,2:xMomentum,3:yMomentum,4:touchingGround,5:goingUp?,6:direction,7:frame]
我很抱歉,如果我应该包括更多,但无论如何都要感谢。
这并不是所有相关代码,因此只能猜测一点,而是我可以看到的:
-
为什么在
touchingGround
中有while touching(...):
?这并不是您的全部代码,但看起来应该是if touching(...):
。是因为这就是您如何实现重力,使精灵"秋天"?如果是这样,您不应该这样做,while
循环几乎会阻止其他任何更新。您应该在主while
循环期间(带有事件的一个)更新每个帧位置。 -
通常,如果精灵"摇晃",这意味着它正在来回,这又意味着其位置正在更改,绘制,再次改变,再次绘制。这就是为什么您应该包括实际绘制精灵的循环。最有可能发生的事情是您要在循环中多次检查和更改精灵的位置,这使其抖动。