[SFML 2.6.2] Podwójne spacje w sf::Text
Ostatnio zmodyfikowano 2024-12-16 14:40
tBane Temat założony przez niniejszego użytkownika |
[SFML 2.6.2] Podwójne spacje w sf::Text » 2024-12-16 12:52:29 Witam. Programuję Edytowalne Pole Tekstowe. Problem mój polega na tym, że gdy podaję spacje do pola tekstowego to mi ją generuje pojedynczo lecz gdy dodam kolejny znak to spacja się rozszerza. Przez to kursor jest źle generowany. Co może być tego powodem ? Zamieszczam poniżej screen i kod. void EditableTextArea::handleEvent( sf::Event & event ) { if( event.type == sf::Event::MouseButtonReleased ) { if( event.mouseButton.button == sf::Mouse::Left ) { if( rect.getGlobalBounds().contains( worldMousePosition ) ) { isSelected = true; cursorState = CursorState::ShowCursor; cursor_position = lines[ 0 ].size(); } else { isSelected = false; cursorState = CursorState::HideCursor; } } } if( isSelected ) { if( event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space ) { lines[ 0 ].insert( cursor_position, 1, ' ' ); cursor_position += 1; generateText(); } else if( event.type == sf::Event::TextEntered ) { if( event.text.unicode < 128 ) { if( event.text.unicode == '\b' ) { if( lines[ 0 ].size() > 0 && cursor_position > 0 ) { lines[ 0 ].erase( cursor_position - 1, 1 ); cursor_position -= 1; } } else if( event.text.unicode != 13 ) { lines[ 0 ].insert( cursor_position, 1, char( event.text.unicode ) ); cursor_position += 1; } } generateText(); } else if( event.type == sf::Event::KeyPressed ) { if( event.key.code == sf::Keyboard::Left ) { if( cursor_position > 0 ) cursor_position -= 1; } else if( event.key.code == sf::Keyboard::Right ) { if( cursor_position < lines[ 0 ].size() ) cursor_position += 1; } } std::wstring text_before_cursor = lines[ 0 ].substr( 0, cursor_position ); TextArea text = TextArea( text_before_cursor ); sf::Vector2f pos; pos.x = texts[ 0 ].getPosition().x + text.texts[ 0 ].getGlobalBounds().getSize().x; pos.y = texts[ 0 ].getPosition().y; cursor.setPosition( pos ); } }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-12-16 14:10:20 ChatGPT podał mi taki kod na obliczanie współrzędnych kursora. Teraz jestem już całkowicie pewny, że sf::Event::TextEntered pobiera dwie spacje na raz. Jak to naprawić? sf::Vector2f pos = texts[ 0 ].getPosition(); for( size_t i = 0; i < cursor_position; ++i ) { char currentChar = lines[ 0 ][ i ]; char nextChar =( i + 1 < lines[ 0 ].size() ) ? lines[ 0 ][ i + 1 ] : 0; sf::Glyph glyph = texts[ 0 ].getFont()->getGlyph( currentChar, texts[ 0 ].getCharacterSize(), false ); pos.x += glyph.advance; pos.x += texts[ 0 ].getFont()->getKerning( currentChar, nextChar, texts[ 0 ].getCharacterSize() ); }
cursor.setPosition( pos );
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-12-16 14:40:47 Już mam. Oto rozwiązanie: void EditableTextArea::handleEvent( sf::Event & event ) { if( event.type == sf::Event::MouseButtonReleased ) { if( event.mouseButton.button == sf::Mouse::Left ) { if( rect.getGlobalBounds().contains( worldMousePosition ) ) { isSelected = true; cursorState = CursorState::ShowCursor; cursor_position = lines[ 0 ].size(); cursorPositioning(); } else { isSelected = false; cursorState = CursorState::HideCursor; } } } if( isSelected ) { if( event.type == sf::Event::TextEntered ) { if( event.text.unicode < 128 ) { if( event.text.unicode == '\b' ) { if( lines[ 0 ].size() > 0 && cursor_position > 0 ) { lines[ 0 ].erase( cursor_position - 1, 1 ); cursor_position -= 1; } } else if( event.text.unicode == 32 ) { lines[ 0 ].insert( cursor_position, 1, ' ' ); cursor_position += 1; } else if( event.text.unicode != 13 ) { lines[ 0 ].insert( cursor_position, 1, char( event.text.unicode ) ); cursor_position += 1; } generateText(); cursorPositioning(); } } else if( event.type == sf::Event::KeyPressed ) { if( event.key.code == sf::Keyboard::Left ) { if( cursor_position > 0 ) { cursor_position -= 1; cursorPositioning(); } } else if( event.key.code == sf::Keyboard::Right ) { if( cursor_position < lines[ 0 ].size() ) { cursor_position += 1; cursorPositioning(); } } } } }
|
|
« 1 » |