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