Breakout игра с Pygame - обработка событий

В данный момент я пытаюсь создать простую версию игры Breakout with Pygame. Проблема в том, что я хочу, чтобы моя летучая мышь двигалась по экрану, и для этого мне нужно иметь дело с событиями и тем фактом, что, когда вы нажимаете стрелку вправо / влево, летучая мышь мгновенно перемещается вправо / влево. Однако мой код не работает; длина летучей мыши увеличивается, а не просто движется всякий раз, когда я нажимаю клавишу. Я просмотрел коды и примеры, но я все еще потерян.

Вот мой код:

import pygame, sys

pygame.init()

width, height = 800, 600
screen = pygame.display.set_mode([width, height])
bat_speed = 30
bat = pygame.image.load('bat.png').convert()
batrect = bat.get_rect()

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:                        
                batrect = batrect.move(-bat_speed, 0)     
                if (batrect.left < 0):                           
                    batrect.left = 0      
            if event.key == pygame.K_RIGHT:                    
                batrect = batrect.move(bat_speed, 0)
                if (batrect.right > width):                            
                    batrect.right = width

    screen.blit(bat, batrect)
    pygame.display.flip()

pygame.quit()

1 ответ

Когда вы что-то моргаете на экране, оно останется там. Происходит то, что вы бьете летучую мышь в разных местах, создавая впечатление, что ширина летучей мыши увеличивается. Простым решением было бы очистить экран, прежде чем рисовать летучую мышь.

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:                        
                batrect = batrect.move(-bat_speed, 0)     
                if (batrect.left < 0):                           
                    batrect.left = 0      
            elif event.key == pygame.K_RIGHT:                    
                batrect = batrect.move(bat_speed, 0)
                if (batrect.right > width):                            
                    batrect.right = width

    screen.fill((0, 0, 0))  # This will fill the screen with a black color.
    screen.blit(bat, batrect)
    pygame.display.flip()

Также используйте elif вместо нескольких if когда вы не хотите проверять все условия, как я делал выше.

Другие вопросы по тегам