在Pygame平台游戏中遇到烦人的精灵抖动(未解决但已关闭)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Pygame平台游戏中遇到烦人的精灵抖动(未解决但已关闭)相关的知识,希望对你有一定的参考价值。

我正试图在Pygame制作平台游戏。我是一个白痴,我没有上课,这可能会让我的工作变得更轻松。这是一个学校项目,它将在2天内到期,所以我没有时间实现课程。我试图让玩家与地面发生碰撞,但是当它发生时,我会得到精灵抖动(如同,精灵“略微反弹”)

以下是功能(touchGround处理地面碰撞):

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]

我很抱歉,如果我应该包括更多,但不管怎样,谢谢。

答案

这不是所有相关的代码,因此我们只能进行一些猜测,但从我所看到的:

  • 你为什么在while touching(...):touchingGround?这不是你的所有代码,但它看起来应该是if touching(...):。是因为这是你如何实现引力,使精灵“堕落”?如果是这种情况,你不应该这样做,while循环将几乎阻止任何其他更新。您应该在主while循环(具有事件的循环)期间更新每帧的y位置。
  • 通常情况下,如果一个精灵“抖动”,就意味着它来回走动,这反过来意味着它的位置正在改变,绘制,再次改变,再次绘制。这就是为什么你应该包含实际绘制精灵的循环。最有可能发生的事情是你在循环中多次检查和改变精灵的位置,这会使它产生抖动。

以上是关于在Pygame平台游戏中遇到烦人的精灵抖动(未解决但已关闭)的主要内容,如果未能解决你的问题,请参考以下文章

Python——项目-小游戏3-精灵?蓝精灵?

手势识别控制pygame精灵

Pygame入门 2022 使用精灵类重构

改变精灵动画速度(pygame)

0x01 [游戏制作]精灵动画类的实现--基于python3.7和pygame

Python进阶篇十一Pygame的精灵和碰撞检测