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

[Irrlicht] Zmienna do przechowywania informacji czy element GUI został wybrany

Ostatnio zmodyfikowano 2024-03-02 00:29
Autor Wiadomość
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():
C/C++
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:
C/C++
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 programu
C/C++
while( device->run() )
{
   
if( device->isWindowActive() )
   
{
       
// MOUSE POSITION
       
mousePos = device->getCursorControl()->getPosition();
       
       
// EVENTS
       
if( receiver.IsKeyDown( irr::KEY_ESCAPE ) ) // if press ESCAPE then exit
       
{
           
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;
       
       
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // UPDATE
       
       
        // CAMERA POSITIONING
       
cam->setPosition( vector3df( cam_x, cam_y, cam_z ) );
       
cam->setTarget( vector3df( cam_x, 30, cam_z + 50 ) );
       
       
highlightHexTiles();
       
       
if( !GUIisSelected && mousePress ) // EDIT TILES
           
 editHexTiles();
       
       
       
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        // RENDER
       
driver->beginScene( true, true, SColor( clear_a, clear_r, clear_g, clear_b ) ); // clear screen
       
smgr->drawAll(); // render scene
       
driver->draw2DImage( TWTexture, position2d < s32 >( 0, screenHeight - 128 - 20 ), rect < s32 >( 0, 0, 128, 128 ) ); // render TW Logo
       
boldFont->draw( L"TW World Editor v0.5", recti( 20, screenHeight - 20, 100, screenHeight ), SColor( 255, 128, 48, 48 ), true, true ); // render text on bottom
       
GUI->drawAll(); // render GUI
       
position2d < s32 > m = device->getCursorControl()->getPosition(); // render cursor
       
driver->endScene(); // render submit
       
        // FPS
       
int currentFPS = driver->getFPS();
       
core::stringw str = L"FPS: ";
       
str += currentFPS;
       
device->setWindowCaption( str.c_str() );
       
       
GUIisSelected = false;
       
   
}
   
else
       
 device->yield(); // if window is inactive not use CPU
   
}
P-180897
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:
C/C++
if( !GUIisSelected && mousePress ) // EDIT TILES
   
 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.
P-180898
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.

C/C++
if( !GUIisHover() )
{
   
highlightHexTiles();
   
if( mousePress )
       
 editHexTiles();
   
}

C/C++
if( !GUIisSelected )
{
   
highlightHexTiles();
   
if( mousePress )
       
 editHexTiles();
   
}
P-180899
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.
P-180900
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
P-180901
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.
P-180904
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.
P-180906
« 1 »
  Strona 1 z 1