2011-12-13 35 views
1

我正在为学校开发一个C++项目,此时我的实现需要鼠标输入来控制一艘船(它应该是Tyrian的翻版)。一切工作正常,除了第一次移动鼠标,它有一个偏移取决于我开始游戏时鼠标的位置。我想这是因为我使用SDL_GetRelativeMouse,但我怎么能防止它?第一次鼠标移动出乎意料地使用SDL(C++)

+0

目前我只会抑制第一次检测到鼠标移动。这似乎有效,但似乎是一种相当不专业的方法。 – Mats

回答

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; 
} 
} 
} 

基本上,初始化当鼠标(抓住它,使其不可见)调用波洛内抛出的第一个事件了。在主循环调用的主事件处理函数中捕获的每个事件都是鼠标在中心屏幕上。