Amministrazione di una finestra

di Anonimizzato15324 il
10 risposte
Ciao ragazzi! vi parlo sempre dello stesso genere di problema, sfml su c++... Però questa volta il problema riguarda più che altro il c++ in generale. Vi spiego in breve il programma:
La finestra nelle sfml funziona con un ciclo. Al suo interno c'è un'if un'evento, l'event.close, che serve a chiudere la finestra. Se mettessi altri if(esempoi:chiede una variabile) non esegue più l'if dell'event.close, e la finestra in quel momento resta bloccata. Come faccio a rendere in ogni momento del programma la chiusura possibile? Grazie

10 Risposte

  • Non è un problema del C++, ma di come stai strutturando il tuo main loop.. Servirebbe almeno un po' di codice per poterti aiutare
  • Appena esco da scuola vi invio subito il programma
    È necessario che vi invii il programma completo(login,controlli ecc) o solo le cose che potrebbero essere tutti?
  • Intanto posta il main loop, molto probabilmente il problema è lì o in qualche funzione che richiami da lì
  • Eccolo qua:
    #include <SFML/Window.hpp>
    #include <SFML/Network.hpp>
    #include <SFML/Graphics.hpp>
    #include <iostream>
    #include <windows.h>
    #include <fstream>
    #include <direct.h>
    #include <stdlib.h>
    using namespace std;
    int main()
    {
        bool SFU;// Search For Update
        SFU = false;
    //Altre dicharazioni di variabili varie
    
    
     sf::RenderWindow window(sf::VideoMode(1250, 860), "Multiverse");
        window.setFramerateLimit(84);
        while (window.isOpen())
        {
            sf::Event event_close;
            while (window.pollEvent(event_close))
            {
                if (event_close.type == sf::Event::Closed)
                    window.close();
            }
    sf::Ftp MultiverseServerFTP;
        sf::Ftp::Response responseConnections = MultiverseServerFTP.connect("31.170.166.148");
    
        if (SFU == false)
        {
    //Molti if e cicli...
    //QUando si blocca in questi if la finestra è bloccata: non si piò nè muovere nè chiudere se non dalla console  o da code::blocs.
    SFU = true;
    }
    return 0;
    }
    
    Dovrei aver sintetizzato tutta la parte più importante... Se volete il programma completo chiedete
  • Probabilmente all'interno di quel if c'è qualcosa che blocca momentaneamente il flusso di esecuzione, forse in attesa di qualcosa, quindi il ciclo non riparte e gli eventi non vengono gestiti. Puoi postare cosa c'è nell'if?
  • tuixte ha scritto:


    Probabilmente all'interno di quel if c'è qualcosa che blocca momentaneamente il flusso di esecuzione, forse in attesa di qualcosa, quindi il ciclo non riparte e gli eventi non vengono gestiti. Puoi postare cosa c'è nell'if?
    Si, dentro l'if ci sono varie richieste di variabili.
    Esempio:
    
            if (SFU == false)
            {
                if (responseConnections.isOk())
                {
    
                    cout <<"Connected."<< endl;
                }
                else
                {
                    cout <<"Not connected, error..."<< endl;
                    cout << "Response status: " << responseConnections.getStatus() << endl;
                    system ("PAUSE");
                    return 0;
                }
                ifstream StaffAccount("Saves/StaffAccount.txt");
                if (!StaffAccount)
                {
                    cout <<"Insert the username for the login."<< endl;
                    cin >>username;
                    cout <<"Insert the password for the login."<< endl;
                    cin >>password;
                    cout <<"Do you want to save the username and pass?"<< endl;
                    cin >>res1;
                    while (res1 != "No" && res1 != "no" && res1 != "NO" && res1 != "Yes" && res1 != "yes" && res1 != "YES")
                    {
                        cout <<"Say Yes or No."<< endl;
                        cin >>res1;
                    }
    
    Oppure
    
    else
                {
                    cout <<"There's an account saved. Do you want to load it?"<< endl;
                    cin >>res1;
                    while (res1 != "No" && res1 != "no" && res1 != "NO" && res1 != "Yes" && res1 != "yes" && res1 != "YES")
                    {
                        cout <<"Say Yes or No."<< endl;
                        cin >>res1;
                    }
                    if (res1 == "Yes"||res1 == "yes"||res1 == "YES")
                    {
                        ifstream StaffAccount("Saves/StaffAccount.txt");
                        StaffAccount >> username >> password;
                    }
                    else
                    {
                        cout <<"Insert the username for the login."<< endl;
                        cin >>username;
                        cout <<"Insert the password for the login."<< endl;
                        cin >>password;
                        cout <<"Do you want to save the username and pass?"<< endl;
                        cin >>res1;
                        while (res1 != "No" && res1 != "no" && res1 != "NO" && res1 != "Yes" && res1 != "yes" && res1 != "YES")
                        {
                            cout <<"Say Yes or No."<< endl;
                            cin >>res1;
                        }
                        if (res1 == "Yes"||res1 == "yes"||res1 == "YES")
                        {
                            CreateDirectory("Saves", NULL);
                            ofstream StaffAccount ("Saves/StaffAccount");
                            StaffAccount <<username + " " + password;
                        }
                        else
                        {
                            cout <<"Ok."<< endl;
                        }
  • E' proprio quello che non deve esserci.
    Se chiedi una variabile in input, il codice resta fermo finché l'utente non inserisce il testo, e ciò impedisce di gestire gli eventuali eventi che nel frattempo si verificano.
    D'altra parte, se stai progettando un'applicazione grafica, perché chiedi input da terminale?
    Devi gestire il tutto graficamente, ad esempio creando un menu o una piccola gui personalizzata.
  • tuixte ha scritto:


    E' proprio quello che non deve esserci.
    Se chiedi una variabile in input, il codice resta fermo finché l'utente non inserisce il testo, e ciò impedisce di gestire gli eventuali eventi che nel frattempo si verificano.
    D'altra parte, se stai progettando un'applicazione grafica, perché chiedi input da terminale?
    Devi gestire il tutto graficamente, ad esempio creando un menu o una piccola gui personalizzata.
    Già, ma questo programma è stato iniziato tramite console. Quindi ho attivato la finestra(appena ho finito la base per l'aggiornamento automatico) e adesso devo solo trasferire tutto.
    Ma quindi, se trasferissi tutto graficamente, se chiedo una variabile non si blocca?
  • Si "blocca" nel momento in cui usi il cin.. Se fai tutto ad esempio tramite GUI, il programma non si blocca perché non "aspetta"
  • tuixte ha scritto:


    Si "blocca" nel momento in cui usi il cin.. Se fai tutto ad esempio tramite GUI, il programma non si blocca perché non "aspetta"
    Grazie!!
    Vado a trasferire tutto nella console.
Devi accedere o registrarti per scrivere nel forum
10 risposte