gpt4 book ai didi

c++ - SDL 鼠标滚轮和 mousemotion

转载 作者:行者123 更新时间:2023-11-28 06:30:59 32 4
gpt4 key购买 nike

我之前提出了一个关于鼠标输入的问题,这帮助我理解了鼠标事件的开始。我创建了一个处理各种输入的类,我只想说有一些我尝试用 bool 值纠正但无济于事的错误。

即使鼠标滚轮或鼠标没有滚动​​或移动,鼠标滚轮和 mousemotion 事件也会连续执行。

我用这个简单的调用测试鼠标滚动:

bool isMouseWheelScrolled() const
{
return pMouseWheelScrolled;
}

然后我使用 switch 语句监听鼠标事件:

while(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_MOUSEMOTION:
onMouseMove(event);
break;

case SDL_MOUSEWHEEL:
onMouseWheelScroll(event);
break;

default:
break;
}
}

void onMouseWheelScroll(SDL_Event &event)
{
switch(event.wheel.type)
{
case SDL_MOUSEWHEEL:
pMouseWheelScrolled = true;
pMouseWheel.x = event.wheel.x;
pMouseWheel.y = event.wheel.y;
break;

default:
break;
}
}

同样的事情也适用于鼠标移动,但是:

void onMouseMove(SDL_Event &event)
{
pMouseMoved = true;
pMousePosition.x = event.motion.x;
pMousePosition.y = event.motion.y;
}

bool 值确实有问题;将它们设置为 true 的条件已经过测试,但我不知道如何分析这些 bool 值变为 false 的条件。我的解决方案是专注于监听鼠标状态,但我不知道该怎么做,教程也不足以解释它们。文档也不是那么直观。我需要 bool 值的原因是我可以测试鼠标是否已经移动或滚动到类之外。我已经可以测试按键和鼠标按键;但是鼠标滚轮和鼠标移动是另一个问题;主要是因为我需要获得

event.motion.x; 
event.motion.y;
event.wheel.x;
event.wheel.y;

我的相机。而且我不准备将相机传到我的类(class),因为这会破坏 OO。

tldr; mouse wheel 和 mouse moved 设置为 true,但是当鼠标滚轮不滚动或鼠标不移动时如何禁用它们?

最佳答案

我认为您误解了鼠标事件的工作原理。当鼠标移动时,您不会收到 SDL_MOUSEMOTION 事件。相反,当鼠标移动时,您会收到一个 SDL_MOUSEMOTION 事件。也就是说,该事件代表一个时间点。

如果你想在鼠标移动时做某事,最好的选择是直接响应鼠标事件。如果这违背了您的 OO 设计,那么您的设计就是错误的。

如果您坚持使用 bool 值,那么您应该在您的消费者类将其视为true 时立即将 bool 变量设置为false,以便处理每个事件只有一次。

无论如何,我的建议是使用某种接口(interface),比如这个:

class IMouseListener
{
virtual OnMouseMove(int x, int y) =0;
virtual OnMouseWheel(int x, int y) =0;
};

然后让你的主类实现这个接口(interface),让你的鼠标处理代码接收到一个指向这个接口(interface)的指针。

关于c++ - SDL 鼠标滚轮和 mousemotion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27583696/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com