@Neizvest

Как сделать чтобы функция в которой есть задержка не останавливала выполнение всего кода?

Есть такой код:
import pygame
import time

pygame.init()

gragon_size = 240
x_dragon = -240
y_dragon = 300

dragon_count = 0

screen = pygame.display.set_mode((1000, 700))  # станавливаем размеры окна

pygame.display.set_caption("Dragon")  # заголовок
done = True

dragon_anim = [pygame.image.load('C:\\Users\\pikro\\PycharmProjects\\Lessons\\gragon\\0.png'),
pygame.image.load('C:\\Users\\pikro\\PycharmProjects\\Lessons\\gragon\\1.png'), pygame.image.load('C:\\Users\\pikro\\PycharmProjects\\Lessons\\gragon\\2.png'),
pygame.image.load('C:\\Users\\pikro\\PycharmProjects\\Lessons\\gragon\\3.png'), pygame.image.load('C:\\Users\\pikro\\PycharmProjects\\Lessons\\gragon\\4.png')]


clock = pygame.time.Clock()

def Dragon():
    global dragon_count
    global x_dragon
    global y_dragon

    if dragon_count == 25:
        dragon_count = 0

    if x_dragon >= 1000 + gragon_size:
        x_dragon = -240
        y_dragon = 300
        time.sleep(2)  # только через 2 секунды снова полетит

    x_dragon += 4
    y_dragon -= 1
    screen.blit(dragon_anim[dragon_count // 5], (x_dragon, y_dragon))
    dragon_count += 1  # увеличивае


while done:
    clock.tick(30)  # кадров в сек
    screen.fill((255, 255, 255))
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            done = False

    keys = pygame.key.get_pressed()  # получаем зажатые кнопки

    if keys[pygame.K_ESCAPE]:  # выходим по esc
        done = False

    Dragon()
    pygame.display.flip()


В функции есть time.sleep, эта задержка должна не показывать дракона 2 сек., а после запускать функцию заново. Этот дракон как фоновый персонаж, просто так летает. Но если вставить этот код в основную игру, то на 2 сек. останавливается вся игра, как этого избежать?
  • Вопрос задан
  • 1292 просмотра
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Задержек быть не должно. Чтобы выполнять некоторый код с какой-то периодичностью, надо генерировать события с этой периодичностью и обрабатывать их:
import pygame

screen = pygame.display.set_mode((300, 200))
clock = pygame.time.Clock()
pygame.display.set_caption('Timer demo')

MOVE_DOWN_DELAY = 500
MOVE_DOWN_EVENT = pygame.USEREVENT + 1

pygame.time.set_timer(MOVE_DOWN_EVENT, MOVE_DOWN_DELAY)

dot = pygame.Rect(150, 10, 10, 10)

while True:
    clock.tick(50)

    if pygame.event.get(pygame.QUIT): break

    for e in pygame.event.get():
        if e.type == MOVE_DOWN_EVENT:
            dot.move_ip(0, 10)

    screen.fill((0, 0, 0))
    pygame.draw.rect(screen, (150, 150, 150), dot)
    pygame.display.flip()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@a2NaF
Нужны потоки
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
29 мар. 2024, в 10:00
10000 руб./за проект
29 мар. 2024, в 09:59
750 руб./в час
29 мар. 2024, в 09:55
50000 руб./за проект