c – SDL鼠标单击

所以,我正在为我的游戏制作一个选项菜单,我有一个按钮,当按下它时,它将文本更改为数组中的下一个分辨率,所以基本上用户按下此按钮将其分辨率更改为下一个字符串数组.

我的问题是获得点击事件.

现在,当用户按下按钮时,它在鼠标按下时返回true,而不是在按下鼠标时返回true.我想只在按下鼠标时在鼠标事件中返回true.

我环顾四周,我发现的一切似乎与我所做的一样,或者正如我所说,在鼠标停止时返回true,而不是初始点击.

我的事件是在EventManager单例中处理的,以下是我认为必要的函数:

我的更新函数,这是轮询事件的地方,值得注意的是我正在使用名为“e”的私有SDL_Event.

void EventManager::update(){
    while(SDL_PollEvent(&e)){
        SDL_GetMouseState(&mouseX, &mouseY);
        switch(e.type){
            case SDL_QUIT:
                running = false;

        }
    }
}

我的mousePress功能,我想要鼠标按下返回.

int EventManager::mousePress(){
    if(e.type == SDL_MOUSEBUTTONDOWN){
        return e.button.button;
    }
    return 0;
}

解决方法:

而不是使用SDL_GetMouseState(),它可以获得鼠标的实际状态(可能是它的名字来源;)),使用您正在轮询的事件. SDL应该为您提供一个SDL_MouseButtonEvent,其中包含您需要的信息,并且只应排队一次.

https://wiki.libsdl.org/SDL_MouseButtonEvent

编辑以澄清我的意思:

你会使用这样的东西:

void EventManager::update(){
    SDL_Event e;
    while(SDL_PollEvent(&e)){
        switch(e.type){
            case SDL_QUIT:
                running = false;
                break;
            case SDL_MOUSEBUTTONDOWN:
                //do whatever you want to do after a mouse button was pressed,
                // e.g.:
                mousePress(e.button);
                break;

        }
    }
}

在mousePress-Function中,您可以测试,按下了哪个鼠标按钮:

void EventManager::mousePress(SDL_MouseButtonEvent& b){
  if(b.button == SDL_BUTTON_LEFT){
    //handle a left-click
  }
}

这是有效的,因为SDL_PollEvent只会为每个事件返回一次.如果没有新事件,它将返回一个空事件.因此,1点击= 1次SDL_PollEvent(),其中e为SDL_MOUSEBUTTONDOWN类型,之后为1次SDL_PollEvent(),其后e为SDL_MOUSEBUTTONUP类型.如果您在之间或之后调用SDL_PollEvent(),它将返回0并将e保留为空事件,而不是根本不调用该开关.如果您回复MOUSEBUTTONDOWN或MOUSEBUTTONUP,或两者都取决于您……

我还将SDL_Event声明为update()的局部变量.为什么?事件背后的想法是,只要发生某个事件,就会发生事件对象.然后你对事件做出反应并忘掉它.所以没有必要有一个全局变量.如果要防止持续构造/销毁,还可以将其声明为静态.但这只是一些提示,与你原来的问题无关.

上一篇:javascript – 如何在A-Frame中反转拖动旋转?


下一篇:C# 模拟鼠标移动和点击