Wie frage ich in SFML ab ob eine maus taste gedrückt ist?



  • Hi Leute,
    hab da n kleines Problem.
    und zwar habe ich einen grafik dargstellt.
    wenn ich nun mit meiner maus auf diese grafik zeige beendet sich das programm. soweit so gut.
    nun möchte ich aber noch hinzufügen das das programm nur beendet wird wenn ich auf der Grafik bin und die linke maustaste drücke.

    Wie stell ich das in sfml am besten an?
    habe schon herum probiert aber ohne Erfolg.

    der codeabschnitt lautet wie folgt

    if(MausX >= 510 && MausX <= 628 && MausY >= 386 && MausY <= 412)
    {
    if(??????????)
    {
    App.Close();
    }
    }





  • das war auch meine anlauf stelle aber irgendwie funzt das nicht das hatte ich bei den fragezeichen

    Input.IsMouseButtonDown(sf::Mouse::Right)



  • Saibot1988 schrieb:

    das war auch meine anlauf stelle aber irgendwie funzt das nicht

    Was "funzt" nicht? Hast du mal überprüft, ob die Koordinaten stimmen?



  • ja habe ich
    das war das erste was ich angepasst habe da musste ich die maus nur innerhalb des bereichs bewegen und das programm wurde beendet.
    nun wollte ich das erweitern in dem ich sage das es erst beendet wird wenn die maus in dem bereich ist und gleichzeitig die linke maustaste gedrückt wird.



  • Dir ist klar dass "MouseMoved" und "MouseButtonPressed" unabhaengige Events sind?



  • wie meinst du jetzt?



  • Hier mal ein kurzer, kompilierbarer Beispielcode der auf dein Problem zugeschnitten ist. Vielleicht hilft er dir ja etwas:

    #include <SFML/Graphics.hpp>
    
    // Gibt 'Rectangle' des Sprites zurück und achtet auf dessen gesetzten Mittelpunkt (aber nicht auf Skalierung oder Rotation)
    sf::FloatRect spriteRectangle(const sf::Sprite &sprite)
    {
    	return sf::FloatRect(sprite.GetPosition().x - sprite.GetCenter().x,
    						 sprite.GetPosition().y - sprite.GetCenter().y,
    						 sprite.GetPosition().x + sprite.GetSize().x - sprite.GetCenter().x,
    						 sprite.GetPosition().y + sprite.GetSize().y - sprite.GetCenter().y);
    }
    
    int main()
    {
    	// Fenster erstellen
    	sf::RenderWindow fenster(sf::VideoMode(800, 600, 32), "Klick und zu", sf::Style::Close);
    	fenster.SetFramerateLimit(30);
    	// Sprite erstellen und noch eine Variable für die Mauscursorkoordinaten
    	sf::Image bild(100, 100, sf::Color::Red);
    	sf::Sprite klickSprite(bild, sf::Vector2f(fenster.GetWidth() / 2.f, fenster.GetHeight() / 2.f));
    	klickSprite.SetCenter(klickSprite.GetSize() / 2.f);
    	sf::Vector2f mausposition(0.f, 0.f);
    	// Hauptschleife
    	while(fenster.IsOpened()) {
    		sf::Event ereignis;
    		// Ereignisschleife
    		while(fenster.GetEvent(ereignis)) {
    			// Schließensymbol ('X') angeklickt ODER 'Escape' gedrückt -> Fenster schließen
    			if(ereignis.Type == sf::Event::Closed || (ereignis.Type == sf::Event::KeyPressed && ereignis.Key.Code == sf::Key::Escape)) {
    				fenster.Close();
    			}
    			// Wurde die Maus bewegt -> aktualisiere Mauscursorkoordinaten
    			if(ereignis.Type == sf::Event::MouseMoved) {
    				mausposition.x = static_cast<float>(ereignis.MouseMove.X);
    				mausposition.y = static_cast<float>(ereignis.MouseMove.Y);
    			}
    			// Wurde die linke Maustaste gedrückt, überprüfe ob sich die Koordinaten des Mauscursors innerhalb
    			// des 'Rectangles' (= Rechteck) des Sprites befinden. Falls ja -> Fenster schließen
    			if(ereignis.Type == sf::Event::MouseButtonPressed && ereignis.MouseButton.Button == sf::Mouse::Left) {
    				if(spriteRectangle(klickSprite).Contains(mausposition.x, mausposition.y)) {
    					fenster.Close();
    				}
    			}
    		}
    		// Zeichnen
    		fenster.Clear();
    		fenster.Draw(klickSprite);
    		fenster.Display();
    	}
    
    	return 0;
    }
    

Anmelden zum Antworten