【问题标题】:SetCursor doesn't workSetCursor 不起作用
【发布时间】:2013-03-13 05:12:34
【问题描述】:

我正在使用 SDL2 开发一个 Windows 应用程序。我想更改光标显示。我使用完全复制的示例创建了光标,来自 SDL_CreateCursor 然后在SDL_MOUSEMOTION 事件中调用SDL_SetCursor,但似乎没有运气。

所以我直接跳进去:

SDL_Cursor * cursor = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND); 
SDL_SetCursor(cursor); 

官方 wiki 将 SDL_CreateSystemCursor 报告到 TODO 状态。我查看了源代码,它似乎已经实现并且可以创建一个有效的游标。但是,光标显示也没有改变。

我该怎么办?

【问题讨论】:

  • 您应该发布您的代码,正如我在示例中看到的那样,让SDL_CreateSystemCursor 工作需要大量代码。
  • 我只是把它们放在事件循环中
  • SDL_PollEvent(&event); switch (event.type) { case SDL_MOUSEMOTION: SDL_Cursor * cursor = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_HAND); SDL_SetCursor(cursor); break; default: break; } 当鼠标移动时,它偶尔会改变形状但立即切换回默认点。我想知道让它工作的“大量代码”是什么。非常感谢。
  • 感谢 Armin,我通过从 Mercurial 存储库克隆下载了源代码,并且所有这些源代码都已修补。

标签: c++ sdl


【解决方案1】:

您确实应该发布您的实际代码,但我将在黑暗中试一试,看看我是否能猜出您做错了什么。您说“我使用从 SDL_CreateCursor 完全复制的样本创建了光标,然后在 SDL_MOUSEMOTION 事件中调用 SDL_SetCursor,但似乎没有运气。”然后你继续说它似乎短暂地闪烁到正确的图像。

尝试在偶数循环之前更改 SDL 光标。这不是您每次鼠标移动时都想运行的东西,而是您在初始化时更改的东西。将代码移至事件循环之前和 SDL_Init 之后。

如果这不起作用,请在此处发布您的代码,以便我们实际看到您在做什么。

【讨论】:

  • 嗨,如果我在 SDL_init 之后移动代码,鼠标光标将永远不会改变。很难在评论部分发布代码,而且它有很多行......我所做的只是渲染一些 .flv 帧。我使用 SDL 2.0。我创建了一个SDL_Window,一个窗口的SDL_Renderer,一个SDL_Texture,并将纹理渲染到渲染器上。我想改变窗口不同部分的光标形状。
  • 据我所知,在传统的 Win32 中,应该处理“WM_SETCURSOR”消息,是否有必要处理本机 Win32 消息? (不过,好像很奇怪……)
【解决方案2】:

GitHub (such as this one) 上有各种讨论与 SDL 光标设置功能相关的错误的问题。

您可以改为手动创建自定义光标,如下所示:

声明鼠标对象。

int x = 0, y = 0; // The x and y position of the mouse 
Uint32 mouse = SDL_GetMouseState(&x, &y); // Relative to window. 
// Use SDL_GetGlobalMouseState(&x, &y); to get mouse position relative to desktop.

不断更新游戏循环中的 x 和 y 坐标。

mouse = SDL_GetMouseState(&x, &y)

更新您选择的精灵以跟随鼠标的 x 和 y 坐标。

我建议您在实现此功能时保留默认光标可见,以便您可以了解任何滞后/偏移并进行相应调整。当你高兴的时候,你可以使用下面这行来隐藏默认光标:

SDL_ShowCursor(SDL_DISABLE);

您可以在此处阅读更多关于SDL_GetMouseState() 的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多