Как отсчитать время в 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 шт):
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
При событии "столкновение" надо запустить таймер (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