PyGame Как сделать гравитацию платформам и персонажу?

Помогите. Объясните мне, как мне сделать так , когда класс Pl (персонаж) находиться на платформе классов Gras он стоял на них, а если он не на них - то падает. Буду благодарен.

from json.encoder import INFINITY
from turtle import width
from numpy import Infinity
import pygame
import sys
import os

# Переменные
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
fps = 80 #частота кадров
ani = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 #циклы анимации
BLUE = (25,25,200)
BLACK = (23,23,23)
WHITE = (254,254,254)
ALPHA = (0,255,0)



# Изображения
standing_image = pygame.image.load("sto.png")  # Изображение для стоячего состояния
running_images = [pygame.image.load(f"run{i}.png") for i in range(1, 5)]  # Изображения для бега
jum_images = [pygame.image.load(f"jum{i}.png") for i in range(1, 3)]

# Блоки

# Флаг
flag = pygame.image.load("flag.png")

# Блок травы
Gras = pygame.image.load("gras.png") 
Gras2 = pygame.image.load("gras2.png") 
Gras3 = pygame.image.load("gras3.png")

# Размеры
w = standing_image.get_width()
h = standing_image.get_height()

# уменьшение стоячего
standing_image2 = pygame.transform.scale_by(standing_image, (0.65))
flag2 = pygame.transform.scale_by(flag, (0.65) )

scale_factor = 0.65  # коэффициент изменения размера (60%)


# уменьшение бега
scaled_frames = [pygame.transform.scale(frame, 
    (int(frame.get_width() * scale_factor), 
     int(frame.get_height() * scale_factor))) 
    for frame in running_images]

# уменьшение прыжков
scale_frames = [pygame.transform.scale(frame, 
    (int(frame.get_width() * scale_factor), 
     int(frame.get_height() * scale_factor))) 
    for frame in jum_images]


# Настройка

pygame.display.set_caption("Best Parkour Master | Tigran Gevorkyan")
pygame.display.set_icon(pygame.image.load("ико.png"))
clock = pygame.time.Clock()
pygame.init()
steps = 10 # пиксели для перемещения

# Скорость перемещения персонажа
speed = 5

# Цвет фона (если необходимо)
BACKGROUND_COLOR = (255, 255, 255)

# Загрузка изображений
background_image = pygame.image.load('pyfon2.png')

# Класс блоков

# флаг
class flg:
    def __init__(self):
        self.image = flag2
        self.rect = self.image.get_rect(topleft=(-1, 420))
        self.last_update = pygame.time.get_ticks()
        
    def draw(self, surface):
        surface.blit(self.image, self.rect)

# 1 трава
class gras:
    def __init__(self):
        self.image = Gras
        self.rect = self.image.get_rect(topleft=(730, 400))
        self.last_update = pygame.time.get_ticks()
        
    def draw(self, surface):
        surface.blit(self.image, self.rect)

# 2 трава
class gras2:
    def __init__(self):
        self.image = Gras2
        self.rect = self.image.get_rect(topleft=(280, 455))
        self.last_update = pygame.time.get_ticks()
        
    def draw(self, surface):
        surface.blit(self.image, self.rect)

# 3 трава
class gras3:
    def __init__(self, x, y):
        self.image = Gras3
        self.rect = self.image.get_rect(topleft=(x, y))
        self.last_update = pygame.time.get_ticks()
        
    def draw(self, surface):
        surface.blit(self.image, self.rect)

# Класс для персонажа
class pl:
    def __init__(self):
        self.image = standing_image2
        self.rect = self.image.get_rect(topleft=(-50, 250))
        self.is_running = False
        self.animation_index = 0
        self.animation_speed = 0.1  # Скорость анимации
        self.last_update = pygame.time.get_ticks()
        self.speed = 3  # Скорость движения персонажа
        self.direction = 0  # 0 - неподвижен, 1 - вправо, -1 - влево

    def update(self):
        keys = pygame.key.get_pressed()

        # Обработка нажатия клавиш W, A, S, D
        if keys[pygame.K_d]:  # Движение вправо
            self.rect.x += self.speed
            self.is_running = True
            self.image = scaled_frames[self.animation_index] if self.is_running else standing_image2
        elif keys[pygame.K_a]:  # Движение влево
            self.rect.x -= self.speed
            self.is_running = True
            self.image = pygame.transform.flip(scaled_frames[self.animation_index] if self.is_running else standing_image2, True, False)
            self.rect.x += speed * self.direction

        # elif keys[pygame.K_s]:  # Движение вниз (например, можно добавить в будущем)
        #     self.rect.y += self.speed
        #     self.is_running = True
        elif keys[pygame.K_SPACE]:  # Движение вверх (например, можно добавить в будущем)
            print("jump")
        else:
            self.is_running = False

        # Обновление анимации
        now = pygame.time.get_ticks()
        if self.is_running:
            if now - self.last_update > 90:  # 110 мс между кадрами
                self.animation_index = (self.animation_index + 1) % len(running_images)
                self.last_update = now
        else:
            self.animation_index = 0

    def draw(self, surface):
        surface.blit(self.image, self.rect)



# Главная программа
pla = pl()
gras1 = gras()
grass2 = gras2()
gras_list = [
    gras3(0, 525), # Начальный тройной блок
    gras3(500, 400)  # Более высокий тройной блок (2)
]
fla = flg()

clock = pygame.time.Clock()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # Обновление персонажа
    pla.update()

    # Отрисовка
    screen.blit(background_image, (0, 0))  # Заполнение фона белым цветом

    # Спрайты
    pla.draw(screen)
    gras1.draw(screen)
    grass2.draw(screen)

    for gras in gras_list: # type: ignore
        gras.draw(screen) # type: ignore

    fla.draw(screen)


    # Остальное
    pygame.display.flip()
    clock.tick(80)  # Ограничение по FPS

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