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?