我正在为学校开发一个C++项目,此时我的实现需要鼠标输入来控制一艘船(它应该是Tyrian的翻版)。一切工作正常,除了第一次移动鼠标,它有一个偏移取决于我开始游戏时鼠标的位置。我想这是因为我使用SDL_GetRelativeMouse
,但我怎么能防止它?第一次鼠标移动出乎意料地使用SDL(C++)
1
A
回答
0
目前我只会抑制第一次检测到鼠标移动。这似乎有效,但似乎是一种相当不专业的方法。
0
您可能希望在应用程序开始时将鼠标初始化为已知的位置,可能在事件回调被初始化之前。
确保鼠标在窗口的范围内也可能是合适的。无论如何,这与应用程序之外的应用程序并不相关。
+0
问题是,我将如何初始化? GetRealtiveMouse只有在鼠标移动后才开始工作,并且在玩家真正玩游戏之前不可能确定发生这种情况。 – Mats
0
这是我做的FPS类型的应用程序切换mousegrab:
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()
通话消费鼠标更新是重要组成部分。
0
我用这个:
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;
}
}
}
基本上,初始化当鼠标(抓住它,使其不可见)调用波洛内抛出的第一个事件了。在主循环调用的主事件处理函数中捕获的每个事件都是鼠标在中心屏幕上。
相关问题
- 1. 移动语义出乎意料
- 2. ByteBuffer.wrap出乎意料地
- 3. (此时出乎意料的是批次
- 4. WIN32API移动鼠标几乎
- 5. Path.Combine作用出乎意料
- 6. 当SDL不具备焦点时,SDL不停止移动鼠标 - SDL C++
- 7. 使用typer出乎意料的结果
- 8. SDL C鼠标/键盘输出
- 9. qml动画出乎意料的行为
- 10. ”此时出乎意料。“
- 11. %%此时出乎意料
- 12. `scipy.stats.multivariate_normal.pdf(...)`的[0,1]出乎意料
- 13. EQU此时出乎意料?
- 14. 用c移动鼠标#
- 15. jquery检测第一个鼠标移动
- 16. 使用鼠标移动图像移动
- 17. Easeljs使用鼠标移动
- 18. SDL C++自动移动一个矩形
- 19. 如何用滚动鼠标一次移动滚动视差
- 20. C++ SFML鼠标移动
- 21. C#块的鼠标移动
- 22. C#鼠标移动(WinForm)
- 23. jquery移动第一次使用教程
- 24. jQuery的意外使用标识符$(这)对鼠标移动
- 25. C#检测鼠标向左移动5次并向右移动5次
- 26. 批处理SET/P命令“?”与此次“出乎意料”碰撞
- 27. SDL鼠标点击
- 28. 像一个L值出乎意料的作用方法调用
- 29. 获取鼠标坐标每次移动鼠标
- 30. zimpl中出乎意料的VARSYM
目前我只会抑制第一次检测到鼠标移动。这似乎有效,但似乎是一种相当不专业的方法。 – Mats