首页 > 解决方案 > SDL2 只返回第一个注册的 UserEvent

问题描述

我通过注册三个事件SDL_RegisterEvents。但是,SDL_PollEvent()只返回第一种类型的事件并吞下其他类型的事件。

这是我的代码(它是 Go,但我认为这与这里无关):

package main

import (
    "github.com/veandco/go-sdl2/sdl"
    "log"
)

func main() {
    if err := sdl.Init(sdl.INIT_VIDEO | sdl.INIT_EVENTS); err != nil {
        panic(err)
    }
    defer sdl.Quit()

    evt1 := sdl.RegisterEvents(3)
    evt2 := evt1 + 1
    evt3 := evt1 + 2

    sdl.PushEvent(&sdl.UserEvent{Type: evt1})
    sdl.PushEvent(&sdl.UserEvent{Type: evt2})
    sdl.PushEvent(&sdl.UserEvent{Type: evt3})
    sdl.PushEvent(&sdl.UserEvent{Type: evt1})

    event := sdl.WaitEvent()
    for ; event != nil; event = sdl.PollEvent() {
        userEvent, ok := event.(*sdl.UserEvent)
        if ok {
            switch (userEvent.Type) {
            case evt1:
                log.Println("got evt1")
            case evt2:
                log.Println("got evt2")
            case evt3:
                log.Println("got evt3")
            }
        }
    }
}

这是输出:

2019/08/04 20:10:26 got evt1
2019/08/04 20:10:26 got evt1

所以evt1我推送的两个事件都被投票了,但是evt2evt3在中间推送的事件消失了。我尝试调用sdl.RegisterEvents(1)三次来注册事件,但结果是一样的。

我究竟做错了什么?

标签: eventssdl-2

解决方案


这只是因为去绑定,特别是行https://github.com/veandco/go-sdl2/blob/24851c1f2d98dcac2a68223a24e6f799fc921f1e/sdl/events.go#L1035(类型转换仅触发SDL_USEREVENT,仅与第一个注册事件匹配; 其他任何事情都被报告为“CommonEvent”,丢失您可能已经传递的所有额外数据)。您可能应该向所述绑定的开发人员报告错误。


推荐阅读