Испытывает раздражающее дрожание спрайта в платформе Pygame (не решено, но закрыто) - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь сделать платформер в 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]

Извините, еслиЯ должен был включить больше, но все равно спасибо.

1 Ответ

0 голосов
/ 05 марта 2019

Это не весь соответствующий код, поэтому можно только немного догадаться, но из того, что я вижу:

  • Почему у вас есть while touching(...): in touchingGround?Это не весь ваш код, но похоже, что он должен быть if touching(...):.Это потому, что именно так вы реализуете гравитацию, чтобы спрайт "упал"?Если это так, вам не следует делать это таким образом, цикл while в значительной степени заблокирует любое другое обновление.Вам следует обновлять позицию y в каждом кадре во время вашего основного цикла while (тот, что содержит события).

  • Обычно, если спрайт "дрожит", это означает, что он возвращается ивперед, что, в свою очередь, означает, что его позиция изменяется, оттягивается, снова изменяется, вновь рисуется.Вот почему вы должны были включить цикл, в котором вы фактически рисуете спрайт.Скорее всего, происходит то, что вы проверяете и меняете положение спрайта несколько раз в цикле, и это вызывает его дрожание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...