Search code examples
pythonpython-3.xpygameintervals

Decrease interval by n after n seconds in Pygame


I have a pygame event (called bubble_spawn_event), which has an interval (called bubble_spawn_interval) of 1000. How do I make that interval go down by say, 0.1 seconds every 10 seconds?

I've tried to create a separate event (called bubble_interval_change_event) that has an interval (bubble_interval_change_interval) of 10 seconds, and when that event happens, decrease the bubble_spawn_interval by 0.1 seconds, then call pygame.time.set_timer() on the same event. (bubble_spawn_event)

I have defined the bubble spawn event and interval as following:

bubble_spawn_event = USEREVENT
bubble_spawn_interval = 1000
pygame.time.set_timer(bubble_spawn_event, bubble_spawn_interval)

The interval change event and interval have been defined as following:

bubble_interval_change_event = USEREVENT + 1
bubble_interval_change_interval = 10000

My attempt on changing the bubble spawn interval:

        elif event.type == bubble_interval_change_event:
            bubble_spawn_interval -= 200
            pygame.time.set_timer(bubble_spawn_event, bubble_spawn_interval)

My full main loop:

while running:
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        elif event.type == bubble_spawn_event:
            bubbles.add(Bubble(screen, random.randint(100, screen.get_width() - 100), screen.get_height()))
        elif event.type == bubble_interval_change_event:
            pygame.time.set_timer(bubble_spawn_event, 0)
            bubble_spawn_interval -= 200
            pygame.time.set_timer(bubble_spawn_event, bubble_spawn_interval)

    screen.blit(bg_image, (0, 0))

    bubbles.update()

    for bubble in bubbles:
        bubble.screen.blit(bubble.image, bubble.rect)
        bubble.move()

    pygame.display.update()
    clock.tick(60)

pygame.quit()

The problem is that the bubble spawn interval doesn't go down at all, even when I decrease the interval by 0.9 seconds.


Solution

  • You are apparently not resetting the timer:

    import pygame
    import random
    
    
    pygame.init()
    screen = pygame.display.set_mode((700, 400))
    
    spawn_bubble = pygame.USEREVENT
    spawn_bubble_timer = 1000
    pygame.time.set_timer(spawn_bubble, spawn_bubble_timer)
    
    reduce_timer = spawn_bubble + 1
    reduce_timer_timer = 5000
    pygame.time.set_timer(reduce_timer, reduce_timer_timer)
    
    run = True
    while run:
        pygame.time.Clock().tick(10)
        screen.fill((0, 0, 0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
            if event.type == spawn_bubble:
                pygame.draw.circle(screen, (255, 0, 0),
                                   (random.randint(0, 700), random.randint(0, 400)), 5)
            if event.type == reduce_timer:
                pygame.time.set_timer(spawn_bubble, 0)
                spawn_bubble_timer -= 200
                if spawn_bubble_timer <= 0:
                    spawn_bubble_timer = 200
                pygame.time.set_timer(spawn_bubble, spawn_bubble_timer)
    
        pygame.display.update()
    
    pygame.quit()
    

    Notice the line pygame.time.set_timer(spawn_bubble, 0), it removes the timer from that event. If you run this code you will see that as time progresses, the dots start appearing faster and faster. (capped at 200 ms so that it doesn't cancel itself or go into negatives, actually when capped could also cancel the reduce_timer event scheduling)

    P.S. this is literally the very first time I have used the .set_timer()method