仅移动鼠标却触发按键事件?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
相关产品推荐
相关产品推荐

