Можете ли вы иметь две функции с отдельными значениями FPS одновременно? - PullRequest
3 голосов
/ 01 марта 2020

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

Основная функция игры имеет: clock.tick(60). Я создал функцию, которая показывает шум (например, когда телевизор не имеет приема), и при 60 кадрах в секунду он работает слишком быстро. Если я добавлю режим ожидания, ожидание, задержку и т. Д. c., Он выглядит великолепно, но при перетаскивании элемента на экран возникает большая задержка. Я бы предпочел вообще не задерживать элементы, поэтому мне нужно знать, как замедлить функцию шума.

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 Ответ

2 голосов
/ 01 марта 2020

Создайте функцию, которая может генерировать поверхность «пробела». Сгенерированная поверхность возвращается из функции:

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

Создайте еще одну функцию, которая blit s отображает поверхность окна:

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

Blit поверхность к окну в каждом кадре , но генерировать новую случайную «пробел» поверхность реже. Это приводит к тому, что один и тот же «пробел» отображается для нескольких кадров:

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)

    # [...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...