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

[Irrlicht]Crash programu przy jakimkolwiek zdarzeniu

Ostatnio zmodyfikowano 2012-07-26 17:53
Autor Wiadomość
Chlorek
Temat założony przez niniejszego użytkownika
[Irrlicht]Crash programu przy jakimkolwiek zdarzeniu
» 2012-07-26 15:27:46
Więc mam następujący problem; za każdym razem, gdy nastąpi jakiś event mój program w Irrlicht robi crash. Nie mam pojęcia czemu, kod wziąłem prosto z oficjalnego kursu Irrlicht ( [URL]http://irrlicht.sourceforge.net/docu/example005.html[/URL] ). Jedyne co zmieniłem to struktura, która służy do przetrzymywania informacji o moim GUI. Oto kod (wyciąłem większość, zostawiłem jedynie button):
C/C++
struct MENU_DATA
{
    IrrlichtDevice * device;
    s32 counter;
};

enum
{
    GUI_ID_SINGLEPLAYER_BUTTON = 101,
    GUI_ID_MULTIPLAYER_BUTTON,
    GUI_ID_SETTINGS_BUTTON,
    GUI_ID_CREDITS_BUTTON,
    GUI_ID_QUIT_BUTTON
};


class MAIN_MENU_EVENTS_RECEIVER
    : public IEventReceiver
{
public:
    MAIN_MENU_EVENTS_RECEIVER( MENU_DATA & context )
        : Context( context )
    {
    }
   
    virtual bool OnEvent( const SEvent & event )
    {
        if( event.EventType == EET_GUI_EVENT )
        {
            s32 id = event.GUIEvent.Caller->getID();
            IGUIEnvironment * Environment = Context.device->getGUIEnvironment();
           
            switch( event.GUIEvent.EventType )
            {
            case EGET_BUTTON_CLICKED:
                switch( id )
                {
                case GUI_ID_QUIT_BUTTON:
                    {
                        Context.device->closeDevice();
                        return true;
                    }
                    default:
                    return false;
                }
                break;
               
                default:
                break;
            }
        }
        return false;
    }
private:
    MENU_DATA & Context;
};


void drawMainMenu( IrrlichtDevice * device )
{
    device->getCursorControl()->setVisible( true );
   
    IGUIEnvironment * Environment = device->getGUIEnvironment();
    IGUISkin * skin = Environment->getSkin();
    IGUIFont * font = Environment->getFont( "data\\gfx\\font\\font1.png" );
    if( font )
    {
        skin->setFont( font );
    }
    skin->setFont( Environment->getBuiltInFont(), EGDF_TOOLTIP );
   
    {
        rect < s32 > rect( 10, 10, 110, 30 );
        Environment->addButton( rect, 0, GUI_ID_SINGLEPLAYER_BUTTON, L"Quit", L"Exits Program" );
    }
   
    MENU_DATA m_data;
    m_data.device = device;
    m_data.counter = 0;
   
    MAIN_MENU_EVENTS_RECEIVER receiver( m_data );
    device->setEventReceiver( & receiver );
}

A tu jak tworzę device:
C/C++
IrrlichtDevice * device = createDevice( EDT_OPENGL, core::dimension2d < u32 >( 800, 500 ), 32, false, false, false, 0 );

Crash występuje zawsze, gdy będzie wywołany jakiś event, np. gdy zmienię rozmiar okna, lub najadę myszką na pole okna. Jeśli zrobię komentarzem ostatnią linię podanego kodu (device->setEvent....) to "wszystko" jest ok.
Czego to może być problem? Proszę o pomoc.
P-61158
pekfos
» 2012-07-26 15:39:26
receiver przestaje istnieć po wyjściu z funkcji. Odwołanie do nieistniejącego = crash.
P-61159
Chlorek
Temat założony przez niniejszego użytkownika
» 2012-07-26 15:48:31
A jak mam zapobiec wyjściu z funkcji? Chcę aby funkcją tworzącą receiver nie był main.
P-61160
RazzorFlame
» 2012-07-26 16:13:02
Zmienna globalna?
P-61167
Chlorek
Temat założony przez niniejszego użytkownika
» 2012-07-26 17:53:29
Trochę modyfikacji i się udało. Zamykam.
P-61184
« 1 »
  Strona 1 z 1