Заморозка переменной через time.sleep() не работает

Рейтинг: 0Ответов: 3Опубликовано: 12.03.2023

Форумчане, вечер добрый, есть функция shoot, цикл которой должен засыпать на время, но при добавлении time.sleep() весь код перестает работать.

def shoot():
    global by
    while by > -20:
        by-=5
        screen.blit(bulletimage, (bx+21, by))
    by = 550

Вот весь код:

import pygame as pg
import time

pg.init()

screen = pg.display.set_mode((600,700))

FPS = 60
clock = pg.time.Clock()

ex = 0
enmoveside = 'right'
bx = 0
by = 550
px = 250

#Загрузка спрайтов
bulletimage = pg.image.load('bullet.png')
shipimage = pg.image.load('angryship.png')
friendlyshipimg = pg.image.load('friendlyship.png')
bgimg = pg.image.load('bg_cosmo.png')

#Функция выстрела
def shoot():
    global by
    while by > -20:
        by-=5
        screen.blit(bulletimage, (bx+21, by))
    by = 550

        
while True:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            pg.quit()
            quit
    
    #отрисовка бэкграунда
    screen.blit(bgimg, (0, 0))
    
    #Проверка нажатия мыши и запуск функции выстрела
    mpressed = pg.mouse.get_pressed()
    if mpressed[0]:
        bx = px
        shoot()

    #отрисовка спрайтов    
    screen.blit(shipimage, (ex,250))
    screen.blit(friendlyshipimg, (px,550))

    #movement
    key = pg.key.get_pressed()
    if key[pg.K_a]:
        px -= 5
    if key[pg.K_d]:
        px += 5

    #barriers
    if px < 0:
        px = 0
    if px > 500:
        px = 500
    
    
    #enemy move
    if enmoveside == 'right':
        ex += 2
        if ex > 500:
            enmoveside = 'left'
    else:
        ex -= 2
        if ex < 0:
            enmoveside = 'right'

    clock.tick(FPS)
    pg.display.update()

Ответы

▲ 0

В чем заключается вопрос? Если вы про то - почему код зависает, то все логично. Игра - бесконечный цикл в котором бесконечно повторяются функции. Засовываешь в функцию time.sleep - останавливаешь весь код, ведь цикл бесконечно пока истинно True будет выполнять эту функцию и слипать цикл, т.е саму игру на 1 секунду.

▲ -1
import time

start = time.time()

def shoot():
    end = time.time() - start
    if end >= 1:
        global by
        while by > -20:
            by-=5
            screen.blit(bulletimage, (bx+21, by))
        by = 550
        start = time.time()
▲ -2
  1. импортируйте модуль time

  2. time.sleep(t)

    t — это количество секунд, на которое выполнение должно быть приостановлено(в секундах). Если Вы не укажите t, то вылезет, вроде, ошибка TypeError: time.sleep() takes exactly one argument (0 given)