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

问题描述 投票:3回答:2

这个问题是由于需要创建许多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 )),是否有一种方法可以创建无限数量的单独的用户创建的事件,例如在示例计时器代码中?

如果由于措辞不当或其他问题而无法理解该问题,我感到抱歉。

python events pygame limit
2个回答
4
投票

用户事件应该在之间:

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

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

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

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

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

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


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

© www.soinside.com 2019 - 2024. All rights reserved.