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

[SFML] nieskończona pętla przy pobieraniu z pliku

Ostatnio zmodyfikowano 2018-08-14 23:55
Autor Wiadomość
Wolfff
Temat założony przez niniejszego użytkownika
» 2018-08-14 18:15:14
Wszystko co było ważne już wrzuciłem, ale jeżeli będzie to większą pomocą to tutaj wrzucam praktycznie całość:
C/C++
// wczesniej jest tylko tona zmiennych

std::string st_number; //   <- numer zapisany jako string skladajacy sie z #loc#choice#rand_story
std::vector < std::string > story; // <- story line by line
std::string opt_one; // <- choice one
std::string opt_two; // <- choice two
std::vector < std::string > result_one; // <- result for choice 1
std::vector < std::string > result_two; // <- ................ 2
std::vector < std::string > stats_one; // <- gains and losses for result 1
std::vector < std::string > stats_two; // <- ........................... 2

int stor = 0;
int choice_1 = 0;
int story_count = 0;

sf::Text fstory;
sf::Text sstory;
fstory.setCharacterSize( 15 );
sstory.setCharacterSize( 15 );
fstory.setFillColor( sf::Color( 0, 0, 0, 255 ) );
sstory.setFillColor( sf::Color( 0, 0, 0, 255 ) );
fstory.setPosition( 150.f, 470.f );
sstory.setPosition( 150.f, 505.f );
fstory.setFont( font );
sstory.setFont( font );

bann_1.setPosition( 150.f, 465.f );
bann_2.setPosition( 150.f, 500.f );
///////////////////////////////////////////////////////////
if( loc_chosen )
{
    alpha = alpha_max;
}



while( Running )
{
    while( App.pollEvent( event ) )
    {
        if( event.type == sf::Event::Closed )
        {
            return( - 1 );
        }
       
        if( event.type == sf::Event::KeyPressed )
        {
            if( !loc_chosen )
            {
                switch( event.key.code )
                {
                case sf::Keyboard::Down:
                    {
                        if( location < 3 ) { location++; std::cout << location << std::endl; } break;
                    }
                case sf::Keyboard::Up:
                    {
                        if( location > 0 ) { location--; std::cout << location << std::endl; } break;
                    }
                case sf::Keyboard::Return:
                    {
                        st_number += std::to_string( location );
                        std::cout << "LOC NUMBER: " << st_number << std::endl;
                        loc_chosen = true; break;
                    }
                }
            }
           
            else if( loc_chosen && !job_chosen )
            {
                std::cout << linia_loc[ location * 2 ] << std::endl;
                std::cout << linia_loc[( location * 2 ) + 1 ] << std::endl;
                switch( event.key.code )
                {
                case sf::Keyboard::Up:
                    choice = 0;
                    break;
                case sf::Keyboard::Down:
                    choice = 1;
                    break;
                case sf::Keyboard::Return:
                    st_number += std::to_string( choice );
                    st_number += std::to_string( 0 );
                    std::cout << "LOC + CHOICE NUMBER + RAND(0): " << st_number << std::endl;
                    job_chosen = true;
                    break;
                }
            }
            else if( job_chosen )
            {
               
                if( event.key.code == sf::Keyboard::Return )
                {
                    stor++;
                }
                else if( stor > story_count )
                {
                    switch( event.key.code )
                    {
                    case sf::Keyboard::Up:
                        choice_1 = 0; break;
                    case sf::Keyboard::Down:
                        choice_1 = 1; break;
                    }
                }
               
            }
           
           
           
           
        }
    }
   
   
    if( loc_chosen )
    {
        ch_1.setString( linia_loc[ location * 2 ] );
        ch_2.setString( linia_loc[( location * 2 ) + 1 ] );
    }
   
    if( job_chosen )
    {
        LookFor( st_number, opt_one, opt_two, story, result_one, result_two, stats_one, stats_two ); // wpada w nieskonczona petle
        story_count =( int( story.size() / 2 ) ); // przez to że wpada w pętlę story.size() rośnie bez przerwy
        // przez co nie mogę przetestować wyświetlania poniżej - nigdy nie wyjdę z
        if( story_count > 0 ) // pierwszego warunku if
        {
            if( stor <= story_count )
            {
                fstory.setString( story[( stor * 2 ) ] );
                sstory.setString( story[( stor * 2 ) + 1 ] );
            }
            if( stor > story_count )
            {
                fstory.setString( opt_one );
                sstory.setString( opt_two );
               
                if( choice == 0 )
                {
                    arrow_r.setPosition( 120.f, 470.f );
                }
                else { arrow_r.setPosition( 120.f, 505.f ); }
               
            }
           
        }
    }
    App.clear();
    App.draw( sprite );
    for( auto & sprt: sprite_br )
    {
        App.draw( sprt );
    }
    for( auto & text: location_txt )
    {
        App.draw( text );
    }
    if( !loc_chosen && !job_chosen )
    {
        arrow_l.setPosition( 140.f, 65.f *( location + 1 ) );
        App.draw( arrow_l );
    }
    if( loc_chosen )
    {
        if( !job_chosen )
        {
            if( choice == 0 )
            {
                arrow_r.setPosition( 120.f, 470.f );
            }
            else { arrow_r.setPosition( 120.f, 505.f ); }
        }
        App.draw( s_gray );
        App.draw( bann_1 );
        App.draw( bann_2 );
        App.draw( arrow_r );
        App.draw( ch_1 );
        App.draw( ch_2 );
    }
   
    /////////////////////////////////////////////////////////
    if( job_chosen )
    {
       
        App.draw( s_gray );
        App.draw( text_box );
        App.draw( fstory );
        App.draw( sstory );
        if( stor > story_count )
        {
            App.draw( arrow_r );
        }
    }
   
    App.display();
}

