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

[SFML 2.6.2] Podwójne spacje w sf::Text

Ostatnio zmodyfikowano 2024-12-16 14:40
Autor Wiadomość
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.


C/C++
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 );
   
}
}

P-181968
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ć?

C/C++
sf::Vector2f pos = texts[ 0 ].getPosition(); // Startowa pozycja tekstu

// Przejdź przez każdy znak przed kursorem
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;
   
   
// Pobierz szerokość znaku z Glyph
   
sf::Glyph glyph = texts[ 0 ].getFont()->getGlyph( currentChar, texts[ 0 ].getCharacterSize(), false );
   
pos.x += glyph.advance; // Dodaj szerokość znaku (advance)
   
    // Dodaj kerning między aktualnym znakiem a następnym znakiem
   
pos.x += texts[ 0 ].getFont()->getKerning( currentChar, nextChar, texts[ 0 ].getCharacterSize() );
}

// Ustaw kursor na precyzyjnie obliczoną pozycję
cursor.setPosition( pos );
P-181969
tBane
Temat założony przez niniejszego użytkownika
» 2024-12-16 14:40:47
Już mam. Oto rozwiązanie:

C/C++
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();
               
}
               
            }
           
           
        }
       
       
    }
}
P-181970
« 1 »
  Strona 1 z 1