2014-12-03 3 views
0

Я работаю над игрой на питоне, используя pygame. Я хотел бы знать, могу ли я использовать pygame.time.Clock в, если заявление, чтобы увеличить переменную так:Могу ли я использовать pygame.time.Clock в выражении if?

mainclock = pygame.time.Clock() 
score = 0 

while True: 
    if mainclock == 0: 
     score += 1 

Я хотел бы для счет увеличится на один каждый второй, и если я понимаю часы() правильно, это должно работать, но я не знаю, использовать или не использовать Clock() в инструкции if. Спасибо за любую помощь заранее.

+0

Не являясь прямым ответом на ваш вопрос, вы можете переосмыслить, как вы обрабатываете время. Существует два распространенных метода: 1. постоянная длина кадра. 2. переменная длина кадра. В первом методе вы считаете, что каждый фрейм будет частью X секунды (обычно 60), поэтому каждый раз, когда вы просто добавляете значение/X. Во втором методе вы передаете временную дельту и умножаете ее на значение в секунду. – user3820547

ответ

1

Существует большое недоразумение того, как измерения времени и времени работают в PyGame. Вы можете использовать pygame.time.Clock(), но совершенно иначе.

ПРИМЕЧАНИЕ. Все приведенные ниже примеры кода - Python 3.4; если вы все еще используете Python 2.x и имеете проблемы с использованием кода, не стесняйтесь спрашивать.

Несколько Основ

Ваш сценарий бежит так быстро, как это возможно, поэтому в основном с каждым тиком вашей ОС, вы его обработан один раз, что, в зависимости от процессора вашего компьютера где-то около 100 раз в секунду ,

Теперь возникает вторая проблема: Clock() - это класс в модуле «время» Pygame, он не имеет значения сам по себе. Если вы позволяете вашей программе печатать «mainclock», выход будет: он никогда не будет равен 0, и поэтому ваш if-statement никогда не даст True и, таким образом, никогда не будет обработан вообще (и поэтому никогда не добавляйте 1 к «score»).

Вы поняли эту часть? Если нет, не стесняйтесь задавать дополнительные вопросы! Это некоторые основы, которые вы должны понимать, чтобы работать с практически любым языком программирования (по крайней мере, объектно-ориентированными).

Как решить вашу проблему

Вам потребуется pygame.time.Clock() для того, чтобы решить проблему, но по-другому, чем то, что вы сделали. Определить переменную как часы вашей игры, так же, как вы делали уже с «mainclock»:

mainclock = pygame.time.Clock() 

Класса Clock() есть метод, называемый «.tick()». Этот метод измеряет время с момента последнего прохода. Попробуйте: измените свой код на это и посмотрите, что он печатает!

while True: 
    print(mainclock.tick()) 

Или в Python 2.x: в то время как True: печать mainclock.tick()

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

>>> 
0 
35 
1 
2 
2 
1 
1 
1 
2 

и т.д ...

Это те Мили-секунды, так как сценарий был обработан последний раз. Это означает: когда прошло 1000 миллисекунд, прошла полная секунда. Теперь, чтобы использовать его для наших целей, мы просто должны добавить их вместе!

mainclock = pygame.time.Clock() 
tick_count = 0 
score = 0 

while True: 
    tick_count += mainclock.tick() 
    if tick_count >= 1000: 
     score += 1 
     tick_count = 0 
     print(score) 

Другим подходом было бы ограничить частоту кадров. Это можно сделать, добавив числовое значение к методу «.tick()» для Clock().

while True 
    mainclock.tick(60) 

Это заставит ваш скрипт никогда не работать быстрее, чем в 60 раз в секунду (предложение: сделать свой сценарий печати mainclock.tick (60) и посмотрим, что она дает!). Теперь мы можем сделать две вещи: либо мы принимаем этот факт и делить одну секунду на 60 или мы по-прежнему измеряют время, как мы делали раньше:

подход One - измерить время, как и раньше

mainclock = pygame.time.Clock() 
tick_count = 0 
score = 0 

while True: 
    tick_count += mainclock.tick(60) 
    if tick_count >= 1000: 
     score += 1 
     tick_count = 0 
     print(score) 

Понимаете, никаких серьезных изменений здесь нет. Мы просто говорим, что сценарий не работает быстрее, чем 60 раз в секунду, остальное остается неизменным. Если вы напечатаете «mainclock.tick (60)», теперь вы получите значения 16 или 17 за цикл, поскольку он ждет примерно того времени между тиками, чтобы убедиться, что он не работает чаще, чем 60 раз в секунду ,

подход Два - Разделив секунд ...

Так как мы сказали, программа не работать быстрее, чем в 60 раз в секунду, это также означает, что один тик занимает 1/60-ую секунды. Мы также можем сделать это:

mainclock = pygame.time.Clock() 
tick_count = 0 
score = 0 

while True: 
    tick_count += 1/60 # NOTE: in Python 2.x this has to be: 1.0/60 or 1/60.0! 
    if tick_count >= 1: 
     tick_count = 0 
     score += 1 
     print(score) 

или в качестве альтернативы:

mainclock = pygame.time.Clock() 
tick_count = 1 
score = 0 

while True: 
    tick_count -= 1/60.0 
    if tick_count <= 0: 
     tick_count = 1 
     score += 1 
     print(score) 

Надежда, это помогает! В противном случае не стесняйтесь спрашивать больше.