如何在SDL2(C#)中居中鼠标不触发事件,同时获取鼠标输入控制相机
解决SDL2 C#第一人称游戏鼠标居中与相机控制冲突问题
解决这个问题最靠谱的办法是用SDL的相对鼠标模式,这是SDL专门为第一人称这类需要鼠标控制视角的场景设计的,比手动调用SDL_WarpMouseInWindow省心太多,还能避免额外事件干扰。
具体步骤
游戏初始化阶段添加以下代码,隐藏光标并启用相对鼠标模式:
// 隐藏鼠标光标,避免玩家看到鼠标乱跑 SDL_ShowCursor(SDL_bool.SDL_FALSE); // 启用相对鼠标模式:鼠标被锁定在窗口内,SDL直接返回相对移动量,自动处理居中 SDL_SetRelativeMouseMode(SDL_bool.SDL_TRUE);修改主循环,移除那行引发问题的
SDL_WarpMouseInWindow调用:while (running) { SDL_Delay(1000 / FPS); PollEvents(); Render(); }你的
PollEvents函数完全不用改,e.motion.xrel会正常返回玩家实际的鼠标相对移动量,直接用来控制相机转动就好:static void PollEvents() { while (SDL_PollEvent(out SDL_Event e) != 0) { switch (e.type) { case SDL_EventType.SDL_QUIT: running = false; break; case SDL_EventType.SDL_MOUSEMOTION: currentPlayer.Rotate(e.motion.xrel * ROTSPEED / FPS); break; default: break; } } }
为什么原来的代码会出问题
你之前在PollEvents之前调用SDL_WarpMouseInWindow,每次循环都会强制把鼠标移到窗口中心,这会触发一个额外的SDL_MOUSEMOTION事件,事件里的xrel是鼠标从之前位置到中心的差值,你的代码捕获到这个事件后就会让相机转动,相当于每次循环都在强制转动相机,自然没法正常控制。
内容的提问来源于stack exchange,提问作者nico_qwer
相关产品推荐
相关产品推荐

