=====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; }