nanoant20 Temat założony przez niniejszego użytkownika |
SFML i dynamiczny odczyt rozmiaru okna w tym samym wątku » 2019-06-22 23:37:17 Czy istnieje metoda w SFML, zeby wyniki były bardziej płynnie odczytywane. Poniżej zamieszczam listing, w którm odczytuje rozmiar okna. Działa, ale rozmiar jest odczytywany wtedy gdy rozmiar okna zostanie zmieniony. A mnie interesuje, zeby odczyt był bardziej dynamiczny, tzn. jeżeli złapię myszką za róg okna i bedę to okno rozciągał, to żeby w czasie rzeczywistym, te dane były aktualizowane. #include <iostream> #include <cstring>
#include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <SFML/System.hpp> #include <SFML/Audio.hpp>
using namespace std; using namespace sf;
int main() { sf::RenderWindow my_window( sf::VideoMode( 220, 220, 32 ), "Okno Rozmiar X i Y" ); sf::Color bgColor( 30, 30, 30 ); my_window.setSize( sf::Vector2u( 220, 220 ) ); sf::Font font; if( !font.loadFromFile( "DELPHIN_.TTF" ) ) return EXIT_FAILURE; sf::Text szerokosc( "Szerokosc: ", font, 28 ); szerokosc.setPosition( 20, 20 ); sf::Text wysokosc( "Wysokosc: ", font, 28 ); wysokosc.setPosition( 20, 50 ); sf::Text text_dynamic_x; text_dynamic_x.setPosition( 140, 10 ); text_dynamic_x.setFont( font ); text_dynamic_x.setCharacterSize( 33 ); text_dynamic_x.setColor( sf::Color::Red ); sf::Text text_dynamic_y; text_dynamic_y.setPosition( 140, 45 ); text_dynamic_y.setFont( font ); text_dynamic_y.setCharacterSize( 33 ); text_dynamic_y.setColor( sf::Color::Red ); sf::Music music; if( !music.openFromFile( "storm.wav" ) ) return EXIT_FAILURE; music.play(); while( my_window.isOpen() ) { sf::Event windowEvent; while( my_window.pollEvent( windowEvent ) ) { if( windowEvent.type == sf::Event::Closed ) my_window.close(); my_window.clear( bgColor ); if( windowEvent.type == sf::Event::KeyPressed && windowEvent.key.code == sf::Keyboard::Escape ) my_window.close(); my_window.draw( szerokosc ); my_window.draw( wysokosc ); text_dynamic_x.setString( std::to_string( my_window.getSize().x ) ); my_window.draw( text_dynamic_x ); text_dynamic_y.setString( std::to_string( my_window.getSize().y ) ); my_window.draw( text_dynamic_y ); } my_window.display(); } return 0; }
|
|
pekfos |
» 2019-06-23 00:54:46 Gdy rozciągasz okno w SFML, cały główny wątek jest wstrzymany. Jeśli odczytasz rozmiar okna w innym wątku, to będziesz mieć aktualną wartość, ale oczywiście jej nie wyświetlisz w oknie SFML. |
|
DejaVu |
» 2019-06-23 18:22:45 Wydaje mi się, że da się ustawić to w Windowsie, aby okna były odświeżane stale w trakcie zmiany rozmiaru okna. Niemniej jednak nie powinieneś tej opcji zmieniać w systemie tylko po to, aby Twoja aplikacja zachowywała się lepiej. Generalnie nie powinieneś uzależniać rezultatów działania aplikacji od aktualnie trwającej akcji zmiany rozmiaru okna. Skoro użytkownik zmienia rozmiar okna to tym samym akceptuje również artefakty z tym związane. /edit: Może to coś da: https://stackoverflow.com/questions/2165759/how-do-i-force-windows-not-to-redraw-anything-in-my-dialog-when-the-user-is-resi. Niemniej jednak poziom energii włożonej, względem rezultatu raczej nie jest wart inwestowania czasu, gdy jesteś na etapie tworzenia aplikacji. Najpierw zrób produkt, a potem zastanów się czy warto dodatkowo z tym walczyć. |
|
nanoant20 Temat założony przez niniejszego użytkownika |
» 2019-06-23 19:00:07 Dzięki wielkie za poświęcony czas. Odpuszczę sobie, i zastosuje się do waszych rad. Rozmiar okna ustawie na sztywno. Chodzi mi po głowie jeszcze jeden pomysł, tylko nie wiem czy można to zrobić przy uzyciu SFML. A dokładnie, czy można by odczytać rozdzielczość ekranu i wtedy ustawić rozmiar okna. A dobrze już doczytałem jest metoda sf::VideoMode::getDesktopMode() Add. np. taki design int main() { int screen_size = sf::VideoMode::getDesktopMode().width; sf::RenderWindow my_window; if( screen_size >= 1024 ) { my_window.create( sf::VideoMode( 555, 330, 32 ), "screen 1024", sf::Style::Titlebar | sf::Style::Close ); } if( screen_size == 800 ) { my_window.create( sf::VideoMode( 333, 220, 32 ), "screen 800", sf::Style::None ); }
|
|
« 1 » |