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

[Irrlicht] Eventy w menu

Ostatnio zmodyfikowano 2024-02-16 01:54
Autor Wiadomość
DejaVu
» 2024-02-15 22:23:38
Jeśli komunikaty "jest event i dziala" oraz "jest zdarzenie GUI i dziala" są wyświetlane poprawnie, ale nie pojawia się komunikat "naduszony przycisk i nie dziala", problem prawdopodobnie leży w identyfikacji zdarzenia kliknięcia przycisku lub w identyfikatorach przycisków.

Rozważmy potencjalne przyczyny i sposoby ich rozwiązania:

1. Błędne Identyfikatory Przycisków
Upewnij się, że identyfikatory (id), które przypisujesz przyciskom przy tworzeniu, rzeczywiście odpowiadają tym, które sprawdzasz w switch(id) w MyEventReceiver. Przykład tworzenia przycisku z określonym ID brzmiałby:

cpp
Copy code
// Przy tworzeniu przycisku, upewnij się, że przypisujesz odpowiednie ID.
env->addButton(rect<s32>(10,10,110,50), 0, 101, L"World");
env->addButton(rect<s32>(10,60,110,100), 0, 102, L"Help");
2. Niewłaściwa Obsługa Zdarzeń
Jeśli case EGET_BUTTON_CLICKED: nie działa, może to oznaczać, że EGET_BUTTON_CLICKED nie jest poprawnie rozpoznawany jako typ zdarzenia. To byłoby jednak niezwykłe, biorąc pod uwagę, że mówisz, iż "jest zdarzenie GUI i dziala". Upewnij się, że zdarzenia kliknięcia są generowane przez GUI, co w tym przypadku wydaje się być potwierdzone.

3. Zakłócenia w Przepływie Zdarzeń
Rzadko, ale możliwe, że coś zakłóca przepływ zdarzeń przed dotarciem do logiki switch. To jednak jest mało prawdopodobne, biorąc pod uwagę strukturę kodu.

4. Debugowanie
Dodaj Więcej Informacji Debugowania: Rozszerz debugowanie, aby zawierało więcej informacji. Na przykład, wydrukuj id przycisku i typ zdarzenia GUI:
cpp
Copy code
std::cout << "ID przycisku: " << id << ", Typ zdarzenia: " << event.GUIEvent.EventType << std::endl;
Sprawdź Typ Zdarzenia GUI: Upewnij się, że zdarzenie, które otrzymujesz, to faktycznie EGET_BUTTON_CLICKED. Możliwe, że otrzymujesz inne zdarzenie GUI, które nie jest obsługiwane w twoim kodzie.
5. Weryfikacja Tworzenia Przycisków
Upewnij się, że przyciski są poprawnie tworzone z przypisanymi identyfikatorami i że są one częścią GUI. Możliwe, że przyciski nie są poprawnie rejestrowane w systemie zdarzeń GUI.

Podsumowanie
Jeśli powyższe kroki nie rozwiążą problemu, możesz spróbować uprościć kod, tworząc minimalny przykład, który tylko próbuje obsłużyć kliknięcie jednego przycisku, aby zobaczyć, czy problem nadal występuje. Upewnienie się, że środowisko deweloperskie jest poprawnie skonfigurowane i że używasz odpowiednich wersji bibliotek Irrlicht, również może pomóc w rozwiązaniu problemu.
P-180797
DejaVu
» 2024-02-15 22:25:48
P-180798
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-15 22:36:19
na normalnych przyciskach działa, więc może faktycznie to jakiś inny typ eventu

C/C++
env->addButton( rect < s32 >( 10, 10, 110, 50 ), 0, 101, L"World" );
env->addButton( rect < s32 >( 10, 60, 110, 100 ), 0, 102, L"Help" );

a na tym już nie działa
C/C++
IGUIContextMenu * menu = env->addMenu();
menu->addItem( L"World", 101, true, true );
menu->addItem( L"Help", 102, true, true );
P-180799
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-15 22:59:43
zauważyłem, że elementy menu są indeksowane od 0. Tzn w menu World są indeksy od 0 do 3, zaś w menu Help 0-1. Nie ma znaczenia czy ID przypisuje czy też nie ...

C/C++
// buttons ID's
enum
{
   
// World
   
GUI_ID_CREATEWORLD, GUI_ID_LOADWORLD, GUI_ID_SAVEWORLD, GUI_ID_GENERATEWORLD,
   
   
// Help
   
GUI_ID_TUTORIAL, GUI_ID_INFO
};

// Create Main Menu
IGUIContextMenu * menu = GUI->addMenu();
menu->addItem( L"World", - 1, true, true );
menu->addItem( L"Help", - 1, true, true );

// Create World Menu
IGUIContextMenu * worldMenu = menu->getSubMenu( 0 );
worldMenu->addItem( L"Create World", GUI_ID_CREATEWORLD ); // 0
worldMenu->addItem( L"Load World", GUI_ID_LOADWORLD ); // 1
worldMenu->addItem( L"Save world", GUI_ID_SAVEWORLD ); // 2
worldMenu->addItem( L"Generate World", GUI_ID_GENERATEWORLD ); // 3

// Create Help Menu
IGUIContextMenu * helpMenu = menu->getSubMenu( 1 );
helpMenu->addItem( L"Tutorial", GUI_ID_TUTORIAL ); // 0
helpMenu->addItem( L"Info", GUI_ID_INFO ); // 1
P-180800
tBane
Temat założony przez niniejszego użytkownika
» 2024-02-16 01:54:27
Znalazłem rozwiązanie:

C/C++
bool MyEventReceiver::OnEvent( const SEvent & event )
{
   
if( event.EventType == EET_GUI_EVENT )
   
{
       
       
switch( event.GUIEvent.EventType )
       
{
       
case gui::EGET_MENU_ITEM_SELECTED:
           
{
               
gui::IGUIContextMenu * menu =( gui::IGUIContextMenu * ) event.GUIEvent.Caller;
               
s32 id = menu->getItemCommandId( menu->getSelectedItem() );
               
               
switch( id )
               
{
               
case GUI_ID_CREATEWORLD:
                   
createWorld();
                   
break;
                   
               
case GUI_ID_LOADWORLD:
                   
loadWorld();
                   
break;
                   
               
case GUI_ID_SAVEWORLD:
                   
saveWorld();
                   
break;
                   
               
case GUI_ID_GENERATEWORLD:
                   
generateWorld();
                   
break;
                   
               
case GUI_ID_TUTORIAL:
                   
tutorial();
                   
break;
                   
               
case GUI_ID_INFO:
                   
info();
                   
break;
               
}
            }
           
break;
           
           
default:
           
break;
       
}
    }
   
   
return false;
}
P-180801
1 « 2 »
Poprzednia strona Strona 2 z 2