L’événement de souris ne mettra pas à jour la rotation de la caméra dans Winforms

Mon application dispose d’un panneau personnalisé utilisé pour afficher l’écran XNA dans un WinForm. J’ai actuellement affiché un modèle de test sans problème et travaille maintenant sur le mouvement de la caméra. Mon appareil photo est un appareil photo gratuit (il n’est pas tenu de regarder une cible spécifique), mais j’ai eu du mal à faire en sorte que la souris mette à jour le lacet et le pas de la caméra sur son propre axe. Je pensais que ma méthode de mise à jour ne fonctionnait peut-être pas bien, mais ce n’était pas le cas, car la caméra met à jour d’avant en arrière à l’aide de KeyboardState . Mais je ne sais pas pourquoi le MouseState ne fonctionne pas.

FreeCamera.cs

 using XNAButtonState = Microsoft.Xna.Framework.Input.ButtonState; .... MouseState pastMouseState; private float rotationSpeed_ = 1f / 60f; private float yaw_, pitch_; ... private void updateMasortingx() { Masortingx rotationMasortingx = Masortingx.CreateRotationX(pitch_) * Masortingx.CreateRotationY(yaw_); Vector3 forward = new Vector3(0, 0, 1); forward = Vector3.Transform(forward, rotationMasortingx); viewMasortingx_ = Masortingx.CreateLookAt(Position, Position + forward, Up); projectionMasortingx_ = Masortingx.CreatePerspectiveFieldOfView( MathHelper.PiOver4, 16.0f / 9.0f, 0.1f, 100000.0f); } private void cameraInput() { KeyboardState keyboardState = Keyboard.GetState(); <-- updates currentMouseState = Mouse.GetState(); <-- not updating if (currentMouse.LeftButton == XNAButtonState.Pressed) pitch_ -= rotationSpeed_; if (keyboardState.IsKeyDown(Keys.W)) move(1); if (keyboardState.IsKeyDown(Keys.S)) move(-1); pastMouseState = currentMouseState; } public void update() { cameraInput(); updateMatrix(); 

Pour utiliser l’API de souris de XNA (plutôt que les événements WinForm), vous devez définir Mouse.WindowHandle manière appropriée ( MSDN ).

Si vous utilisez les échantillons officiels , le mettre dans le MainForm votre MainForm fera l’affaire:

 Mouse.WindowHandle = this.Handle; 

(Bien sûr en using Microsoft.Xna.Framework.Input; )