Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SFML i dynamiczny odczyt rozmiaru okna w tym samym wątku

Ostatnio zmodyfikowano 2019-06-23 19:00
Autor Wiadomość
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.

C/C++
#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()
{
    // Create the main window
    sf::RenderWindow my_window( sf::VideoMode( 220, 220, 32 ), "Okno Rozmiar X i Y" );
    // Color background
    //sf::Color bgColor(sf::Color::Black);
    sf::Color bgColor( 30, 30, 30 );
   
    my_window.setSize( sf::Vector2u( 220, 220 ) );
   
    // Create a graphical text to display
    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 );
   
    // Create a graphical dynamic text to display
    sf::Text text_dynamic_x;
    text_dynamic_x.setPosition( 140, 10 );
    text_dynamic_x.setFont( font ); //select the font
    text_dynamic_x.setCharacterSize( 33 ); // in pixels, not points!
    text_dynamic_x.setColor( sf::Color::Red );
    //text_dynamic_x.setColor(sf::Color(255, 255, 255, 255));
   
    sf::Text text_dynamic_y;
    text_dynamic_y.setPosition( 140, 45 );
    text_dynamic_y.setFont( font ); //select the font
    text_dynamic_y.setCharacterSize( 33 ); // in pixels, not points!
    text_dynamic_y.setColor( sf::Color::Red );
    //text_dynamic_y.setColor(sf::Color(255, 255, 255, 255));
   
    // Load a music to play
    sf::Music music;
    if( !music.openFromFile( "storm.wav" ) )
         return EXIT_FAILURE;
    // Play the music
    music.play();
   
    while( my_window.isOpen() )
    {
       
        sf::Event windowEvent;
        while( my_window.pollEvent( windowEvent ) )
        {
            if( windowEvent.type == sf::Event::Closed )
                 my_window.close();
           
            // Clear screen
            //my_window.clear();
            //my_window.clear(sf::Color::Black);
            my_window.clear( bgColor );
           
            if( windowEvent.type == sf::Event::KeyPressed && windowEvent.key.code == sf::Keyboard::Escape )
                 my_window.close();
           
            // Draw the string
            my_window.draw( szerokosc );
            my_window.draw( wysokosc );
           
            // Draw dynamic string
            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 );
           
        }
        //display na samym koncu petli
        my_window.display();
    }
   
    return 0;
}

P-174827
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.
P-174828
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ć.
P-174835
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

C/C++
int main()
{
    /* Create the main window
        flag sf::Style:: None | Titlebar | Resize | Close | Fullscreen
        default flag sf::Style:: Resize | Close Resize | Close
        mixed flag sf::Style::Titlebar |  sf::Style::Close
        */
   
    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 );
    }
P-174836
« 1 »
  Strona 1 z 1