第一次鼠标移动意外使用SDL (c++)
First mouse movement unexpected using SDL (C++)
我正在为学校做一个c++项目,我现在的实现需要鼠标输入来控制一艘船(这应该是Tyrian的重制)。一切都很正常,除了我第一次移动鼠标时,它有一个偏移量,这取决于我开始游戏时鼠标的位置。我猜这是因为我用的是SDL_GetRelativeMouse
,但我怎么预防呢?
您可能希望在应用程序开始时将鼠标初始化到一个已知的位置,可能就在初始化事件回调之前。
确保鼠标在窗口范围内也是合适的。无论如何,它与应用程序边界之外的应用程序并不相关。
下面是我在fps类型的应用程序中切换鼠标抓取的操作:
if(event.key.keysym.sym == SDLK_z)
{
if( mouse_grabbed )
{
SDL_WM_GrabInput(SDL_GRAB_OFF);
SDL_WarpMouse( display->w/2, display->h/2 );
SDL_ShowCursor(1);
}
else
{
SDL_ShowCursor(0);
SDL_WM_GrabInput(SDL_GRAB_ON);
int tx,ty;
SDL_GetRelativeMouseState(&tx, &ty);
}
mouse_grabbed = !mouse_grabbed;
}
通过虚拟SDL_GetRelativeMouseState()
调用消费鼠标更新是重要的部分。
目前我将只抑制第一次鼠标移动被检测到。这似乎是有效的,但这似乎是一个相当不专业的方法。
我用这个:
Sdl.SDL_ShowCursor(Sdl.SDL_DISABLE);
Sdl.SDL_WM_GrabInput(Sdl.SDL_GRAB_ON);
e=new Sdl.SDL_Event();
pollOne();
.
.
.
private void pollOne(){
while(Sdl.SDL_PollEvent(out e)==1){
switch(e.type){
case Sdl.SDL_MOUSEMOTION:
float throwAway=((float)e.motion.xrel*headSens);
break;
}
}
}
基本上,当初始化鼠标(抓住鼠标并使其不可见)时,调用pollOne来丢弃第一个事件。以后在主循环调用的主事件处理函数中捕获的每个事件都是鼠标位于屏幕中央。
相关文章:
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- SDL 操纵杆按钮按下/C++
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- SDL 映像:无法打开映像,仅显示错误消息
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- "Undefined symbols for architecture x86_64" 在 SDL 2 (macOS) 中
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- SDL GPU 为什么将两个图像分成两个单独的循环更快?
- 在 cmake 中找不到 SDL 库
- SDL/C++: 如何平滑但随机地移动矩形?
- 如何与 SDL 库链接?
- 为什么我的C++代码不呈现 SDL 矩形?
- 为什么要在初始化SDL之前在SDL中声明指针
- C++/SDL 如何覆盖数组?
- 在 SDL 中水平减小静态图像进度条