Comment gérer la saisie de la souris dans XNA?

13

Je développe un jeu de cartes en XNA.

Y a-t-il un OnClickévénement dans XNA pour les objets?

J'essaie de faire bouger les cartes lorsque le joueur clique dessus. Dans ce projet, il y a une classe Sprite qui tire la carte, mais je suis un peu coincé parce que je ne sais pas comment utiliser les OnClickévénements ou quelque chose comme ça.

Luis
la source

Réponses:

12

Lorsque vous travaillez avec XNA en général, vous devez passer d'un paradigme de code piloté par événements à un paradigme de code piloté par boucle. Votre code de mise à jour boucle 60 fois / sec. Donc, à chaque fois, regardez l'état de la souris et si un bouton est enfoncé et que le pointeur se trouve dans votre rect, puis branchez-vous sur le code que vous placez normalement dans un événement OnClick.

Steve H
la source
2
Il semble que cela puisse être sémantiquement correct, mais aussi faux à mon avis. Il n'y a aucun événement lorsque vous vous penchez sur un thread et sur l'état actuel de chaque boucle. C'est pourquoi nous créons nos propres événements et écrivons leurs gestionnaires correspondants. Je dirais que l'utilisation du contrôle de flux pour se connecter à chaque instance de souris vers le bas deviendrait folle dans un grand projet. Au lieu de cela, enregistrez un événement et écrivez des gestionnaires si nécessaire. Les événements ont été pensés en premier lieu pour cette raison.
brandon
5
Brandon: Vous n'utilisez pas "le contrôle de flux pour vous connecter à chaque occurrence de la souris". Vous enregistrez l'état actuel et précédent de la souris une fois au début de chaque image, puis à chaque endroit où votre code répond à une pression sur la souris, vous faites simplement if(MouseLeftPress()){ DoSomething(); }, où MouseLeftPress()est une méthode que vous écrivez pour comparer les états actuel et précédent de la souris avec le bouton gauche. Je trouve cela plus facile que d'implémenter des événements la plupart du temps.
Olhovsky
4
L'interrogation simple devient vraiment moche au-delà de vos commandes d'arcade de base. J'ai une classe de gestionnaire d'entrée qui capture l'état de la manette de jeu en tant que FlagAttributes et vous permet de mapper les délégués à différentes combinaisons de boutons. La prochaine étape consiste à implémenter le timing. Tout ce débat ne fait que renforcer l'argument de Steve H, vous donnez un système de vote et vous êtes libre de le construire pour soutenir le paradigme que vous préférez.
michael.bartnett
6

XNA ne vous donne que juste assez pour construire vos propres classes d'entrée - et vous devriez le faire en tenant compte de l'utilitaire qu'elles offrent.

Je recommanderais la classe d'entrée de souris décrite dans cet article de blog ( code source ). Il détecte un bouton enfoncé, maintenu ou relâché, et vous permet d'obtenir ces informations via des sondages ou des événements.

Sur une note connexe, le même article de blog fournit également des classes de périphériques d'entrée de clavier et de manette de jeu.

doppelgreener
la source
3

Le code réel pour vérifier un clic de souris dans XNA est quelque chose comme ça;

    MouseState previousMouseState;
    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        //store the current state of the mouse
        previousMouseState = Mouse.GetState();
    }


    protected override void Update(GameTime gameTime)
    {
        // .. other update code


        //is there a mouse click?
        //A mouse click occurs if the goes from a released state
        //in the previous frame  to a pressed state 
        //in the current frame
        if (previousMouseState.LeftButton == ButtonState.Released 
            && Mouse.GetState().LeftButton == ButtonState.Pressed)
        {
            //do your mouse click response...

        }

        //save the current mouse state for the next frame
        // the current 
        previousMouseState = Mouse.GetState();

        base.Update(gameTime);
    }
Ken
la source
2

Si votre jeu est en 3D, vous pouvez implémenter la sélection, qui est décrite ici: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . Fondamentalement, cela crée un rayon de la caméra à l'endroit où la souris clique (avec une petite matrice sans projection là-dedans), puis vous vérifiez si l'un de vos objets a été intersecté par le rayon.

Si votre jeu est en 2D, vous devriez pouvoir traduire les coordonnées de la fenêtre en coordonnées de jeu assez facilement. Vérifiez ensuite si les coordonnées sélectionnées se trouvent dans les limites de l'un de vos objets.

MichaelHouse
la source
1

La façon la plus simple de voir si la souris est cliquée est la suivante

//Create this variable
MouseState mouseState;

maintenant dans la méthode de mise à jour, ajoutez ceci

mouseState = Mouse.GetState();

if (mouse.RightButton == ButtonState.Pressed)
{
     //Do Stuff
}

j'espère que cela a aidé

Battle_Pasture
la source