C++ 鼠标点击

C++ 鼠标点击,c++,events,sdl,mouse,C++,Events,Sdl,Mouse,因此,我目前正在为我的游戏制作一个选项菜单,我有一个按钮,当按下它时,它会将其文本更改为数组中的下一个分辨率,因此基本上用户按下这个按钮可以将其分辨率更改为数组中的下一个字符串 我的问题是获取单击事件 现在,当用户按下按钮时,鼠标按下时返回true,而不是按下鼠标时返回true。我只想在按下鼠标时在鼠标事件中返回true 我环顾四周,发现的一切似乎都与我所做的相似,或者,正如我所说,在鼠标按下时返回true,而不是最初的单击 我的事件在EventManager单例中处理,以下是我认为必要的函数:

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

我的问题是获取单击事件

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

我环顾四周,发现的一切似乎都与我所做的相似,或者,正如我所说,在鼠标按下时返回true,而不是最初的单击

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

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

我的mousePress函数,我希望返回鼠标按下

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

不要使用
SDL\u GetMouseState()
,它可以获取鼠标的实际状态(可能就是鼠标名称的来源),而是使用正在轮询的事件。SDL应该为您提供一个
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;

        }
    }
}
在鼠标按下功能中,您可以测试按下了哪些鼠标按钮:

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次单击=1次SDL_PollEvent(),之后e为SDL_MOUSEBUTTONUP类型。如果在中间或之后调用SDL_PollEvent(),它将返回0并将e作为空事件保留,根本不调用
开关。如果您对MOUSEBUTTONDOWN或MOUSEBUTTONUP或两者都做出响应,则由您决定


我还将SDL_事件声明为
update()
的局部变量。为什么?事件背后的思想是,每当发生某个事件时,都会有一个事件对象。然后你对事件做出反应,然后忘记它。所以不需要全局变量。如果要防止持续构造/破坏,还可以将其声明为静态。但这只是一些提示,与您最初的问题无关。

您可以在获得鼠标按钮下事件时设置布尔标志,并在获得鼠标按钮下事件时将其清除。如何
(SDL_GetMouseState(&mouseX,&mouseY)&SDL_按钮(SDL_按钮左))
鼠标按下(左键单击)?Tristan Brindle,这不会改变任何事情,当e.type!=返回SDL_MOUSEBUTTONDOWN 0,这意味着当按住鼠标左键时,它将继续返回true。正如我所说的,我只希望它在最初按下鼠标按钮时返回true。如果这在我的问题中不够清楚,请道歉。我将使用哪位成员?鼠标按下时返回状态,键入时也返回状态。如何获得初始鼠标按下?
void EventManager::mousePress(SDL_MouseButtonEvent& b){
  if(b.button == SDL_BUTTON_LEFT){
    //handle a left-click
  }
}