SDL鼠标点击

7

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

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

现在,当用户按下按钮时,在鼠标按下时返回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
当你接收到MOUSEBUTTONDOWN事件时,可以设置一个布尔标志,并在接收到MOUSEBUTTONUP时清除它。 - Tristan Brindle
对于鼠标按下(左键单击),(SDL_GetMouseState(&mouseX, &mouseY) & SDL_BUTTON(SDL_BUTTON_LEFT)) 怎么样? - share
Tristan Brindle,这不会改变任何事情,当e.type!= SDL_MOUSEBUTTONDOWN时返回0,这意味着当左鼠标按钮被按住时,它将继续返回true。正如我所说,我希望它只在鼠标按钮最初被按下时返回true。如果我的问题不够清晰,敬请谅解。 - genfy
1个回答

12

不要使用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;

        }
    }
}

在你的鼠标按键函数内,你可以测试哪个鼠标按钮被按下:

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()的本地变量。为什么?事件的理念是,只有在发生某些事件时才有事件对象。然后你对事件做出反应并忘记它。因此,没有必要拥有全局变量。如果您想防止常量构建/破坏,也可以将其声明为静态的。但这只是一些提示,与您最初的问题无关。


我应该使用哪个成员?state在鼠标按下时返回,type也是如此。我该如何获取初始的鼠标按下事件? - genfy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接