User Tools

Site Tools


didattici:esempio4sfml

Esempio 4 con sfml (cpp)

NOTA: RISPETTO A esempio3sfml, si fa uso di sleep per risparmiare CPU

  • prima di compilare è necessario installare i pacchetti elencati nella pagina sfml
  • poi è necessario mettere nella stessa cartella una piccola immagine assi.png (200×200) esempio di assi cartesiani con asse y diretto in basso
  • poi per compilare
      g++ esempio4.cpp -lsfml-graphics -lsfml-system -lsfml-window 
esempio4.cpp
#include <SFML/System/Time.hpp>
int main()
{
	const sf::Time TimePerFrame = sf::seconds(1.f/20.f); //
	const sf::Time TimeSleep = sf::seconds(1.f/(20*4.f)); //lo sleep deve durare meno di un frame. Altrimenti perdo un frame
 
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");    
    sf::View fixedView = window.getView(); 
    sf::Texture texture;
    texture.loadFromFile("assi.png");
    sf::Sprite spriteSfondo(texture);
 
    sf::VertexArray linea(sf::Lines,2);
 
    linea[0].position.x=10.f;
    linea[0].position.y=10.f; // x1,y1
    linea[0].color=sf::Color::Green;
    linea[1].position.x=150.f;
    linea[1].position.y=150.f; // x2,y2
    linea[1].color=sf::Color::Green;	
 
 
	sf::Clock clock; // non è nell'heap, ma è comunque costruito
	sf::Time tempoAccumulato = sf::Time::Zero; //azzerato
 
    while (window.isOpen()) // non usa eventi, cliclo attivo, CPU al 100% :(
    {
		sf::Time intervallo = clock.restart(); 	// esegue due azioni. azzera cronometro e memorizza l'intervallo trascorso
		tempoAccumulato += intervallo;			// incremento totalizzatore( che non si azzera MAI)
		while (tempoAccumulato > TimePerFrame)	// se ho superato il periodo di un frame  0.0167 sec. 
												// elaboro questo while, altrimenti non entro nel while
		{
			tempoAccumulato -= TimePerFrame; 	// diminuisci un po' il tempo accumulato (se e' passato un solo frame)
												// ripeti la diminuzioni tante volte per non perdere frame
 
			// dentro il while, mantiene aggiornata la finestra almeno una volta ogni frame.
			sf::Event event;
			while (window.pollEvent(event))
			{
				if (event.type == sf::Event::Closed)
					window.close();
			}
 
			window.clear();
			window.setView(fixedView); 
			window.draw(spriteSfondo);
 
			window.draw(linea);  // segmento
			//window.draw(shape); // qualsiasi altro oggetto aggiunto sopra
			window.display();
		}
 
		sf::sleep(TimeSleep);// quando non eseguo il while, riposo.
    }
 
    return 0;
}
didattici/esempio4sfml.txt · Last modified: 2020/06/08 22:20 by 127.0.0.1