Pygame заполнить и блиц не редактирует экран - PullRequest
0 голосов
/ 18 января 2019

Я знакомлюсь с Pygame и хочу написать простую игру, у меня уже есть следующий код:

import sys, pygame
pygame.init()

size = width, height = 640, 480
speed = [2, 2]
black = 0, 0, 0

screen = pygame.display.set_mode(size)

ball = pygame.image.load("intro_ball.gif")
ballrect = ball.get_rect()

bar = pygame.image.load("bar_low.gif")
barrect = bar.get_rect(center=(320,475))

over = pygame.image.load("game_over.gif")
overrect = over.get_rect(center=(width/2, height/2 ))

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_w:
                screen.fill(black)
                screen.blit(over, overrect)
                pygame.display.flip()
                pygame.time.delay(2000)


    keys = pygame.key.get_pressed()
    if keys[pygame.K_RIGHT] and barrect.right < width:
        barrect = barrect.move(4, 0)
        screen.blit(bar, barrect)
        pygame.display.update()
    if keys[pygame.K_LEFT] and barrect.left > 0:
        barrect = barrect.move(-4, 0)
        screen.blit(bar, barrect)
        pygame.display.update()
    ballrect = ballrect.move(speed)
    if ballrect.left < 0 or ballrect.right > width:
        speed[0] = -speed[0]
    if ballrect.top < 0 or (ballrect.bottom > height - bar.get_height() and ballrect.left < barrect.right and ballrect.right > barrect.left):
        speed[1] = -speed[1]
    if ballrect.bottom > height:
        #irrelevant


    screen.fill(black)
    screen.blit(ball, ballrect)
    screen.blit(bar, barrect)
    pygame.display.flip()

Он отлично работает, кроме части «если нажата w»: нужно заполнить черным, показать изображение «game_over» в течение двух секунд и продолжить работу. Вместо этого он замораживает все на две секунды и продолжает работать, как будто следующие строки никогда не существовали.

screen.fill(black)
screen.blit(over, overrect)
pygame.display.flip()

Не могли бы вы сказать, что я делаю не так?

1 Ответ

0 голосов
/ 19 января 2019

Положение бара (barrect), положение мяча (ballrect) и скорость (speed) должны быть установлены в исходное состояние после перезапуска игры:

Создайте функцию, которая инициализирует состояния игры:

def InitGame():
    global ballrect, barrect, speed
    speed = [2, 2]
    ballrect = ball.get_rect()
    barrect = bar.get_rect(center=(320,475))  

Вызовите ее один раз при запуске:

screen = pygame.display.set_mode(size)

ball = pygame.image.load("intro_ball.gif")
bar = pygame.image.load("bar_low.gif")
over = pygame.image.load("game_over.gif")
overrect = over.get_rect(center=(width/2, height/2 ))

InitGame();

Вызовите ее снова, когда игра должна быть перезапущена.Я рекомендую не откладывать игру на pygame.time.delay().Подсчитайте время, когда игра должна быть перезапущена starttime.Нарисуйте экран игры или экран «игра окончена» в зависимости от времени:

starttime = 0
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_w:

                # reset game and init the new start time
                InitGame()
                starttime = pygame.time.get_ticks() + 2000

    if pygame.time.get_ticks() > starttime: 

        keys = pygame.key.get_pressed()
        # [...]

        screen.fill(black)
        screen.blit(ball, ballrect)
        screen.blit(bar, barrect)

    else:

        screen.fill(black)
        screen.blit(over, overrect)

    pygame.display.flip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...