tBane Temat założony przez niniejszego użytkownika |
[Irrlicht] Zmienna do przechowywania informacji czy element GUI został wybrany » 2024-02-29 17:48:25 Witam. Próbuję przebudować funkcje GUIisHover(), która mówi czy jakiś element GUI został wybrany na bardziej rzeczową postać tzn. że każdy przycisk w evencie będzie ustanawiał wartość zmienniej GUIisSelected, by poinformować program o tym, że element GUI został wybrany. Jednakże mimo moich prób kod się nie wykonuje tak jak oczekiwałem. Nie wiem gdzie popełniłem błąd. Wideo z bugiem https://www.youtube.com/watch?v=6Q3qKZS8NoQ funkcja GUIisHover():bool GUIisHover() { if( menu->isPointInside( mousePos ) ) return true; if( worldMenu->isPointInside( mousePos ) ) return true; if( helpMenu->isPointInside( mousePos ) ) return true; if( terrainBar->isPointInside( mousePos ) ) return true; if( openDialog != nullptr ) return true; return false; }
Kod przycisków:case EGET_BUTTON_CLICKED: { GUIisSelected = true; s32 buttonID = event.GUIEvent.Caller->getID(); switch( buttonID ) { case BUTTON_WATER: brushTerrain = terrainType::water; std::cout << "setted a water to paint" << std::endl; GUIisSelected = true; break; case BUTTON_BEACH: brushTerrain = terrainType::beach; std::cout << "setted a beach to paint" << std::endl; GUIisSelected = true; break; Główna pętla programuwhile( device->run() ) { if( device->isWindowActive() ) { mousePos = device->getCursorControl()->getPosition(); if( receiver.IsKeyDown( irr::KEY_ESCAPE ) ) { device->drop(); return 0; } if( receiver.IsKeyDown( irr::KEY_KEY_A ) || receiver.IsKeyDown( irr::KEY_LEFT ) ) cam_x -= 1.0f; if( receiver.IsKeyDown( irr::KEY_KEY_D ) || receiver.IsKeyDown( irr::KEY_RIGHT ) ) cam_x += 1.0f; if( receiver.IsKeyDown( irr::KEY_KEY_W ) || receiver.IsKeyDown( irr::KEY_UP ) ) cam_z += 1.0f; if( receiver.IsKeyDown( irr::KEY_KEY_S ) || receiver.IsKeyDown( irr::KEY_DOWN ) ) cam_z -= 1.0f; cam->setPosition( vector3df( cam_x, cam_y, cam_z ) ); cam->setTarget( vector3df( cam_x, 30, cam_z + 50 ) ); highlightHexTiles(); if( !GUIisSelected && mousePress ) editHexTiles(); driver->beginScene( true, true, SColor( clear_a, clear_r, clear_g, clear_b ) ); smgr->drawAll(); driver->draw2DImage( TWTexture, position2d < s32 >( 0, screenHeight - 128 - 20 ), rect < s32 >( 0, 0, 128, 128 ) ); boldFont->draw( L"TW World Editor v0.5", recti( 20, screenHeight - 20, 100, screenHeight ), SColor( 255, 128, 48, 48 ), true, true ); GUI->drawAll(); position2d < s32 > m = device->getCursorControl()->getPosition(); driver->endScene(); int currentFPS = driver->getFPS(); core::stringw str = L"FPS: "; str += currentFPS; device->setWindowCaption( str.c_str() ); GUIisSelected = false; } else device->yield(); }
|
|
pekfos |
» 2024-02-29 19:23:52 Innymi słowy (w sumie jedynymi słowy, bo można to wywnioskować tylko z filmu), kafle na edytowanej mapie mają się nie zmieniać gdy klikasz na przyciski nad nimi. Więc ten warunek jest spełniony wtedy kiedy nie chcesz: if( !GUIisSelected && mousePress ) editHexTiles(); GUIisSelected = false; Przez to że resetujesz stan GUIisSelected w pętli, a ustawiasz w obsłudze zdarzenia, to ta zmienna blokuje warunek tylko w jednym obiegu pętli. Nie wiadomo jak jest wysterowana zmienna mousePress, ale jeśli jest aktywna w więcej niż jednym obiegu, to będziesz mieć niepożądany efekt. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-02-29 19:34:00 mousePress działa należycie. Nie rozumiem dlaczego funkcja GUIisHover() działa, a bool GUIisSelected nie działa. if( !GUIisHover() ) { highlightHexTiles(); if( mousePress ) editHexTiles(); }
if( !GUIisSelected ) { highlightHexTiles(); if( mousePress ) editHexTiles(); }
|
|
pekfos |
» 2024-02-29 19:53:33 Z podanych fragmentów kodu wynika że GUIisSelected jest niemal zawsze ustawione na false. Ustawiasz true tylko w momencie naciśnięcia na jakiś przycisk, a na false w każdym obiegu pętli głównej. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-02-29 19:58:55 tak, ponieważ ta zmienna przechowuje informacje o tym czy element GUI został kliknięty. Służy ona po to, aby w momencie kliknięcia elementu GUI nie wykonywać takich akcji jak edycja pola. Tylko nie działa, nie rozumiem dlaczego. Mam rozwiązanie problemu, ale nieeleganckie i chciałbym, by ten kod lepiej wyglądał .. https://www.youtube.com/watch?v=ol8LFlgDmOY |
|
pekfos |
» 2024-03-01 20:27:56 tak, ponieważ ta zmienna przechowuje informacje o tym czy element GUI został kliknięty. Służy ona po to, aby w momencie kliknięcia elementu GUI nie wykonywać takich akcji jak edycja pola. Tylko nie działa, nie rozumiem dlaczego. I w momencie kliknięcia elementu GUI to się nie dzieje. W tej jednej milisekundzie w której akurat nacisnąłeś przycisk myszy to się nie dzieje. W każdej innej milisekundzie z 1000 na sekundę jakie są, to się dzieje. Tak długo jak mousePress jest prawdziwe, czyli pewnie do momentu puszczenia przycisku myszy. GUIisHover() działa bo dla danej pozycji myszki zwraca albo stabilne true, albo stabilne false. Bo sprawdzasz czy kursor jest nad czymś, a nie czy kursor jest nad czymś i akurat stan przycisku myszy zmienił się z puszczonego na wciśnięty. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-03-01 23:28:54 Aha, ok. Zrozumiałem. Nie sprawdzałem czy GUI jest zaznaczone tzn czy kursorem na GUI najechałem. Sprawdzałem tylko czy przycisk jest kliknięty. |
|
« 1 » |