=====Esempio 4 con sfml (cpp)=====
NOTA: RISPETTO A [[didattici:esempio3sfml]], si fa uso di sleep per risparmiare CPU
* prima di compilare è necessario installare i pacchetti elencati nella pagina [[didattici:sfml#linguaggio_c_plus_plus|sfml]]
* poi è necessario mettere nella stessa cartella una piccola immagine **assi.png** (200x200) {{ :didattici:assi.png?direct |esempio di assi cartesiani con asse y diretto in basso}}
* poi per compilare g++ esempio4.cpp -lsfml-graphics -lsfml-system -lsfml-window
#include
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;
}