Wie gehe ich mit Mauseingaben in XNA um?

13

Ich entwickle ein Kartenspiel in XNA.

Gibt es OnClickin XNA ein Ereignis für Objekte?

Ich versuche, Karten zum Bewegen zu bringen, wenn der Spieler darauf klickt. In diesem Projekt gibt es eine Sprite-Klasse, die die Karte zeichnet, aber ich stecke ein wenig fest, weil ich nicht weiß, wie ich OnClickEreignisse oder ähnliches verwenden soll.

Luis
quelle

Antworten:

12

Wenn Sie im Allgemeinen mit XNA arbeiten, müssen Sie von einem ereignisgesteuerten Codeparadigma zu einem schleifengesteuerten Codeparadigma übergehen. Ihr Aktualisierungscode wird 60-mal pro Sekunde wiederholt. Schauen Sie sich also jedes Mal den Zustand der Maus an und verzweigen Sie zu Code, den Sie normalerweise in einem OnClick-Ereignis platzieren würden, wenn eine Taste gedrückt und der Zeiger in Ihrem Rechteck ist.

Steve H
quelle
2
Es scheint so, als ob das semantisch richtig, aber meiner Meinung nach auch falsch wäre. Es gibt keine Ereignisse, bei denen es darum geht, einen Thread zu betrachten und den aktuellen Status der einzelnen Schleifen zu ermitteln. Aus diesem Grund erstellen wir unsere eigenen Events und schreiben die entsprechenden Handler. Ich würde sagen, dass es in einem großen Projekt verrückt werden würde, die Flusssteuerung zu verwenden, um zu jeder Instanz von Mouse-Down zu verzweigen. Registrieren Sie stattdessen ein Ereignis und schreiben Sie Handler, wo immer sie benötigt werden. Aus diesem Grund wurden in erster Linie Ereignisse ins Auge gefasst.
Brandon
5
Brandon: Sie verwenden die Flusskontrolle nicht, um zu jeder Instanz von Mouse Down zu verzweigen. Sie erfassen den aktuellen und vorherigen Maus Zustand einmal zu Beginn jedes Rahmens, und dann an jedem Ort , dass Ihr Code reagiert auf ein mousedown- drücken Sie einfach tun if(MouseLeftPress()){ DoSomething(); }, wo MouseLeftPress()ein Verfahren , um die aktuellen und vorherigen Zustände linke Maustaste gedrückt schreiben , ist zu vergleichen. Ich finde das die meiste Zeit einfacher als Ereignisse zu implementieren.
Olhovsky
4
Einfaches Polling wird jenseits der grundlegenden Arcade-Steuerelemente wirklich hässlich. Ich habe eine Input-Manager-Klasse, die den Gamepad-Status als FlagAttributes aufzeichnet und es Ihnen ermöglicht, Delegaten verschiedenen Tastenkombinationen zuzuordnen. Der nächste Schritt ist die Implementierung des Timings. All diese Debatten bestärken Steve Hs Argument, Sie geben ein Abstimmungssystem vor und Sie können darauf aufbauen, um das Paradigma zu unterstützen, das Sie bevorzugen.
michael.bartnett
6

Mit XNA haben Sie gerade genug Zeit, um Ihre eigenen Eingabe-Klassen zu erstellen.

Ich würde die in diesem Blog-Beitrag beschriebene Mauseingabeklasse empfehlen ( Quellcode ). Es erkennt, dass eine Taste gedrückt, gehalten oder losgelassen wird, und lässt Sie diese Informationen entweder über Abfragen oder Ereignisse abrufen.

In diesem Blogbeitrag finden Sie auch Klassen für Tastatur- und Gamepad-Eingabegeräte.

doppelgreener
quelle
3

Der eigentliche Code zum Überprüfen eines Mausklicks in XNA sieht ungefähr so ​​aus.

    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
quelle
2

Wenn Sie ein 3D-Spiel haben, können Sie die Auswahl implementieren, die hier beschrieben wird: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . Im Grunde genommen erzeugt dies einen Strahl von der Kamera zu der Stelle, an der die Maus klickt (mit einer kleinen Matrix, die nicht projiziert), und Sie prüfen, ob sich eines Ihrer Objekte mit dem Strahl überschneidet.

Wenn Ihr Spiel 2D ist, sollten Sie in der Lage sein, Fensterkoordinaten relativ einfach in Spielkoordinaten zu übersetzen. Überprüfen Sie anschließend, ob die ausgewählten Koordinaten innerhalb der Grenzen eines Ihrer Objekte liegen.

MichaelHouse
quelle
1

Der einfachste Weg, um zu sehen, ob die Maus gedrückt ist, ist dies

//Create this variable
MouseState mouseState;

Jetzt in der Update-Methode hinzufügen

mouseState = Mouse.GetState();

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

hoffe das hat geholfen

Battle_Pasture
quelle