SDL鼠标单击

时间:2016-02-02 23:20:55

标签: c++ events sdl mouse

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

我的问题是获取点击事件。

现在,当用户按下按钮时,它会在鼠标按下时返回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;
}

1 个答案:

答案 0 :(得分:7)

而不是使用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保留为空事件,而不是完全调用switch。如果您回复MOUSEBUTTONDOWN或MOUSEBUTTONUP,或两者都由您决定......

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