Как отсчитать время в Pygame?

Есть игра написана на Python, в которой, когда сталкивается некий объект с главным персонажем, то персонаж меняет картинку и приобретает другое свойство (усиление). Это все я организовал правильно и все работает.

Но как я могу "подержать" это состояние персонажа только, скажем, 30 секунд и потом вернуть все назад ?

Я почитал доки Pygame, в частности о модуле time, который там есть, но не до конца разобрался

Понял только, что мне вряд ли поможет pygame.time.get_ticks() ведь он отмеряет милисекунды с момента pygame.init(), а мне нужно, чтобы время отсчитывалось от столкновения персонажа с объектом.

Также изучил pygame.time.Clock() и связанные с ним методы, но не до конца понимаю как применить их в моей игре.

Код ниже:

def check_capsule_shield_ship_collision(sw_settings, screen, capsules_shield, ship, aliens_bullets):
    #Вот персонаж сталкивается с объектом
    if pygame.sprite.spritecollide(ship, capsules_shield, True):
        #Меняет картинку
        ship.image = pygame.image.load('images/starship_shieldd.png')
        #Приобретает новое свойство
        ship.shield = True
    
        #Это все нужно дать только на 30 секунд и потом вернуть назад прежнюю картинку и убрать данное свойство

Спасибо за помощь


Ответы (2 шт):

Автор решения: lubluborsh
import time


start_time = time.time()
end_time = 30
#Возможно ваша игра уже находится в отрисовке т.е уже в цикле
while True:
    current_time = int(time.time() - start_time)
    if current_time is end_time:
        ship.shield = False
        break
→ Ссылка
Автор решения: Alexander Chernin

При событии "столкновение" надо запустить таймер (pygame.time.set_timer()) с событием на какое-то время ( у вас это 30 секунд ), по истечении которого вернуть персонажу его первоначальное состояние.

Не ведаю как у вас там с архитектурой, но общий смысл такой:

# определим уникальную константу события
RECOVER_AFTER_COLLISION_EVENT = USEREVENT + 1

def check_capsule_shield_ship_collision(sw_settings, screen, capsules_shield, ship, aliens_bullets):
    # Вот персонаж сталкивается с объектом
    if pygame.sprite.spritecollide(ship, capsules_shield, True):
        # Меняет картинку
        ship.image = pygame.image.load('images/starship_shieldd.png')
        # Приобретает новое свойство
        ship.shield = True
    
        # Это все нужно дать только на 30 секунд и потом 
        # вернуть назад прежнюю картинку и убрать данное свойство
        # >> Даем на 30 секунд. Последний аргумент True, то есть событие одноразовое (см. док)
        pygame.time.set_timer(RECOVER_AFTER_COLLISION_EVENT, 3000, True)

Где-то должен же быть главный цикл событий приложения, тогда:

while True: # Главный цикл событий
  # ...
  # Нет ли нужного события в очереди?
  if pygame.event.get(RECOVER_AFTER_COLLISION_EVENT):
    # есть!
    # Теперь надо получить доступ к объекту, 
    # которому надо вернуть первоначальный вид
    # Допустим получили (выбора у нас нет - получить надо по-любому), тогда
    ship.image = pygame.image.load('images/starship_default.png')
    ship.shield = False   
→ Ссылка