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

SFML - wolna obsługa zdarzeń

Ostatnio zmodyfikowano 2016-12-17 12:31
Autor Wiadomość
Warmix
Temat założony przez niniejszego użytkownika
SFML - wolna obsługa zdarzeń
» 2016-12-16 23:22:36
Cześć, niedawno zacząłem kombinować coś korzystając z biblioteki SFML. Trochę kodu napisałem i napotkałem dziwny problem, ponieważ obsługa zdarzeń działa z pewnym opóźnieniem, bo przypuszczalnie klikając na button uruchamia mi się metoda klasy, która ustawia odpowiednio parę kształtów i tekstów na ekranie (żeby móc kliknąć czy na pewno chcesz wyjść) i wyrzucane jest to przez draw cały czas w pętli app.isOpen, i trzeba tak średnio poczekać około 1-2 sekund, bliżej 2, dlatego wydaje mi się, że jeśli przy takiej zwykłej operacji trwa to trochę, to co będzie, gdy coś bardziej złożonego będzie.
Generalnie chciałbym dostać jakieś rady, w jaki sposób mogę właśnie przyspieszyć działanie i obsługę zdarzeń.
P-155070
Gibas11
» 2016-12-17 02:35:41
Kiedyś pisząc gierkę w SFML naskrobałem bardzo prosty zestaw klas do takich rzeczy, kod niestety bez komentarzy, ale może jutro (dzisiaj?) jakieś dodam.
widget.hpp
widgetpack.hpp
widgetpack.cpp
button.hpp
button.cpp

Podane w najwygodniejszej kolejności do czytania.
I okrojony przykład użycia:
C/C++
//Deklaracja widgetów i ich zestawu
gui::WidgetPack widgets;
gui::Button exitButton( "exit_normal.png", "exit_focus.png", window );
gui::Button playButton( "play_normal.png", "play_focus.png", window );
gui::Button yes( "yes_normal.png", "yes_focus.png", window );
gui::Button no( "no_normal.png", "no_focus.png", window );

//Podpięcie widgetów do paczki
widgets.add( & exitButton );
widgets.add( & playButton );
widgets.add( & yes );
widgets.add( & no );

// …

for( sf::Event ev; pollEvent( ev ); )
{
    /* Obsługa innych zdarzeń */
   
    /* Przesłanie zdarzenia do paczki widgetów */
    widgets.update( ev );
}

W każdym razie mój kod działa bez żadnych opóźnień i możesz się nim zainspirować (nie obiecuję, że jest idealny – pewnie nie). Do twojego problemu trudno się bezpośrednio odnieść, bo bez kodu mogę zgadywać jeszcze pół roku.
P-155071
michal11
» 2016-12-17 03:46:21
Po co pisać swoje gui w sfml kiedy można skorzystać z tgui lub sfgui? A jeżeli ktoś chce to robić dla treningu to polecam wzorować się na tym co tam jest w kodzie.
P-155072
Gibas11
» 2016-12-17 12:10:52
Tgui i sfgui to czasem overkill (jest tak ładnie pasujące słówko po polsku?), nie używał bym tego chcąc dodać trzy przyciski na krzyż czy coś.
P-155077
Warmix
Temat założony przez niniejszego użytkownika
» 2016-12-17 12:31:19
A jeszcze mam pytanie. Aktualnie wszystkie tekstury i inne rzeczy z pliku ładuję na początku, a później je tylko obsługuję.

Dajmy na to, że po kliknięciu na coś wywołuje się metoda funkcji, w której ustawiam takie parametry, np.:

C/C++
obrazek[ 1 ].setSize( sf::Vector2f( float( window_x * 0.5 ), float( window_y * 0.95 ) ) );
obrazek[ 1 ].setTexture( & tekstura2 );
obrazek[ 1 ].setRotation( - 30 );
obrazek[ 1 ].setPosition( sf::Vector2f( float( window_x / 2 - obrazek[ 1 ].getSize().x * 1.2 ), float( window_y / 2 - obrazek[ 1 ].getSize().y / 7 ) ) );

tekst[ 6 ].setFont( font[ 0 ] );
tekst[ 6 ].setString( "Tak" );
tekst[ 6 ].setCharacterSize( 20 );
tekst[ 6 ].setFillColor( sf::Color::Black );
tekst[ 6 ].setPosition( 0.0f, 0.0f );
tekst[ 6 ].setPosition( ksztalt[ 2 ].getPosition().x + ksztalt[ 2 ].getGlobalBounds().width / 2 - tekst[ 6 ].getGlobalBounds().width / 2 - tekst[ 6 ].getGlobalBounds().left, ksztalt[ 2 ].getPosition().y + ksztalt[ 2 ].getGlobalBounds().height / 2 - tekst[ 6 ].getGlobalBounds().height / 2 - tekst[ 6 ].getGlobalBounds().top );


I w tej metodzie jest kilka takich ustawień itd. I teraz moje pytanie, czy dużo szybciej zadziała mi ten program, jeżeli te wszystkie kształty, ustawienia zrobię na początku przy uruchomieniu, a potem tylko ewentualnie będą lekkie zmiany? Będzie znacząca różnica czy nie ma to specjalnego znaczenia??
P-155080
« 1 »
  Strona 1 z 1