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

[SFML] Szybkie Kliknięcia i bug z GUIwasHover

Ostatnio zmodyfikowano 2024-09-23 21:00
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
[SFML] Szybkie Kliknięcia i bug z GUIwasHover
» 2024-09-23 20:43:36
Witam.
Mam problem polegający na tym, że program "rysuje teren", choć nie powinien.
Gdy klikniemy parokrotnie na jakimś przycisku (palety terenu lub narzędziu) to jakimś sposobem program omija zabezpieczenie (GUIisHover) no i właśnie rysuje teren. Nie wiem jak to naprawić.
Link do programu Edytora Map: https://github.com/tBane1995/RPG2D/releases/tag/Release

Kod, który nie wiem dlaczego nie działa:
C/C++
while( window->isOpen() ) {
   
   
prevTime = currentTime;
   
currentTime = timeClock.getElapsedTime();
   
   
mousePosition = sf::Mouse::getPosition( * window ); // Pobierz aktualną pozycję myszy względem bieżącego okna
   
worldMousePosition = window->mapPixelToCoords( mousePosition );
   
   
GUIwasHover = false;
   
GUIwasClicked = false;
   
   
MapEditorUnclickButtons();
   
MapEditorHoverButtons(); // jeśli na jakimś przycisku jest kursor wtedy GUIwasHover = true
   
    // ...
   
   
if( !GUIwasHover ) {
       
       
if( prefabToPaint != nullptr ) {
           
           
if( sf::Mouse::isButtonPressed( sf::Mouse::Left ) ) {
               
if( tool == toolType::Brush || tool == toolType::RectBrush ) {
                   
if( prefabToPaint->type == gameObjectType::Terrain )
                       
 editTiles();
                   
               
}
               
            }
        }
       
    }
   
//...
   
P-181622
pekfos
» 2024-09-23 20:53:27
C/C++
virtual void unclick() {
   
if(( currentTime - clickTime ).asSeconds() > 0.1f ) {
       
       
sprite.setColor( idleColor );
       
changeColor();
       
state = buttonState::idle;
       
   
}
   
}

virtual void hover() {
   
if( state != buttonState::pressed ) {
       
       
float w = sprite.getTexture()->getSize().x;
       
float h = sprite.getTexture()->getSize().y;
       
float x = sprite.getPosition().x;
       
float y = sprite.getPosition().y;
       
       
if( worldMousePosition.x > x - w / 2.0f && worldMousePosition.x < x + w / 2.0f &&
       
worldMousePosition.y > y - h / 2.0f && worldMousePosition.y < y + h / 2.0f ) {
           
           
changeColor();
           
state = buttonState::hover;
           
           
GUIwasHover = true;
       
}
       
Może ustawianie GUIwasHover nie powinno być warunkowe.
P-181623
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-23 21:00:38
Jakie to teraz proste! :-) Dzięki

C/C++
virtual void hover() {
   
if( state != buttonState::pressed ) {
       
       
float w = sprite.getTexture()->getSize().x;
       
float h = sprite.getTexture()->getSize().y;
       
float x = sprite.getPosition().x;
       
float y = sprite.getPosition().y;
       
       
if( worldMousePosition.x > x - w / 2.0f && worldMousePosition.x < x + w / 2.0f &&
       
worldMousePosition.y > y - h / 2.0f && worldMousePosition.y < y + h / 2.0f ) {
           
           
state = buttonState::hover;
           
changeColor();
           
GUIwasHover = true;
       
}
    }
   
else {
       
// GUI WAS PRESSED
       
GUIwasHover = true;
   
}
}
P-181624
« 1 »
  Strona 1 z 1