SDL 鼠标点击
SDL Mouse Click
所以,我目前正在为我的游戏制作一个选项菜单,我有一个按钮,当按下它时它会将它的文本更改为数组中的下一个分辨率,所以基本上用户按下这个按钮来改变他们的分辨率到数组中的下一个字符串。
我的问题是获取点击事件。
现在,当用户按下按钮时,return在鼠标按下时为真,而不是在按下鼠标时。我只想在按下鼠标时在鼠标事件中 return 为真。
我环顾四周,我发现的一切似乎都与我所做的相似,或者正如我所说,return在鼠标按下时为真,而不是最初的点击
我的事件是在 EventManager 单例中处理的,以下是我认为必要的功能:
我的更新功能,这是轮询事件的地方,值得注意的是我使用的是私有 SDL_Event,名为 "e"。
void EventManager::update(){
while(SDL_PollEvent(&e)){
SDL_GetMouseState(&mouseX, &mouseY);
switch(e.type){
case SDL_QUIT:
running = false;
}
}
}
我的 mousePress 函数,我想在其中按下鼠标 returned.
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 每个事件只会 return 恰好一次。如果没有新事件,它将 return 一个空事件。所以 1 次点击 = 1 次 SDL_PollEvent() 之后 e 是 SDL_MOUSEBUTTONDOWN 类型,1 次 SDL_PollEvent() 之后 e 是 SDL_MOUSEBUTTONUP 类型。如果您在中间或之后调用 SDL_PollEvent(),它将 return 0 并将 e 保留为空事件,根本不调用 switch
。如果您响应 MOUSEBUTTONDOWN 或 MOUSEBUTTONUP 或两者都由您决定...
我还声明 SDL_Event 为 update()
的局部变量。为什么?事件背后的想法是,无论何时发生某个事件,都会有一个事件对象。然后你对事件做出反应并忘记它。所以不需要全局变量。如果要防止常量construction/destruction,也可以声明为static。但这只是一些提示,与您的原始问题无关。
所以,我目前正在为我的游戏制作一个选项菜单,我有一个按钮,当按下它时它会将它的文本更改为数组中的下一个分辨率,所以基本上用户按下这个按钮来改变他们的分辨率到数组中的下一个字符串。
我的问题是获取点击事件。
现在,当用户按下按钮时,return在鼠标按下时为真,而不是在按下鼠标时。我只想在按下鼠标时在鼠标事件中 return 为真。
我环顾四周,我发现的一切似乎都与我所做的相似,或者正如我所说,return在鼠标按下时为真,而不是最初的点击
我的事件是在 EventManager 单例中处理的,以下是我认为必要的功能:
我的更新功能,这是轮询事件的地方,值得注意的是我使用的是私有 SDL_Event,名为 "e"。
void EventManager::update(){
while(SDL_PollEvent(&e)){
SDL_GetMouseState(&mouseX, &mouseY);
switch(e.type){
case SDL_QUIT:
running = false;
}
}
}
我的 mousePress 函数,我想在其中按下鼠标 returned.
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 每个事件只会 return 恰好一次。如果没有新事件,它将 return 一个空事件。所以 1 次点击 = 1 次 SDL_PollEvent() 之后 e 是 SDL_MOUSEBUTTONDOWN 类型,1 次 SDL_PollEvent() 之后 e 是 SDL_MOUSEBUTTONUP 类型。如果您在中间或之后调用 SDL_PollEvent(),它将 return 0 并将 e 保留为空事件,根本不调用 switch
。如果您响应 MOUSEBUTTONDOWN 或 MOUSEBUTTONUP 或两者都由您决定...
我还声明 SDL_Event 为 update()
的局部变量。为什么?事件背后的想法是,无论何时发生某个事件,都会有一个事件对象。然后你对事件做出反应并忘记它。所以不需要全局变量。如果要防止常量construction/destruction,也可以声明为static。但这只是一些提示,与您的原始问题无关。