2012-02-12 11 views
2

私はFPSゲームのカメラの動きを実装しようとしています。私はほとんどそれを持っていると思うが、ほんの少しの不具合があります。私はこのように設定私のマウスの動き持っている:カーソルをゲームウィンドウにロックする方法は?

protected override void OnLoad(EventArgs e) 
{ 
    Mouse.Move += OnMouseMove; 
} 

void OnMouseMove(object sender, MouseMoveEventArgs e) 
{ 
    _lookDir.X += e.XDelta * _mouseSensitivity; 
    _lookDir.Y -= e.YDelta * _mouseSensitivity; 
} 

マウスがウィンドウ内に実際にあるときにはかなりうまく動作するようだが、できるだけ早く私は窓を残すようには動作しません。マウスがウィンドウの外側にあるときにマウスを動かしても、同じ問題に直面していても、デスクトップ上の境界にあるため、マウスの動きをトリガーしても、ウィンドウ内にマウスが入るようにする必要があると私は考えています代わりに指輪。

どうすればいいですか?マウスをウィンドウの内側に固定するにはどうすればいいですか?基本的にマウスの位置を中心に設定していますか?もしそうなら...私はどのようにマウスの位置を設定するのですか?私はWindowsを使用していますが、OpenTKが提供しているのであれば、非ネイティブのソリューションを好むでしょう。

+0

SDLは、この問題に対する[適切な解決策](http://gamedev.stackexchange.com/a/33554/800)を提供しています。私は[wrapper](https://bitbucket.org/mnbayazit/glow)を書いていますが、それが準備ができている間はしばらく前になります。 – mpen

答えて

2

私がやった1つの練習、そして古いQuakeゲーム(そして半減期1)は、カーソルの位置を画面の中央にリセットしたすべてのフレームです。そして、中央からデルタを計算します画面の

EDIT:カーソルを移動させ、Cursor.Position

+0

System.Windows.Forms == Windows固有!=ネイティブではありません。私は今それを使用しなければならないだろうと思う。ありがとう。 – mpen

+1

申し訳ありませんが、私はOpenTKに慣れていません.NetではCursor.Positionを使用できます。また、Win32ではSet/GetCursorPosを使用できます。 linux/macでは、これを達成するためのクロスプラットフォームの方法については全く知らない。 – Matthew

1

をチェックアウトこれはそれが窓に固有の...今の私の解決策です。

protected void ResetCursorPosition() 
{ 
    Cursor.Position = WindowCenter; 
    _lastMousePos = Cursor.Position; 
} 

protected void LockMouse() 
{ 
    _lockMouse = true; 
    _origCursorPosition = Cursor.Position; 
    CursorVisible = false; 
    ResetCursorPosition(); 
} 

protected void UnlockMouse() 
{ 
    _lockMouse = false; 
    CursorVisible = true; 
    Cursor.Position = _origCursorPosition; 
} 

void OnMouseDown(object sender, MouseButtonEventArgs e) 
{ 
    if (!_lockMouse) LockMouse(); 
} 

void OnKeyDown(object sender, KeyboardKeyEventArgs e) 
{ 
    if(e.Key == Key.Escape) 
    { 
     if (_lockMouse) UnlockMouse(); 
     else Exit(); 
    } 
} 

protected override void OnUpdateFrame(FrameEventArgs e) 
{ 
    Title = string.Format("{0} - {1:0.0} FPS", _windowTitle, RenderFrequency); 

    float moveSpeed = Keyboard[RunKey] ? 0.9f : 0.4f; 

    if (Keyboard[MoveForwardKey]) 
    { 
     _pos.X += (float)Math.Cos(_lookDir.X) * moveSpeed; 
     _pos.Z += (float)Math.Sin(_lookDir.X) * moveSpeed; 
    } 

    if (Keyboard[StrafeLeftKey]) // FIXME: holding W + A gives extra speed (also, perhaps strafing should be slower?) 
    { 
     _pos.X -= (float) Math.Cos(_lookDir.X + Math.PI/2) * moveSpeed; 
     _pos.Z -= (float) Math.Sin(_lookDir.X + Math.PI/2) * moveSpeed; 
    } 

    if (Keyboard[StrafeRightKey]) 
    { 
     _pos.X += (float)Math.Cos(_lookDir.X + Math.PI/2) * moveSpeed; 
     _pos.Z += (float)Math.Sin(_lookDir.X + Math.PI/2) * moveSpeed; 
    } 

    if (Keyboard[MoveBackKey]) 
    { 
     _pos.X -= (float)Math.Cos(_lookDir.X) * moveSpeed; 
     _pos.Z -= (float)Math.Sin(_lookDir.X) * moveSpeed; 
    } 

    if(Keyboard[JumpKey]) 
    { 
     _pos.Y += moveSpeed; 
    } 

    if (Keyboard[CroucKey]) 
    { 
     _pos.Y -= moveSpeed; 
    } 

    if (_lockMouse) 
    { 
     var mouseDelta = Cursor.Position - new Size(_lastMousePos); 
     if (mouseDelta != Point.Empty) 
     { 
      _lookDir.X += mouseDelta.X * _mouseSensitivity; 
      _lookDir.Y -= mouseDelta.Y * _mouseSensitivity; 
      ResetCursorPosition(); 
     } 
    } 

    var target = _pos + new Vector3((float)Math.Cos(_lookDir.X), (float)Math.Sin(_lookDir.Y/2), (float)Math.Sin(_lookDir.X)); 
    _viewMat = Matrix4.LookAt(_pos, target, _up); 
    _projUniform.Mat4(_viewMat * _projMat); 
} 
関連する問題