SFML Frage



  • Hi, ich möchte sfml lernen und hab erstmal versucht den Beispielcode "sfml works" zu verändern und dabei eine Frage. Ich hab als Parameter für shape eine variable eingesetzt die sich im "while window.isopen()" loop inkrementiert. warum wird der kreis nicht immer größer wenn ich kompiliere?

    #include <iostream>
    #include <SFML/Graphics.hpp>
    
    using namespace std;
    
    float test = 50;
    
    int main()
    {
    	sf::RenderWindow window(sf::VideoMode(500, 500), "SFML works!");
    	sf::CircleShape shape(test);
    	shape.setFillColor(sf::Color::Blue);
    	shape.setPosition(50, 50);
    	shape.setRotation(50.f);
    
    	while (window.isOpen())
    	{
    		sf::Event event;
    		while (window.pollEvent(event))
    		{
    			if (event.type == sf::Event::Closed)
    				window.close();
    		}
    
    		test++;
    		window.clear();
    		window.draw(shape);
    		window.display();
    	}
    
    	return 0;
    }
    


  • Sicher, dass du die Grundlagen von C++ kannst?

    Wenn du in Zeile 12 ein Shape erstellst, wird der aktuelle Wert von test kopiert und verwendet.
    Wenn du dann test in inkrementierst, hat das keinerlei Auswirkungen auf das Shape, weil das komplett unabhängige Dinge sind.



  • Ok, warum kommt hier der Fehler failed to load font? ich hab den font im sfml ordner, im debug und release ordner.

    #include <iostream>
    #include <SFML/Graphics.hpp>
    
    using namespace std;
    
    int test = 0;
    
    int main()
    {
    	sf::RenderWindow window(sf::VideoMode(1000, 1000), "SFML works!");
    	sf::CircleShape shape(50);
    	shape.setFillColor(sf::Color::Blue);
    	shape.setPosition(200, 200);
    	sf::Font font;
    	sf::Text text;
    	font.loadFromFile("28.ttf");
    	text.setFont(font);
    	text.setCharacterSize(100);
    	text.setColor(sf::Color::Red);
    	text.setString("Was Geht ab");
    
    	while (window.isOpen())
    	{
    		sf::Event event;
    		while (window.pollEvent(event))
    		{
    			if (event.type == sf::Event::Closed)
    				window.close();
    		}
    
    		shape.setRotation(test);
    		test++;
    		if (test >= 1000) 
    			test = 0;
    
    		window.clear();
    		window.draw(text);
    		window.display();
    	}
    
    	return 0;
    }
    


  • ah ich bin drauf gekommen. andere frage, ist es üblich zwischen clear() und display() viele draws zu machen? also für jedes objekt ?



  • Ich denke schon, so mach ich das auch.
    Wenn du viele gleichartige Objekte hast, kannst Du sie auch in einen Vektor/Array reintun und dann zum Zeichnen mit einer for-Schleife über den Vektor gehen. Das sieht dann so aus:

    for (auto& it=SpriteVector.begin(); it!=SpriteVector.end(); ++it)
    	{
    	    mMainWindow.draw(*it);
    	}
    


  • Zitat aus der Offiziellen Dokumentation:

    This clear/draw/display cycle is the only good way to draw things. Don't try other strategies, such as keeping pixels from the previous frame, "erasing" pixels, or drawing once and calling display multiple times. You'll get strange results due to double-buffering.
    Modern graphics hardware and APIs are really made for repeated clear/draw/display cycles where everything is completely refreshed at each iteration of the main loop. Don't be scared to draw 1000 sprites 60 times per second, you're far below the millions of triangles that your computer can handle.

    Quelle: http://www.sfml-dev.org/tutorials/2.3/graphics-draw.php(10.05.2015)


Anmelden zum Antworten