这个问题是由于需要创建许多USEREVENT类型的事件而引起的。由于找不到有关如何创建超出限制的更多用户事件的信息,因此我来这里寻求帮助。
[目前,我知道USEREVENT类型的事件的值为24,最大允许的id为31。我还发现,至少在官方文档(http://www.pygame.org/docs/ref/event.html#comment_pygame_event_Event)的其中一项注释中,保留了一些id。 。
基于所有这些,我的问题分为两部分:是否可以将那些SDL_EVENT_RESERVED事件ID安全地用作用户创建的事件的额外空间(例如,计时器:pygame.time.set_timer(USEREVENT + 7,1000 )),是否有一种方法可以创建无限数量的单独的用户创建的事件,例如在示例计时器代码中?
如果由于措辞不当或其他问题而无法理解该问题,我感到抱歉。
用户事件应该在之间:
pygame.USEREVENT
:24pygame.NUMEVENTS
:32所以您可以有9个不同的用户事件。
通常的方法是定义一个常量:
SOME_EVENT = pygame.USEREVENT + 0
ANOTHER_EVENT = pygame.USEREVENT + 1
...
如果使用event(...)
创建事件,则可以为事件分配属性,这样,您可以创建许多不同的子事件并为其分配其他数据,例如:关键事件。
不幸的是,当您使用pygame.time.set_timer()
时,您只能使用一个ID。
[如果我是您,我将仅依靠一种USEREVENT类型来创建所需的自定义事件。因此,实现该目标的方法就像为名称/类型附加特殊属性。好的,下面是一些示例,以使其更清楚...
[已在Windows 10的pygame 1.9.6上测试,Python 3.7.3
import pygame as pg
ON_MY_MOUSE_CLICK = 1 # your own codes for your own events...
ON_MY_SCROLL = 2
BLAH_BLAH = 3
# etc ...
pg.init()
video = pg.display.set_mode((100,100))
MouseEvent = pg.event.Event(pg.USEREVENT, MyOwnType=ON_MY_MOUSE_CLICK )
ScrollEvent = pg.event.Event(pg.USEREVENT, MyOwnType=ON_MY_SCROLL)
blahblahEvent = pg.event.Event(pg.USEREVENT, MyOwnType=BLAH_BLAH)
pg.event.post(MouseEvent) # call your own type
pg.event.post(ScrollEvent) # call your own type
for event in pg.event.get():
if (event.type == pg.QUIT):
pass # your built-in event handle goes here
elif (event.type == pg.USEREVENT): # here we go
if (event.MyOwnType == ON_MY_MOUSE_CLICK):
print("My own mouse event!") # handle for your own event
elif (event.MyOwnType == ON_MY_SCROLL):
print("My own scroll event!") # handle for your own event
elif (event.MyOwnType == BLAH_BLAH):
print("My own blah blah event!") # handle for your own event
编辑:
如果您发现自己需要使用pg.time.set_timer
,我知道我们无法将MyOwnType
分配给set_timer
。但是,您可以从我的Github中自由使用我的set_interval.py
。它在MIT的管理下,因此您不必担心通用GNU许可或类似的东西...
这里是示例:
from set_interval import setInterval
import pygame as pg
def set_timer(eventObj, interval):
func = lambda x: pg.event.post(x)
return setInterval(func=func, sec=interval, args=[eventObj])
ON_MY_MOUSE_CLICK = 1 # your own codes for your own events...
ON_MY_SCROLL = 2
BLAH_BLAH = 3
# etc ...
pg.init()
video = pg.display.set_mode((100,100))
MouseEvent = pg.event.Event(pg.USEREVENT, MyOwnType=ON_MY_MOUSE_CLICK )
ScrollEvent = pg.event.Event(pg.USEREVENT, MyOwnType=ON_MY_SCROLL)
blahblahEvent = pg.event.Event(pg.USEREVENT, MyOwnType=BLAH_BLAH)
# replacement for pygame.time.set_timer(MouseEvent, 1000)
myIntervalHandle1 = set_timer(MouseEvent, 1)
# replacement for pygame.time.set_timer(ScrollEvent, 2500)
myIntervalHandle2 = set_timer(ScrollEvent, 2.5)
running = True
while running :
for event in pg.event.get():
if (event.type == pg.QUIT):
pg.display.quit()
myIntervalHandle1.stop() # stop timer
myIntervalHandle2.stop() # stop timer
running = False
elif (event.type == pg.USEREVENT): # here we go
if (event.MyOwnType == ON_MY_MOUSE_CLICK):
print("My own mouse event!") # handle for your own event
elif (event.MyOwnType == ON_MY_SCROLL):
print("My own scroll event!") # handle for your own event
elif (event.MyOwnType == BLAH_BLAH):
print("My own blah blah event!") # handle for your own event
您可以在这里找到set_interval.py
: