Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Python Pygame помогите!

Wqwqw Wqefhgiff Мастер (1056), открыт 2 недели назад
 #игрок 
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
всё работает без ошибок, но игрок просто завис в воздухе и не двигается (в моей игре есть еще объекты по которым понятно что он не двигается)
1 ответ
yungh47e Профи (752) 2 недели назад
Возможно проблема такая:
if keys[pygame.K_SPACE] and self.rect.bottom >= block.rect.top - 5: ограничено лишь одним блоком block.

Нужно переписать условие прыжка, чтобы проверять, стоит ли игрок на любом блоке вообще. Вот как можно это сделать:

  # Прыжок (с небольшой toleranc)  

if keys[pygame.K_SPACE] and self.on_ground:

self.vel_y = -self.jump_power
Похожие вопросы