2013-02-25 3 views
3

J'essaie de configurer les commandes du clavier et de la souris pour un jeu spatial avec SlimDX et RawInput. Mon code actuel est le suivant:SlimDX RawInput avec WPF

Device.RegisterDevice(UsagePage.Generic, UsageId.Keyboard, DeviceFlags.None); 
Device.KeyboardInput += new EventHandler<KeyboardInputEventArgs>(keyboardInput); 
Device.RegisterDevice(UsagePage.Generic, UsageId.Mouse, DeviceFlags.None); 
Device.MouseInput += new EventHandler<MouseInputEventArgs>(mouseInput); 

Cependant, je lis ici: http://code.google.com/p/slimdx/issues/detail?id=785 que pour WPF je dois utiliser une surcharge différente pour Device.RegisterDevice(), ainsi que l'attribution d'un HandleMessage en utilisant Device.HandleMessage(IntPtr message)

J'ai trouvé la correcte surcharge RegisterDevice() qui est:

RegisterDevice(UsagePage usagePage, UsageId usageId, DeviceFlags flags, IntPtr target, bool addThreadFilter) 

Ce que je ne peux pas travailler, cependant, est:

1) Maintenant que je dois utiliser une cible, que dois-je définir comme cible?

2) D'où puis-je obtenir ce message IntPtr?

+0

N'est-ce pas demander votre poignée de fenêtre? – Andy

+0

Pour la cible? Je pensais que ce pourrait être, mais j'ai été incapable de le tester correctement sans résoudre la partie 2. –

+0

Vous pouvez obtenir le handle d'une fenêtre WPF en utilisant la classe System.Windows.Interop.WindowInteropHelper, il suffit de créer une nouvelle instance en passant la fenêtre référence en tant que paramètre constructeur et sa propriété Handle est le IntPtr – Andy

Répondre

2

Cela pourrait aider, j'ai fait cela pour un jeu de pong. Espérons que cela aide

  private void Form1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Down) 
     { 
      spaceKeyDown = true; 
     } 
     if (e.KeyCode == Keys.Up) 
     { 
      spaceKeyUp = true; 
     } 
     if (e.KeyCode == Keys.W) 
     { 
      spaceKeyW = true; 
     } 
     if (e.KeyCode == Keys.S) 
     { 
      spaceKeyS = true; 
     } 
     if (direction == 0) 
     { 
      if (e.KeyCode == Keys.Space) 
      { 
       Random rand = new Random(); 
       direction = rand.Next(1, 5); 
      } 
     } 
    } 

    private void Form1_KeyUp(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Down) 
     { 
      spaceKeyDown = false; 
     } 
     if (e.KeyCode == Keys.Up) 
     { 
      spaceKeyUp = false; 
     } 
     if (e.KeyCode == Keys.W) 
     { 
      spaceKeyW = false; 
     } 
     if (e.KeyCode == Keys.S) 
     { 
      spaceKeyS = false; 
     } 
    } 
    private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (spaceKeyDown == true) 
     { 
      if (p2y < picPicture.Height - Paddle2.Height) 
       p2y += 15; 
     } 
     if (spaceKeyUp == true) 
     { 
      if (p2y > 0) 
       p2y -= 15; 
     } 
     if (spaceKeyS == true) 
     { 
      if (p1y < picPicture.Height - Paddle1.Height) 
       p1y += 15; 
     } 
     if (spaceKeyW == true) 
     { 
      if (p1y > 0) 
       p1y -= 15; 
     } 
    } 
+0

Merci, Dylan - c'est en fait le système que j'ai en ce moment. J'espérais, cependant, obtenir quelque chose qui a utilisé RawInput pour analyser les contrôles car j'ai entendu dire qu'il peut être plus réactif (et je fais un shooter dans l'espace - donc le décalage du contrôleur pourrait être désastreux dans un gros combat). –