Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+3

Python 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