Adding a Behavior
Adding a Behavior allows you to code and give a specific behavior (code, actions, things to do) to an object in the scene.
After you've created the Behaviour through the use of a game plugin, you will be able to give a Behavior to an object directly within the Maratis Editor.
Behaviors also allow to set a given number of variables to the object which has the Behavior; those variables can be then edited directly within the Maratis Editor or with the use of scripts.
In this example we will make an object rotating with the use of a Behavior.
Contents |
Game Plugin
First you need to create a game plugin as shown here: How to add your own C++ code (Game Plugin tutorial)
Source code
Now you can create the MyBehavior.h and MyBehavior.cpp files which will contain the code for your Behavior.
MyBehavior.h
///////////////////////////////////////////////////////////////////////////////////////////////////////// // GamePlugin // MyBehavior.h // // Code : Anael Seghezzi ///////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _MY_BEHAVIOR_H #define _MY_BEHAVIOR_H #include <MEngine.h> class MyBehavior : public MBehavior { public: // constructors / destructors MyBehavior(MObject3d * parentObject); MyBehavior(MyBehavior & behavior, MObject3d * parentObject); ~MyBehavior(void); private: // cutom variables float m_rotationSpeed; public: // destroy void destroy(void); // get new static MBehavior * getNew(MObject3d * parentObject); // get copy MBehavior * getCopy(MObject3d * parentObject); // name static const char * getStaticName(void){ return "MyBehavior"; } const char * getName(void){ return getStaticName(); } // variables unsigned int getVariablesNumber(void); MVariable getVariable(unsigned int id); // events (virtuals from MBehavior class) void update(void); void runEvent(int param){} }; #endif
MyBehavior.cpp
///////////////////////////////////////////////////////////////////////////////////////////////////////// // GamePlugin // MyBehavior.cpp // // Code : Anael Seghezzi ///////////////////////////////////////////////////////////////////////////////////////////////////////// #include "MyBehavior.h" ///////////////////////////////////////////////////////////////////////////////////////////////////////// // Init, this part is always similar, constructor, copy constructor, etc ///////////////////////////////////////////////////////////////////////////////////////////////////////// // constructor MyBehavior::MyBehavior(MObject3d * parentObject): MBehavior(parentObject), m_rotationSpeed(1) {} // copy constructor MyBehavior::MyBehavior(MyBehavior & behavior, MObject3d * parentObject): MBehavior(parentObject), m_rotationSpeed(behavior.m_rotationSpeed) {} // destructor MyBehavior::~MyBehavior(void) {} // destroy function : always similar void MyBehavior::destroy(void) { delete this; } // getNew function : always similar MBehavior * MyBehavior::getNew(MObject3d * parentObject) { return new MyBehavior(parentObject); } // getCopy function : always similar MBehavior * MyBehavior::getCopy(MObject3d * parentObject) { return new MyBehavior(*this, parentObject); } ///////////////////////////////////////////////////////////////////////////////////////////////////////// // Variables; allows to access custom variables from script and from Maratis Editor ///////////////////////////////////////////////////////////////////////////////////////////////////////// unsigned int MyBehavior::getVariablesNumber(void){ return 1; } MVariable MyBehavior::getVariable(unsigned int id) { switch(id) { default: return MVariable("NULL", NULL, M_VARIABLE_NULL); case 0: return MVariable("rotationSpeed", &m_rotationSpeed, M_VARIABLE_FLOAT); } } ///////////////////////////////////////////////////////////////////////////////////////////////////////// // Events ///////////////////////////////////////////////////////////////////////////////////////////////////////// // update function (called by MGame class by default) void MyBehavior::update(void) { MEngine * engine = MEngine::getInstance(); MGame * game = engine->getGame(); // check if the game is running, removing thif test will enable In-Editor update (like for the lookAt behavior) if(! game->isRunning()) return; // get the associated parent object (who is using this behavior) MObject3d * parent = getParentObject(); // lets rotate the parent object around the z axis, using our custom "rotationSpeed" variable parent->addAxisAngleRotation(MVector3(0, 0, 1), m_rotationSpeed); }
GamePlugin.cpp
Now we have to edit our GamePlugin.cpp file to make it actually add our Behavior to the game, using MBehaviorManager.
//[...] void StartPlugin(void) { // get engine MEngine * engine = MEngine::getInstance(); // add our behavior MBehaviorManager * behaviorManager = engine->getBehaviorManager(); behaviorManager->addBehavior(MyBehavior::getStaticName(), M_OBJECT3D, MyBehavior::getNew); // set game game = new MyGame(); engine->setGame(game); } //[...]