Pygame-方式创建更多USEREVENT类型的事件?

时间:2014-05-09 18:51:04

标签: python events pygame limit

这个问题产生于需要创建许多USEREVENT类型的事件。由于我找不到有关如何创建更多使用事件的信息而不是限制允许我来这里寻求帮助。

目前我知道USEREVENT类型事件的值为24,允许的最大id为31.我还发现一些id-s是保留的,至少在官方文档中的一条注释中{{3 }})。

基于以下所有内容是我的两个问题:可以将那些SDL_EVENT_RESERVED事件id-s安全地用作用户创建事件的额外空格(例如,一个计时器:pygame.time.set_timer(USEREVENT + 7, 1000))有没有办法创建无限量的单独的用户创建的事件,如在计时器代码示例中?

如果由于措辞不当或其他问题导致问题无法理解,我很抱歉。

2 个答案:

答案 0 :(得分:4)

用户事件应介于:

之间
  • pygame.USEREVENT:24
  • pygame.NUMEVENTS:32

所以你可以有9个不同的用户事件。

通常的方法是定义一个常量:

SOME_EVENT = pygame.USEREVENT + 0
ANOTHER_EVENT = pygame.USEREVENT + 1
...

如果您使用event(...)创建活动,则可以为活动分配属性,这样您就可以创建许多不同的子活动并为其分配其他数据,例如:关键事件。

不幸的是,当您使用pygame.time.set_timer()时,您只能使用ID。

答案 1 :(得分:0)

如果我是你,我将仅依靠一种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

https://github.com/Hzzkygcs/setInterval-python