return( - 1 );
}
oraz pełna funkcja look for:
C/C++
void LookFor( std::string st, std::string & opt_o, std::string & opt_t, std::vector < std::string >& sto, std::vector < std::string >& result_o, std::vector < std::string >& result_t, std::vector < std::string >& stat_o, std::vector < std::string >& stat_t )
{
    // st => starter, a number of a story #loc#choice#rand_numb
    // opt_o => first option in the story
    // opt_t => second ..................
    // sto => container with lines of the whole story
    // result_o => container with lines of the result for the first choice
    // result_t => .......................................... second choice
    // stat_o => gains and losses for the first result
    //stat _t => ........................ second result
   
    std::fstream plik;
    plik.open( "story.txt", std::ios::in );
    if( !plik.good() )
    {
        std::cout << "nie udalo sie otworzyc pliku" << std::endl;
    }
    std::string tekst;
    std::string stopper;
    std::string starter;
    starter = st;
    stopper = "***";
    bool lookin = true;
    int look = 0;
   
    while( look == 0 )
    {
        std::getline( plik, tekst );
        if( !( std::string::npos == tekst.find( starter ) ) )
        {
            std::cout << "found it!" << std::endl;
           
            while( tekst != stopper )
            {
                std::getline( plik, tekst );
                if( tekst == "+++" )
                {
                    do
                    {
                        std::getline( plik, tekst );
                        sto.push_back( tekst );
                        std::cout << "gettin the story!" << std::endl;
                    } while( tekst != "---" );
                   
                }
                if( tekst == "---" )
                {
                    std::getline( plik, tekst );
                    opt_o = tekst;
                    std::getline( plik, tekst );
                    opt_t = tekst;
                }
                if( tekst == "#" )
                {
                    do
                    {
                        std::getline( plik, tekst );
                        result_o.push_back( tekst );
                    } while( tekst != "##" );
                   
                }
                if( tekst == "##" )
                {
                    do
                    {
                        std::getline( plik, tekst );
                        result_t.push_back( tekst );
                    } while( tekst != "$" );
                   
                }
                if( tekst == "$" )
                {
                    do
                    {
                        std::getline( plik, tekst );
                        stat_o.push_back( tekst );
                    } while( tekst != "$$" );
                   
                }
                if( tekst == "$$" )
                {
                    do
                    {
                        std::getline( plik, tekst );
                        stat_t.push_back( tekst );
                    } while( tekst != stopper );
                   
                }
                if( tekst == stopper )
                {
                    sto.pop_back(); //usuwa ostatni element (w tym wypadku pobrane niepotrzebnie "---")
                    result_o.pop_back(); // usuwa "##"
                    result_t.pop_back(); // usuwa numer nastepnego
                    stat_o.pop_back(); // usuwa "$$"
                    stat_t.pop_back(); // usuwa "***"
                   
                    lookin = false; //ignorowalo tą zmianę więc zmieniłem na sprawdzanie int look, co również jest ignorowane
                    look = 1;
                }
            }
        } else
        {
            std::cout << "ERROR couldn't find the story nb" << std::endl;
        }
    }
    plik.close();
}
P-172103
pekfos
» 2018-08-14 18:53:32
C/C++
LookFor( st_number, opt_one, opt_two, story, result_one, result_two, stats_one, stats_two ); // wpada w nieskonczona petle
story_count =( int( story.size() / 2 ) ); // przez to że wpada w pętlę story.size() rośnie bez przerwy
Rośnie bez przerwy, bo bez przerwy wywołujesz LookFor(), które dodaje dane do wektorów bez ich uprzedniego wyczyszczenia.
P-172104
Wolfff
Temat założony przez niniejszego użytkownika
» 2018-08-14 20:10:42
Wiem dlaczego rośnie, ale nie wiem jak przestać wywoływać LookFor().
Czy chodzi Ci o to żebym w LookFor() na początku czyścił wszystkie zmienne? To jest problemem?
P-172106
pekfos
» 2018-08-14 20:22:16
Wiem dlaczego rośnie
Czyli wcześniej podałeś co najmniej jedną fałszywą informację.

ale nie wiem jak przestać wywoływać LookFor().
Jakoś sobie poradziłeś ze zmiennymi bool, by zacząć wywoływać tę funkcję, czemu by nie dodać kolejnej by wywoływała się tylko raz?
P-172107
Wolfff
Temat założony przez niniejszego użytkownika
» 2018-08-14 23:55:29
Nie podałem żadnej fałszywej informacji. Wiem dlaczego rośnie, jest to raczej oczywiste, nie wiem dlaczego się zapętla funckja LookFor().
Mam już tyle zmiennych bool że kod staje się ciężki do przeczytania ale masz rację, kolejna zmienna tego typu o dziwo pomogła.
Jak zwykle pomoc dostarczona w kąśliwy sposób, niemniej jestem bardzo wdzięczny. Dzięki.
P-172108
1 « 2 »
Poprzednia strona Strona 2 z 2