3

In a pygame code I wannted to do a title that changes colors. I tried to do a simple title that changes colors, but it not even turned the color to blue (or do it for a second), and the program crash. The code:

title_font = pygame.font.SysFont("monospace", TITLE_SIZE)

while True:
    title = title_font.render("game", 5, RED)
    game_display.blit(title, TITLE_POS)
    pygame.display.update()
    pygame.time.wait(2000)

    title = title_font.render("game", 5, BLUE)
    game_display.blit(title, TITLE_POS)
    pygame.display.update()
    pygame.time.wait(3000)

    title = title_font.render("game", 5, RED)
    game_display.blit(title, TITLE_POS)
    pygame.display.update()
    pygame.time.wait(2000)

It also happens with pygame.time.delay(), and I don't know where is the problem...

Python
  • 127
  • 1
  • 14

1 Answers1

3

Don't use pygame.time.wait or delay because these functions make your program sleep for the given time and the window becomes unresponsive. You also need to handle the events (with one of the pygame.event functions) each frame to avoid this.

Here are some timer examples which don't block: Countdown timer in Pygame

To switch the colors, you can just assign the next color to a variable and use it to render the text.

import pygame


pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
title_font = pygame.font.SysFont('monospace', 50)
BACKGROUND_COLOR = pygame.Color('gray12')
BLUE = pygame.Color('blue')
RED = pygame.Color('red')
# Assign the current color to the color variable.
color = RED
timer = 2
dt = 0

done = False
while not done:
    # Handle the events.
    for event in pygame.event.get():
        # This allows the user to quit by pressing the X button.
        if event.type == pygame.QUIT:
            done = True

    timer -= dt  # Decrement the timer by the delta time.
    if timer <= 0:  # When the time is up ...
        # Swap the colors.
        if color == RED:
            color = BLUE
            timer = 3
        else:
            color = RED
            timer = 2

    screen.fill(BACKGROUND_COLOR)
    title = title_font.render('game', 5, color)
    screen.blit(title, (200, 50))

    pygame.display.flip()
    # dt is the passed time since the last clock.tick call.
    dt = clock.tick(60) / 1000  # / 1000 to convert milliseconds to seconds.

pygame.quit()
skrx
  • 19,980
  • 5
  • 34
  • 48