所以,我正在为我的游戏制作一个选项菜单,我有一个按钮,当按下它时,它将文本更改为数组中的下一个分辨率,所以基本上用户按下此按钮将其分辨率更改为下一个字符串数组.
我的问题是获得点击事件.
现在,当用户按下按钮时,它在鼠标按下时返回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()的局部变量.为什么?事件背后的想法是,只要发生某个事件,就会发生事件对象.然后你对事件做出反应并忘掉它.所以没有必要有一个全局变量.如果要防止持续构造/销毁,还可以将其声明为静态.但这只是一些提示,与你原来的问题无关.