RazzorFlame Temat założony przez niniejszego użytkownika |
std::string erase usuwa ostatni znak tylko raz » 2013-06-26 13:12:36 Pisze gre i zatrzymałem się na tym: else if( win->m_Event.Type == sf::Event::KeyPressed && win->m_Event.Key.Code == sf::Key::Back ) { if( m_Text.size() > 0 ) { m_Text.erase( m_Text.length() - 1, 1 ); } }
Ten kawałek kodu usuwa tylko jeden raz znak z końca... Nie wiem dlaczego. Próbowałem też m_Text.erase( m_Text.size() - 1, 1 ); Dodam że oczywiście w funkcja w której jest ten kod jest zagnieżdżona w pętli eventów. |
|
pekfos |
» 2013-06-26 13:41:14 A ile ma usuwać? string & erase( size_t pos = 0, size_t len = npos );
Erases the portion of the string value that begins at the character position pos and spans len characters | http://www.cplusplus.com/reference/string/string/erase/Równie dobrze można tu użyć string::pop_back(). |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-06-26 13:48:49 Nie zrozumiałeś o co mi chodzi. Nie mówie że tylko 1 znak, ale tylko 1 raz. Chociaż powinno usuwać za każdym razem kiedy wciskam Backspace. Ma usuwać 1 znak za każdym razem kiedy wcisne Backspace, a tu usuwa tylko 1 raz. Nawet jeśli wciskam backspace więcej razy. |
|
xevuel |
» 2013-06-26 13:51:23 Pierwsze co powinieneś zrobić to upewnić się że warunki są poprawne i że na pewno wykonuje się ona więcej razy. Zrobiłeś to? |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-06-26 13:55:47 @UP, tak wykonuje się tylko nie usuwa znaku. Równie dobrze można tu użyć string::pop_back(). |
Gdyby to było takie łatwe... Próbowałem z tym ale to jest dodane w cpp11. Nawet ściągnąłem nową wersje MinGW i dodałem do cmdline odpowiednie komendy... Już niby wszystko było OK ale nagle błędy linkera że nie znaleziono -lsfml-graphics-s i innych bibliotek z SFML. To wtedy podlinkowałem je z ścieżki a wtedy piękne "undefined reference to" chyba z 500x i co ciekawe nawet do funkcji z mojego projektu. NP: class Vector2D { int X, Y; Vector2D( int, int ); };
I błędzik: "undefined reference to 'Vector2D::Vector2D(int,int)'". A ofc na starszym MinGW (4.6.2) działa perfekcyjnie. |
|
pekfos |
» 2013-06-26 14:03:53 SFML musi być skompilowany pod nowym GCC, projekt trzeba przebudować, itd.. Takie rzeczy, których zapewne nie zrobiłeś i teraz sypią się błędy ;)
Ale wracając do tematu: na 99% problem nie jest z kodem, który podałeś. Już samo else na początku może o tym świadczyć. Poprzedni warunek się spełni i już nie działa.. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-06-26 14:07:25 Myślisz że ja głupi jestem? Wiem o tym ale jak napisałem wcześniej dochodzi do linii z erase tylko coś szwankuje i się już za > 1 razem nie usuwa znak. BTW poprzedni warunek sprawdza czy został wciśnięty enter... Cały kod funkcji: std::string GUI_EditBox::checkTextEntered( GameWindow * win ) { if( m_Active ) { if( win->m_Event.Type == sf::Event::TextEntered ) { m_Text += win->m_Event.Text.Unicode; } else if( win->m_Event.Type == sf::Event::KeyPressed && win->m_Event.Key.Code == sf::Key::Return ) { std::string txtCopy = m_Text; m_Text = ""; return txtCopy; } else if( win->m_Event.Type == sf::Event::KeyPressed && win->m_Event.Key.Code == sf::Key::Back ) { if( m_Text.size() > 0 ) { m_Text.erase( m_Text.length() - 1, 1 ); } } } return ""; }
|
|
DejaVu |
» 2013-06-26 14:24:53 Równie dobrze możesz dodawać i usuwać jeden znak przez co masz wrażenie, że nic się nie dzieje. Wypisz tekst przed usunięciem i po usunięciu. Tak jak pisali Ci poprzednicy: problem nie leży w wywołaniu metody na którą się powołujesz tylko w liczbie wywołań tej metody, a ta z kolei jest zależna od spełnienia wcześniejszych warunków.
PS. Backspace też jest znakiem, który jest pisany, więc jeżeli nie masz if-a wykluczającego ten znak to zostanie on dodany do tekstu jako kod ascii 8 (backspace chyba miał kod ascii 8... może 9). |
|
« 1 » 2 |