You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅移动鼠标却触发按键事件?SDL游戏开发异常问题求助

SDL按键误触发问题修复

问题根源

你代码里的核心错误是没先判断事件类型就直接读取event.key成员。SDL的SDL_Event是共用体结构,不同类型的事件会共用同一块内存:当事件是鼠标移动(SDL_MOUSEMOTION)时,event.key对应的内存区域其实存的是鼠标移动的数据,这时候读取event.key.keysym.sym会拿到随机值,刚好匹配SDLK_ESCAPE或其他按键的数值时,就会触发错误的逻辑。

修复后的主事件循环代码

void game::userInput()
{
    while(SDL_PollEvent(&event) != 0)
    {
        if(event.type == SDL_QUIT)
        {
            cout << "quit";
            running = false;
        }
        // 先确认是键盘按下事件,再检查Escape键
        else if(event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE)
        {
            cout << event.key.keysym.sym << endl;
            running = false;
        }
        // 仅把鼠标移动事件传给鼠标处理函数
        else if(event.type == SDL_MOUSEMOTION)
        {
            square->input_mouse(event);
        }
        // 其他类型事件可按需添加处理逻辑
    }
}

补充说明

  • 鼠标处理函数可以保持原样,但后续扩展其他鼠标事件(如点击、滚轮)时,也要遵循“先判断事件类型再访问对应成员”的原则。
  • 所有操作SDL_Event的代码,必须先通过event.type确认当前事件类型,否则会触发未定义行为,出现各种奇怪的BUG。

内容的提问来源于stack exchange,提问作者Duong Tran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 20:15:13