pygame: задержка огня игрока

1

Я хочу иметь задержку между стрельбой для моего персонажа. Раньше я делал это раньше в Java, например:

    if (System.currentTimeMillis() - lastFire < 500) {
        return;
    }       

    lastFire = System.currentTimeMillis();
    bullets.add(...);

Однако, как я могу сделать это в pygame, чтобы получить этот sys currentTimeMillis. Вот как выглядит мой метод run (game loop):

time_passed = 0
while not done:

    # Process events (keystrokes, mouse clicks, etc)
    done = game.process_events()

    # Update object positions check for collisions...
    game.update()

    # Render the current frame
    game.render(screen)

    # Pause for the next frame
    clock.tick(30)

    # time passed since game started
    time_passed += clock.get_time()

Как вы можете видеть в предыдущем коде, я создал время, но я не уверен, что это правильный способ кодирования и что еще не хватает.

Теги:
pygame

2 ответа

1
Лучший ответ

Ваш код в порядке, если game.process_events и game.update работают так, как ожидалось.

Edit: Используйте pygame.time.get_ticks вместо часов, о которых я упоминал ранее. Он использовал модуль времени python, так что часы и часы в вашем коде означали разные часы. Это намного лучший способ.

#this should be done only once in your code *anywhere* before while loop starts
newtime=pygame.time.get_ticks()

# when you fire, inside while loop
# should be ideally inside update method
oldtime=newtime
newtime=pygame.time.get_ticks()
if newtime-oldtime<500: #in milliseconds 
    fire()

Позвольте мне объяснить вам, что возвращает pygame.time.get_ticks():

  • При первом вызове он возвращает время с pygame.init()
  • При всех последующих вызовах он возвращает время (в миллисекундах) от первого вызова get_ticks.

Итак, мы сохраняем старое время и выписываем его из нового времени, чтобы получить разницу времени.

  • 0
    Так что я должен также написать newtime = clock внутри класса Player?
  • 0
    Зависит от того, где вы хотите поместить его, должно быть внутри какого-то метода, который запускается один раз до запуска цикла. __init__ - хороший выбор.
Показать ещё 2 комментария
0

Или, еще проще, вы можете использовать pygame.time.set_timer

Перед вашей петлей:

    firing_event = pygame.USEREVENT + 1
    pygame.time.set_timer(firing_event, 500)

Затем событие типа firing_event будет помещено в очередь каждые 500 миллисекунд. Вы можете использовать это событие, чтобы сигнализировать о том, когда стрелять.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню