


Программирование
+3Python Pygame помогите!
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
#игрок
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.image = pygame.Surface((32, 32))
self.image.fill(red)
self.rect = self.image.get_rect(x=width // 2, y=height // 2)
self.vel_y = 0
self.jump_power = 10
self.on_ground = False # Флаг, указывающий, находится ли игрок на земле
def update(self):
dx = 0
dy = 0
# Обработка нажатий клавиш
keys = pygame.key.get_pressed()
if keys[pygame.K_a]:
dx -= 5
if keys[pygame.K_d]:
dx += 5
# Гравитация
self.vel_y += 0.5
if self.vel_y > 10:
self.vel_y = 10
dy += self.vel_y
# Перемещение и обработка столкновений
self.rect.x += dx
self.collide(dx, 0, blocks)
self.rect.y += dy
self.collide(0, dy, blocks)
# Проверка столкновений с границами экрана
if self.rect.bottom > height:
self.rect.bottom = height
self.vel_y = 0
if self.rect.top < 0:
self.rect.top = 0
self.vel_y = 0
# Проверка, стоит ли игрок на блоке (более lenient)
self.on_ground = False
for block in blocks:
if self.rect.bottom <= block.rect.top + 2 and self.vel_y >= 0:
self.on_ground = True
self.vel_y = 0 # Reset vertical velocity when landing
break
# Прыжок (с небольшой toleranc)
if keys[pygame.K_SPACE] and self.rect.bottom >= block.rect.top - 5:
self.vel_y = -self.jump_power
def collide(self, dx, dy, blocks):
for block in blocks:
if self.rect.colliderect(block.rect):
if dx > 0: # Движение вправо
self.rect.right = block.rect.left
if dx < 0: # Движение влево
self.rect.left = block.rect.right
if dy > 0: # Движение вниз
self.rect.bottom = block.rect.top
self.vel_y = 0
if dy < 0: # Движение вверх
self.rect.top = block.rect.bottom
self.vel_y = 0
всё работает без ошибок, но игрок просто завис в воздухе и не двигается (в моей игре есть еще объекты по которым понятно что он не двигается)
По дате
По рейтингу
Возможно проблема такая:
if keys[pygame.K_SPACE] and self.rect.bottom >= block.rect.top - 5: ограничено лишь одним блоком block.
Нужно переписать условие прыжка, чтобы проверять, стоит ли игрок на любом блоке вообще. Вот как можно это сделать:
12345
# Прыжок (с небольшой toleranc)
if keys[pygame.K_SPACE] and self.on_ground:
self.vel_y = -self.jump_power
Больше по теме