Can you have two functions with separate FPS values at the same time?

Viewed 43

I'm working on a game that shows Python drawn images on the screen and occasionally the user needs to click and drag an item from an inventory to have some collision on the screen.

The main function of the game has: clock.tick(60). I created a function that shows noise (like when a TV doesn't have reception) and at 60 FPS, it runs way too fast. If I add a sleep, wait, delay, etc., it looks great, but, then dragging an item on the screen has a lot of lag. I would prefer to not have the items lag at all, so I need to know how to slow down the noise function.

def whitespace(surface, rect):
    pixel_size = 4
    pixel_length = rect.h / pixel_size
    pixel_height = rect.w / pixel_size
    start = rect.x

    pixel_grid = [[1]*int(pixel_height) for n in range(int(pixel_length))]

    colors = [(255, 255, 255), (205, 205, 205), (155, 155, 155), (100, 100, 100)]

    for row in pixel_grid:
        for col in row:
            color = random.randint(0, 3)
            surface.fill(colors[color], ((rect.x, rect.y), (pixel_size, pixel_size)))
            rect.x += pixel_size
        rect.y += pixel_size
        rect.x = start
1 Answers

Create a function that can generate the a "whitespace" surface. The generated surface is returned from the function:

def create_whitespace(rect):
    surface = pygame.Surface(rect.size)

    pixel_size = 4
    pixel_length = rect.h / pixel_size
    pixel_height = rect.w / pixel_size
    start = rect.x

    pixel_grid = [[1]*int(pixel_height) for n in range(int(pixel_length))]

    colors = [(255, 255, 255), (205, 205, 205), (155, 155, 155), (100, 100, 100)]

    for row in pixel_grid:
        for col in row:
            color = random.randint(0, 3)
            surface.fill(colors[color], (0, 0, pixel_size, pixel_size))
            rect.x += pixel_size
        rect.y += pixel_size
        rect.x = start

    return surface

Create another function which blits the surface the the window:

def draw_whitespace(surface, ws_surf, rect):
    surface.blit(ws_surf, rect)

Blit the surface to the window in every frame, but generate a new random "whitespace" surface less often. That causes that the same "whitespace" is draw for multiple frames:

ws_cnt = 0
while True:

    # [...]

    if ws_cnt == 0:
        ws_surf = create_whitespace(rect)
    ws_cnt += 1
    if ws_cnt == 5: # 5 is just an example
        ws_cnt = 0
    draw_whitespace(screen, ws_surf, rect)

    # [...]
Related