Aktuelle Zeit: 22.12.2024, 14:01

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Variable Event-Funktionen Zuordnung
BeitragVerfasst: 25.02.2008, 10:07 
Offline
Benutzeravatar

Registriert: 26.04.2007, 00:12
Beiträge: 37
Hallo! Ich arbeite seit einiger zeit an einem irrlicht-angelscript interface.
Ich möchte nun, dass es möglich wird, von einem angelscriptfile aus mit einer
funktion ein irrlicht event mit einer internen program funktion zu verbinden.

Zum Beispiel per Skript das Event Taste A der Funktion Move_Forward zuzuordnen.

Dazu habe ich erst einmal meinen irrlicht eventreciver etwas umgestaltet und
variabel gemacht zudem eine neue struct erstellt. Beispielcode:

Code:
//speichert eventdaten
struct AEvent {
       int buttonid;
       EKEY_CODE keycode;
       EMOUSE_INPUT_EVENT mouseevent;
};

//funktion
void MoveForward()
{
//laufe nach forne
}

//funktion
void ExitProgram()
{
//Beende Program
}

//funktion
void ShootBarrel()
{
//shoot a barrel
}

//events definieren:
AEvent Var_MoveForward;
AEvent Var_ExitProgram;
AEvent Var_ShootBarrel;

//diese funktion kann in angelscript registriert und später vom script aufgerufen werden:
void ChangeEventData(buttonid, keycode, mouseevent, function)
{
   //ändere Event Daten
   //Zum beispiel wir dan sowas festgelegt anhand von abfragen und so weiter:
   fals funktion == moveforward
   {
   AEvent Var_MoveForward = {buttonid,keycode,mouseevent};
   }
   ...
   AEvent Var_ExitProgram = {102,NULL,NULL};
   AEvent Var_ShootBarrel = {NULL,NULL,EMIE_LMOUSE_PRESSED_DOWN};
   //ändere Event Daten
}

//eventreciver
class MyEventReceiver : public IEventReceiver
{
public:
   virtual bool OnEvent(const SEvent& event)
   {
       
        //key events
        if (event.EventType == irr::EET_KEY_INPUT_EVENT&&!event.KeyInput.PressedDown)
   {
                           
           //check functions                 
        if(event.KeyInput.Key==Var_MoveForward.keycode){MoveForward();}
   if(event.KeyInput.Key==Var_ExitProgram.keycode){ExitProgram();}
   if(event.KeyInput.Key==Var_ShootBarrel.keycode){ShootBarrel();}
     
           }
           
        //gui events
        if (event.EventType == EET_GUI_EVENT)
         {s32 id = event.GUIEvent.Caller->getID();//get gui environment ids
                   
      //check functions
      if(event.GUIEvent.EventType==(EGET_BUTTON_CLICKED||EGET_SCROLL_BAR_CHANGED)
        &&id==Var_MoveForward.buttonid){MoveForward();}
      if(event.GUIEvent.EventType==(EGET_BUTTON_CLICKED||EGET_SCROLL_BAR_CHANGED)
        &&id==Var_ExitProgram.buttonid){ExitProgram();}
      if(event.GUIEvent.EventType==(EGET_BUTTON_CLICKED||EGET_SCROLL_BAR_CHANGED)
        &&id==Var_ShootBarrel.buttonid){ShootBarrel();}
         
           }   
       
        //mouse events     
      if (event.EventType == irr::EET_MOUSE_INPUT_EVENT)
      {
            if(event.MouseInput.Event==Var_MoveForward.mouseevent){MoveForward();}
      if(event.MouseInput.Event==Var_ExitProgram.mouseevent)ExitProgram();}
      if(event.MouseInput.Event==Var_ShootBarrel.mouseevent){Var_ShootBarrel();}               
        }

      return false;
   }
};


Angelscript Code:
Code:
void main()
{
ChangeEventData(101, NULL, NULL, "ExitProgram()");
//ändere die Funktion des Buttons 101 und ordne die Funktion ExitProgram() zu
}



Das ist mein erster Ansatz. Hoffe ich konnte es etwas verständlich rüberbringen. Der funktioniert auch. Jedoch erscheint der mir etwas umständlich. Denn ich muss im eventreciver
für jeden event typ die funktionen und events neu prüfen.
Was haltet ihr davon? Gibt es einfachere wege? Besitzt irrlicht eventuell schon änliche Ansätze, die es erleichtern?


Zuletzt geändert von frodenius am 25.02.2008, 13:24, insgesamt 2-mal geändert.
war mal so frei den code umzubrechen


Nach oben
 Profil  
 
BeitragVerfasst: 25.02.2008, 13:22 
Offline
Moderator
Benutzeravatar

Registriert: 11.03.2007, 20:25
Beiträge: 556
Wohnort: Frankfurt/Main
mach doch einfach ein paar event-zu-funktion maps.
jeweils eine für tastatur, maus und gui. die schlüssel sind dann die keycodes bzw die mausevent bzw die gui-id. und der wert ist ein EventHandler-Objekt (Funktor), das ggf die angelscript-funktion aufruft.
dann musst du in OnEvent nur noch testen welchen typs das event ist und die entsprechende funktion aufrufen. (falls der schlüssel existiert, ansonsten true zurückgeben)

_________________
yo. life's so bloody short.
Ihr dachtet Schulfernsehn sei die ultimative Folter? Falsch: Fahrstuhlmusik, extra leise.


Nach oben
 Profil  
 
BeitragVerfasst: 26.02.2008, 08:33 
Offline
Benutzeravatar

Registriert: 26.04.2007, 00:12
Beiträge: 37
Hallo. Habe deinen Vorschlag mal in Code umgesetzt. Ich habe allerdings auf die Funktionsobjekte verzichtet und eine ExecuteFunctionByString Funktion eingebaut.

Es funktioniert wirklich wunderbar. Nur mit der GUI stimmt etwas nicht: Wenn ich einen Button anklicke, wird das zugehörige Ereignis ausgeführt. Klicke ich den selben ein zweites mal passiert nichts. Drücke ich einen anderen Button wird auch das zu diesem gehörige Ereignis ausgeführt. Aber ein zweites mal funktioniert das nicht. Jedoch funktioniert dann der erste Button wieder und wenn der geklickt wurde der zweite auch wieder und so weiter...Ich komm nicht drauf, wo der Fehler ist...

Mit Tastatur und Maus funktioniert es echt gut:

Code:
//define event maps
struct KeyEventSt {
       EKEY_CODE keycode;
       std::string functionname;
};

struct GuiEventSt {
       int buttonid;
       std::string functionname;
};

struct MouseEventSt {
       EMOUSE_INPUT_EVENT mouseevent;
       std::string functionname;
};

#define MAX_KEY_EVENTS 10
#define MAX_GUI_EVENTS 10
#define MAX_MOUSE_EVENTS 3

//Create event maps
KeyEventSt KeyEventMap[MAX_KEY_EVENTS];
GuiEventSt GuiEventMap[MAX_GUI_EVENTS];
MouseEventSt MouseEventMap[MAX_MOUSE_EVENTS];

//Register Mapable functions:
//In dieser Funktion werden alle Funktionen aufgelistet, die später mit Events
//verknüpft werden sollen...Ich habe mich für die String-Methode entschieden,
//da es das Arbeiten mit Angelscript erleichtert
void ExecuteFunctionByString(std::string str)
{
        if(str=="PrintSomething"){PrintSomething();}
        if(str=="MakeNCube"){MakeNCube();}
   if(str=="CreateGUIWindow"){CreateGUIWindow();}
        //mehr funktionen hier
}

//Function that changes the Key Event Map
void ChangeKeyEventFunction(int id, EKEY_CODE _keycode, std::string functionname)
{
   KeyEventMap[id].keycode=_keycode;
   KeyEventMap[id].functionname=functionname;
}

//Function that changes the Gui Event Map
void ChangeGuiEventFunction(int id, int guiid, std::string functionname)
{
   GuiEventMap[id].buttonid=guiid;
   GuiEventMap[id].functionname=functionname;
}

//Function that changes the Mouse Event Map
void ChangeMouseEventFunction(int id, EMOUSE_INPUT_EVENT mouseevent, std::string functionname)
{
   MouseEventMap[id].mouseevent=mouseevent;
   MouseEventMap[id].functionname=functionname;
}

////////////////////////////////////
// irrlicht event reciver
////////////////////////////////////
class MyEventReceiver : public IEventReceiver
{
public:
   virtual bool OnEvent(const SEvent& event)
   {     
         
        //key events abfragen
        if (event.EventType == irr::EET_KEY_INPUT_EVENT&&!event.KeyInput.PressedDown)
         {
                int k_counter=0;
              while(k_counter<MAX_KEY_EVENTS)
              {
              if(event.KeyInput.Key==KeyEventMap[k_counter].keycode)
{ExecuteFunctionByString(KeyEventMap[k_counter].functionname);}
               k_counter++;
                }
           }
           
        //gui events abfragen
        if (event.EventType == EET_GUI_EVENT)
        {
           s32 id = event.GUIEvent.Caller->getID();//get gui environment ids
         int g_counter=0;
           //check functions
         while(g_counter<MAX_GUI_EVENTS)
         {              if(event.GUIEvent.EventType==(EGET_BUTTON_CLICKED||EGET_SCROLL_BAR_CHANGED)&&id==GuiEventMap[g_counter].buttonid)
{ExecuteFunctionByString(GuiEventMap[g_counter].functionname);}
                g_counter++;
           }   
        }
       
        //mouse events abfragen
      if (event.EventType == irr::EET_MOUSE_INPUT_EVENT)
      {
             int m_counter=0;
             while(m_counter<MAX_MOUSE_EVENTS)
             {
            if(event.MouseInput.Event==MouseEventMap[m_counter].mouseevent)
{ExecuteFunctionByString(MouseEventMap[m_counter].functionname);}   
            m_counter++;
            }             
        }

      return false;
   }
       

};

////////////////////////////////
// Main
////////////////////////////////
int main(int argc, char *argv[])
{

//Diese funktionen können durch ein Koinfigurationsfile oder Angelscript aufgerufen werden
ChangeGuiEventFunction(0 ,101 ,"MakeNCube");//manual mapping
ChangeKeyEventFunction(0, KEY_KEY_K, "MakeNCube");//manual mapping
ChangeKeyEventFunction(0, KEY_KEY_T, "PrintSomething");//manual mapping
ChangeMouseEventFunction(0, EMIE_RMOUSE_PRESSED_DOWN, "MakeNCube");//manual mapping

//...
//...



Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de