Есть ли способ контролировать итерацию функции в pygame?

#python #python-3.x #function #math #pygame

#python #python-3.x #функция #математика #pygame

Вопрос:

Я делал проект в Pygame, который требовал рендеринга случайного уравнения из equations списка в определенное время. Для достижения этой цели я написал функцию, в которой она отображала функцию, но я столкнулся с 2 проблемами.

  1. 1-я проблема заключается в том, что он повторяет функцию больше, чем я действительно хочу, я хочу, чтобы функция просто повторялась один раз. Под этим я подразумеваю, что он должен ОДИН РАЗ выбрать случайное уравнение из списка и отобразить его ОДИН РАЗ, чего не происходит.

  2. 2-я проблема находится на 30-й строке кода. В нем говорится if tks > 5000: display_equation() Но если я запускаю код, игра начинает повторять функцию, как только игра запускается, вместо того, чтобы ждать 5000-й миллисекунды игры, чтобы начать вызов функции.

Спасибо!

 import pygame
import random

pygame.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
done = False

equations = ['2   2', '3   1', '4   4', '7 - 4']


font = pygame.font.SysFont("comicsansms", 72)

tks = pygame.time.get_ticks()

def display_equation():
        text = font.render(random.choice(list(equations)), True, (0, 128, 0))
        screen.blit(text, (320 - text.get_width() // 2, 240 - text.get_height() // 2))

while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            done = True
    
    screen.fill((255, 255, 255))
    tks = pygame.time.get_ticks()
    if tks > 5000:
        display_equation()
    
    display_equation()
    pygame.display.update()
    clock.tick(60)
  

Ответ №1:

Чтобы код работал так, как вы хотите, внесите два изменения:

  • Визуализируйте фон только один раз, перед циклом
  • Создайте флаг, чтобы указать, что уравнение было отображено и нет необходимости повторно отображать его

Попробуйте этот код:

 eq_done = False
screen.fill((255, 255, 255))
while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            done = True
    
    tks = pygame.time.get_ticks()
    if tks > 5000 and not eq_done:
        display_equation()
        eq_done = True  # only render once
    
    pygame.display.update()
    clock.tick(60)