Вопрос-Ответ

Countdown timer in Pygame

Таймер обратного отсчета в Pygame

Я начал использовать pygame и хочу создать простую игру. Один из элементов, который мне нужен, - это таймер обратного отсчета. Как я могу установить время обратного отсчета (например, 10 секунд) в PyGame?

Переведено автоматически
Ответ 1

Еще один простой способ - просто использовать систему событий pygame.

Вот простой пример:

import pygame
pygame.init()
screen = pygame.display.set_mode((128, 128))
clock = pygame.time.Clock()

counter, text = 10, '10'.rjust(3)
pygame.time.set_timer(pygame.USEREVENT, 1000)
font = pygame.font.SysFont('Consolas', 30)

run = True
while run:
for e in pygame.event.get():
if e.type == pygame.USEREVENT:
counter -= 1
text = str(counter).rjust(3) if counter > 0 else 'boom!'
if e.type == pygame.QUIT:
run = False

screen.fill((255, 255, 255))
screen.blit(font.render(text, True, (0, 0, 0)), (32, 48))
pygame.display.flip()
clock.tick(60)

введите описание изображения здесь

Ответ 2

На этой странице вы найдете то, что ищете http://www.pygame.org/docs/ref/time.html#pygame.time.get_ticks

Вы загружаете тики один раз перед началом обратного отсчета (который может быть триггером в игре - ключевым событием, чем угодно). Например:

start_ticks=pygame.time.get_ticks() #starter tick
while mainloop: # mainloop
seconds=(pygame.time.get_ticks()-start_ticks)/1000 #calculate how many seconds
if seconds>10: # if more than 10 seconds close the game
break
print (seconds) #print how many seconds
Ответ 3

В pygame существует событие таймера. Используйте pygame.time.set_timer() для повторного создания USEREVENT. например:

timer_interval = 500 # 0.5 seconds
timer_event = pygame.USEREVENT + 1
pygame.time.set_timer(timer_event , timer_interval)

Обратите внимание, в pygame могут быть определены клиентские события. Каждому событию нужен уникальный идентификатор. Идентификаторы пользовательских событий должны быть между pygame.USEREVENT (24) и pygame.NUMEVENTS (32). В данном случае pygame.USEREVENT+1 это идентификатор события для события timer.

Чтобы отключить таймер для события, установите для аргумента milliseconds значение 0.

Получает событие в цикле событий:

running = True
while running:

for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

elif event.type == timer_event:
# [...]

Событие таймера можно остановить, передав 0 параметру time.


Смотрите пример:

import pygame

pygame.init()
window = pygame.display.set_mode((200, 200))
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 100)
counter = 10
text = font.render(str(counter), True, (0, 128, 0))

timer_event = pygame.USEREVENT+1
pygame.time.set_timer(timer_event, 1000)

run = True
while run:
clock.tick(60)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
elif event.type == timer_event:
counter -= 1
text = font.render(str(counter), True, (0, 128, 0))
if counter == 0:
pygame.time.set_timer(timer_event, 0)

window.fill((255, 255, 255))
text_rect = text.get_rect(center = window.get_rect().center)
window.blit(text, text_rect)
pygame.display.flip()
Ответ 4

pygame.time.Clock.tick возвращает время в миллисекундах с момента последнего clock.tick вызова (дельта-время, dt), поэтому вы можете использовать его для увеличения или уменьшения переменной timer.

import pygame as pg


def main():
pg.init()
screen = pg.display.set_mode((640, 480))
font = pg.font.Font(None, 40)
gray = pg.Color('gray19')
blue = pg.Color('dodgerblue')
# The clock is used to limit the frame rate
# and returns the time since last tick.
clock = pg.time.Clock()
timer = 10 # Decrease this to count down.
dt = 0 # Delta time (time since last tick).

done = False
while not done:
for event in pg.event.get():
if event.type == pg.QUIT:
done = True

timer -= dt
if timer <= 0:
timer = 10 # Reset it to 10 or do something else.

screen.fill(gray)
txt = font.render(str(round(timer, 2)), True, blue)
screen.blit(txt, (70, 70))
pg.display.flip()
dt = clock.tick(30) / 1000 # / 1000 to convert to seconds.


if __name__ == '__main__':
main()
pg.quit()
python pygame