Помогите сделать столкновение объектов

Сижу туплю уже неделю. Необходимо, чтобы игрок прыгал по платформам. Желательно чтоб коллизия срабатывала только сверху вниз на платформу, но не обязательно. Сейчас коллизия срабатывает, но положение игрока скачет при каждом прыжке.

Вот ссылка на сам проект: https://drive.google.com/file/d/1V-AlNgjXTsAZS2hkkgnMk_6tHRn5mFaA/view?usp=sharing

import pygame
import random

class Sprite():
    def __init__ (self, x, y, speed, img, speedy, jumppower):
        self.image = pygame.image.load(img)
        self.speed = speed
        self.speedx = 0
        self.speedy = speedy
        self.jumppower = jumppower
        self.rect = self.image.get_rect(topleft = (x, y))
        self.width = self.image.get_rect().width
        self.height = self.image.get_rect().height

class Ground(pygame.sprite.Sprite):
    def __init__ (self, x, y, img):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load(img)
        self.rect = self.image.get_rect(topleft = (x, y))

WIDTH = 1200
HEIGHT = 760
FPS = 30
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)

pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("My Game")
clock = pygame.time.Clock()
pygame.display.flip()

bg = pygame.image.load("image/background1.png")
pygame.display.set_icon(pygame.image.load("image/icon.png"))

isJump = False
g = 1
numbers = ["UP"]
bg_x = 0
nCadr=0

PLAYERWalk = ["image/playerAnim/Walk/1.png",
               "image/playerAnim/Walk/2.png",
               "image/playerAnim/Walk/3.png",
               "image/playerAnim/Walk/4.png",
               "image/playerAnim/Walk/5.png",
               "image/playerAnim/Walk/6.png"]

PLAYER = Sprite(WIDTH/4, -30, 10, "image/playerAnim/Walk/1.png", 10, 20)

grounds = pygame.sprite.Group()

grounds.add(Ground(100, 300, 'image/grass/grassHalf.png'))
grounds.add(Ground(250, 450, "image/grass/grassHalf.png"))
grounds.add(Ground(450, 200, "image/grass/grassHalf.png"))
grounds.add(Ground(1500, 200, "image/grass/grassHalf.png"))
grounds_list = list(grounds)

keys = pygame.key.get_pressed()

running = True
while running:
    nCadr += 1
    # Держим цикл на правильной скорости
    clock.tick(FPS)
    # Ввод процесса (события)
    for event in pygame.event.get():
        # проверка нажатия на кнопку закрыть
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    if keys[pygame.K_RIGHT]:
        PLAYER.image = pygame.image.load(PLAYERWalk[nCadr % len(PLAYERWalk)])
        bg_x -= PLAYER.speed / 2
        for ground in grounds:
            ground.rect.x -= PLAYER.speed
    elif keys[pygame.K_LEFT]:
        PLAYER.image = pygame.transform.flip(pygame.image.load(PLAYERWalk[nCadr % len(PLAYERWalk)]), True, False)
        bg_x += PLAYER.speed / 2
        for ground in grounds:
            ground.rect.x += PLAYER.speed

    if not isJump:
        if keys[pygame.K_UP]:
            isJump = True
    else:
        if PLAYER.jumppower >= 0:
            PLAYER.rect.y -= (PLAYER.jumppower ** 2) / 20
            PLAYER.jumppower -= 1
        else:
            isJump = False
            PLAYER.jumppower = 20
    
    index_of_collision = pygame.sprite.spritecollideany(PLAYER, grounds)
    if index_of_collision is None:
        PLAYER.speedy += g
        #print("no")
    elif PLAYER.speedy > 0:
        PLAYER.speedy = 0
        #print("yes")
    PLAYER.rect.y += PLAYER.speedy


    if bg_x == -WIDTH or bg_x == WIDTH:
        bg_x = 0

    screen.blit(bg, (bg_x - WIDTH, 0))
    screen.blit(bg, (bg_x, 0))
    screen.blit(bg, (bg_x + WIDTH, 0))
    grounds.draw(screen)

    screen.blit(PLAYER.image, (PLAYER.rect.topleft))

    pygame.display.update()

pygame.quit()

Ответы (1 шт):

Автор решения: Pro 9

используешь arcade и не паришься. там для этого есть специальный физический движок для платформера. вhttps://api.arcade.academy/en/2.6.7/tutorials/pymunk_platformer/index.html сам писал игру на pygame, но после проблем с оптимизацией перешёл на arcade, на который код перенёс без труда.

→ Ссылка