2012-04-26 5 views
0

Я создал простую систему баллов для своего pygame. но это приостанавливает игру. Я знаю, что это из-за time.sleep, но я не разбираюсь в этом.Pygame простая система баллов

Система баллов составляет до +100 каждые 5 секунд, в то время как начало верно, код:

while start == True: 
    time.sleep(5) 
    score = score + 100 

Полный код с отступом: http://pastebin.com/QLd3YTdJ код на линии: 156-158

Спасибо

+1

'x == True' никогда не то, что вы хотите. просто сделайте 'while start:' – habnabit

+0

Возможно, вас заинтересует [pygame.time] (http://www.pygame.org/docs/ref/time.html). – James

ответ

2

Если я правильно вас понимаю, вы не хотите, чтобы цикл while True: score += 100 блокировал всю вашу программу?

Вы должны решить, перемещая счет добавления в отдельной функции и использовать intervalfunction из APScheduler http://packages.python.org/APScheduler/intervalschedule.html

from apscheduler.scheduler import Scheduler 

# Start the scheduler 
sched = Scheduler() 
sched.start() 

# Schedule job_function to be called every 5 seconds 
@sched.interval_schedule(seconds=5) 
def incr_score(): 
    score += 100 

Это приведет к APScheduler создания потока для вас работает функция каждые 5 секунд.

Возможно, вам понадобится внести некоторые изменения в функцию, чтобы заставить ее работать, но она должна начать работать как минимум :).

+0

, который выглядит как идеальное решение для использования, но я получаю этот импорт ошибок Scheduler ImportError: Нет модуля с именем Scheduler, любая идея? – ErHunt

+0

Вы должны установить его, т.е. 'pip install apscheduler' – DMan

3

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

Что-то вроде этого:

scoreIncrementTimer = 0 
lastFrameTicks = pygame.time.get_ticks() 
while start == True: 
    thisFrameTicks = pygame.time.get_ticks() 
    ticksSinceLastFrame = thisFrameTicks - lastFrameTicks 
    lastFrameTicks = thisFrameTicks 

    scoreIncrementTimer = scoreIncrementTimer + ticksSinceLastFrame 
    if scoreIncrementTimer > 5000: 
     score = score + 100 
     scoreIncrementTimer = 0 

Это может быть легко улучшено (что, если ваша частота кадров настолько мала, что есть более чем на 5 секунд между кадрами?), Но общая идея. Это обычно называют реализацией таймера тайм-тайма.

Смежные вопросы