1

Тема: Виконання дії кожні n сек. у PyGame

Всіх вітаю. Потрібно зробити, щоб одна дія виконувалася раз у 250 мілісекунд (наприклад), друга - у 2 000. Маю такий код:

import pygame

pygame.init()
win = pygame.display.set_mode( (50, 50) )
clock = pygame.time.Clock()

state1 = False
state2 = False

event1 = pygame.USEREVENT + 1
pygame.time.set_timer( event1, 250 )

event2 = pygame.USEREVENT + 2
pygame.time.set_timer( event2, 2000 )

while True:
    
    for e in pygame.event.get():

        if e.type == event1:
            state1 = True
        else:
            state1 = False

        if e.type == event2:
            state2 = True
        else:
            state2 = False

    if state1:
        print( 'first event' )

    if state2:
        print( 'second event' )

    pygame.display.update()
    clock.tick( 50 )

Проблема в тому, що виконується тільки перший event1. Чому? Вже другий день сиджу над цією проблемою. Шукати одруки не треба, все скопійовано з інету, ще всюди один і той же код. От я і не можу зрозуміти, що не так. Може хтось допомогти, будь ласка?

2 Востаннє редагувалося Monolith (11.05.2018 14:44:58)

Re: Виконання дії кожні n сек. у PyGame

Все, здається я сам зрозумів. В одну і ту ж мілісекунду не можна викликати більше однієї дії. Я щось взагалі про це забув...  :D

3

Re: Виконання дії кожні n сек. у PyGame

Можете послатися на документацію?

4

Re: Виконання дії кожні n сек. у PyGame

Ні, дійшов до цього сам. В документації крім опису функції більше нічого немає. В Інтернеті теж такого не зустрічав.

5 Востаннє редагувалося koala (11.05.2018 16:10:21)

Re: Виконання дії кожні n сек. у PyGame

Тоді тут щось сильно не так. Це було б дурнувато - ігнорувати події з імовірністю 1/1000 через збіг часу. Поставте на другу подію 1999мс і подивіться.

6

Re: Виконання дії кожні n сек. у PyGame

Не виконується в один і той же час. Змінюєш хоча б на 1 мілісекунду - і все норм.

7 Востаннє редагувалося koala (12.05.2018 07:17:43)

Re: Виконання дії кожні n сек. у PyGame

Так, все, ми ідіоти.
Якщо pygame.event.get() повертає [event1], тоді
state1 == True
state2 == False
все ок.
Але якщо повертається [event2,event1]
тоді після першої ітерації
state1 == False
state2 == True
а після другої
state1 == True
state2 == False
Бачите, чому?

Виправлений варіант:

while True:

    state1 = False
    state2 = False
    for e in pygame.event.get():
        if e.type == event1:
            state1 = True
 
        if e.type == event2:
            state2 = True

Як би я писав (якби саме це було потрібно):

import pygame
 
pygame.init()
win = pygame.display.set_mode( (200, 200) )
clock = pygame.time.Clock()

TIMER_EVENTS = (pygame.USEREVENT + 1, pygame.USEREVENT + 2)
TIMER_EVENTS_DELAYS = (250,2000)
 
for event in zip(TIMER_EVENTS, TIMER_EVENTS_DELAYS):
    pygame.time.set_timer( event[0], event[1] )

while True:

    events = [e.type for e in pygame.event.get()]

    for event in events:
        if event in TIMER_EVENTS:
            print('event',TIMER_EVENTS.index(event))
    if pygame.QUIT in events:
        break
                
    pygame.display.update()
    clock.tick( 50 )

pygame.display.quit()
Подякували: Fox, Monolith, leofun013

8

Re: Виконання дії кожні n сек. у PyGame

Дякую вам превелике :) Буду розбиратися.

9 Востаннє редагувалося koala (12.05.2018 19:47:06)

Re: Виконання дії кожні n сек. у PyGame

"Дякую" великим не буває, це дієслово. "Велике йду", "велике співаю" і т.д. ж не буває. Це "спасибі" - вигук, там можна. А дякувати можна щиро. Або бути вельми вдячним.

Подякували: 221VOLT, ping, leofun01, Chemist-i, ReAl5