SDL MOUSEMOTION的yrel值异常,如何修复该问题?
修复SDL_MOUSEMOTION事件中yrel异常数值的问题
看起来你遇到的是SDL事件结构体中yrel字段出现垃圾值的问题,这种数值通常是未初始化内存或者SDL初始化/事件处理流程中的问题导致的。让我们一步步排查并修复:
初始化SDL_Event变量
你的代码中SDL_Event Evnt;是默认声明的,内存中的初始值是随机的。虽然SDL_PollEvent会在获取到事件时覆盖对应字段,但如果出现异常事件或者队列空的情况,可能会读取到未初始化的垃圾值。修改成初始化的形式:SDL_Event Evnt = {}; // 用空初始化器将所有字段置为0检查SDL初始化的返回值
你现在只检查了窗口创建失败的情况,但SDL_Init本身可能初始化失败(比如缺少依赖),这会导致后续所有SDL操作行为异常。添加初始化检查:if (SDL_Init(SDL_INIT_VIDEO) != 0) { ServerEngine::FatalError("Could not initialize SDL: " + (std::string)SDL_GetError()); }窗口创建后重置鼠标位置
当你设置SDL_WINDOW_INPUT_GRABBED时,鼠标会被锁定在窗口内,但如果窗口创建前鼠标在屏幕的某个极端位置,第一次的相对位移可能会出现异常(虽然你的数值更像垃圾值,但这是一个稳妥的修复)。在窗口创建后添加:// 将鼠标定位到窗口中心,重置相对位移基准 SDL_WarpMouseInWindow(EnthropyGeneratorWindow, WindowSizeX / 2, WindowSizeY / 2); // 同时获取一次鼠标状态,确保SDL更新内部的鼠标位置记录 int x, y; SDL_GetMouseState(&x, &y);额外的逻辑修正(非当前问题,但值得注意)
你的AddEnthropy函数设计是接收鼠标的位移值(deltaX/deltaY),但你调用时传入的是累计的m_MouseX和m_MouseY,这会导致熵的计算逻辑错误。应该直接传递事件中的相对位移:AddEnthropy(Evnt.motion.xrel, Evnt.motion.yrel);
这些步骤中,初始化SDL_Event和检查SDL初始化返回值是解决垃圾值问题的核心:前者避免了读取未初始化的内存,后者确保SDL的事件系统已经正确启动。重置鼠标位置则可以消除因初始鼠标位置异常导致的位移偏差。
内容的提问来源于stack exchange,提问作者Gabriel Proulx
相关产品推荐
相关产品推荐

