[1493] | 1 | // Generic Character class
|
---|
| 2 | class Character {
|
---|
| 3 | // Attributes ------------------------------------------------------------------------------
|
---|
| 4 | protected:
|
---|
| 5 | SceneNode *mMainNode; // Main character node
|
---|
| 6 | SceneNode *mSightNode; // "Sight" node - The character is supposed to be looking here
|
---|
| 7 | SceneNode *mCameraNode; // Node for the chase camera
|
---|
| 8 | Entity *mEntity; // Character entity
|
---|
| 9 | SceneManager *mSceneMgr;
|
---|
| 10 | public:
|
---|
| 11 | // Methods ---------------------------------------------------------------------------------
|
---|
| 12 | protected:
|
---|
| 13 | public:
|
---|
| 14 | // Updates the character (movement...)
|
---|
| 15 | virtual void update (Real elapsedTime, InputReader *input) = 0;
|
---|
| 16 | // The three methods below returns the two camera-related nodes,
|
---|
| 17 | // and the current position of the character (for the 1st person camera)
|
---|
| 18 | SceneNode *getSightNode () {
|
---|
| 19 | return mSightNode;
|
---|
| 20 | }
|
---|
| 21 | SceneNode *getCameraNode () {
|
---|
| 22 | return mCameraNode;
|
---|
| 23 | }
|
---|
| 24 | Vector3 getWorldPosition () {
|
---|
| 25 | return mMainNode->getWorldPosition ();
|
---|
| 26 | }
|
---|
| 27 |
|
---|
| 28 | Entity* getEntity()
|
---|
| 29 | {
|
---|
| 30 | return mEntity;
|
---|
| 31 | }
|
---|
| 32 | };
|
---|
| 33 |
|
---|
| 34 | // Specialization of the Character class - Our dear Ogre :D
|
---|
| 35 | class OgreCharacter : public Character {
|
---|
| 36 | // Attributes ------------------------------------------------------------------------------
|
---|
| 37 | protected:
|
---|
| 38 | String mName;
|
---|
| 39 | public:
|
---|
| 40 | // Methods ---------------------------------------------------------------------------------
|
---|
| 41 | protected:
|
---|
| 42 | public:
|
---|
| 43 | OgreCharacter (String name, SceneManager *sceneMgr) {
|
---|
| 44 | // Setup basic member references
|
---|
| 45 | mName = name;
|
---|
| 46 | mSceneMgr = sceneMgr;
|
---|
| 47 |
|
---|
| 48 | // Setup basic node structure to handle 3rd person cameras
|
---|
| 49 | mMainNode = mSceneMgr->getRootSceneNode ()->createChildSceneNode (mName);
|
---|
| 50 | mSightNode = mMainNode->createChildSceneNode (mName + "_sight", Vector3 (0, 0, 100));
|
---|
| 51 | mCameraNode = mMainNode->createChildSceneNode (mName + "_camera", Vector3 (0, 50, -100));
|
---|
| 52 |
|
---|
| 53 |
|
---|
| 54 | // Give this character a shape :)
|
---|
| 55 | mEntity = mSceneMgr->createEntity (mName, "butterfly_bones_animated.mesh");
|
---|
| 56 | mMainNode->attachObject(mEntity);
|
---|
| 57 |
|
---|
| 58 | }
|
---|
| 59 | ~OgreCharacter () {
|
---|
| 60 | mMainNode->detachAllObjects ();
|
---|
| 61 | delete mEntity;
|
---|
| 62 | mMainNode->removeAndDestroyAllChildren ();
|
---|
| 63 | mSceneMgr->destroySceneNode (mName);
|
---|
| 64 | }
|
---|
| 65 |
|
---|
| 66 | void update (Real elapsedTime, InputReader *input) {
|
---|
| 67 | // Handle movement
|
---|
| 68 | if (input->isKeyDown (KC_W)) {
|
---|
| 69 | mMainNode->translate (mMainNode->getOrientation () * Vector3 (0, 0, 100.0 * elapsedTime));
|
---|
| 70 | }
|
---|
| 71 |
|
---|
| 72 | if (input->isKeyDown (KC_S)) {
|
---|
| 73 | mMainNode->translate (mMainNode->getOrientation () * Vector3 (0, 0, -50.0 * elapsedTime));
|
---|
| 74 | }
|
---|
| 75 |
|
---|
| 76 | if (input->isKeyDown (KC_PGUP)) {
|
---|
| 77 | mMainNode->translate (mMainNode->getOrientation () * Vector3 (0, 50 * elapsedTime, 0));
|
---|
| 78 | }
|
---|
| 79 |
|
---|
| 80 | if (input->isKeyDown (KC_PGDOWN)) {
|
---|
| 81 | mMainNode->translate (mMainNode->getOrientation () * Vector3 (0, -50 * elapsedTime, 0));
|
---|
| 82 | }
|
---|
| 83 |
|
---|
| 84 | if (input->isKeyDown (KC_A)) {
|
---|
| 85 | mMainNode->yaw (Radian (2 * elapsedTime));
|
---|
| 86 | }
|
---|
| 87 | if (input->isKeyDown (KC_D)) {
|
---|
| 88 | mMainNode->yaw (Radian (-2 * elapsedTime));
|
---|
| 89 | }
|
---|
| 90 |
|
---|
| 91 | Degree mRotX = Degree(-input->getMouseRelativeX() * 0.13);
|
---|
| 92 | Degree mRotY = Degree(-input->getMouseRelativeY() * 0.13);
|
---|
| 93 | mMainNode->yaw(mRotX);
|
---|
| 94 | mMainNode->pitch(mRotY);
|
---|
| 95 | }
|
---|
| 96 |
|
---|
| 97 | // Change visibility - Useful for 1st person view ;)
|
---|
| 98 | void setVisible (bool visible) {
|
---|
| 99 | mMainNode->setVisible (visible);
|
---|
| 100 | }
|
---|
| 101 | };
|
---|
| 102 |
|
---|
| 103 | // Our extended camera class
|
---|
| 104 | class ExtendedCamera {
|
---|
| 105 | // Attributes ------------------------------------------------------------------------------
|
---|
| 106 | protected:
|
---|
| 107 | SceneNode *mTargetNode; // The camera target
|
---|
| 108 | SceneNode *mCameraNode; // The camera itself
|
---|
| 109 | Camera *mCamera; // Ogre camera
|
---|
| 110 |
|
---|
| 111 | SceneManager *mSceneMgr;
|
---|
| 112 | String mName;
|
---|
| 113 |
|
---|
| 114 | bool mOwnCamera; // To know if the ogre camera binded has been created outside or inside of this class
|
---|
| 115 |
|
---|
| 116 | Real mTightness; // Determines the movement of the camera - 1 means tight movement, while 0 means no movement
|
---|
| 117 | public:
|
---|
| 118 | // Methods ---------------------------------------------------------------------------------
|
---|
| 119 | protected:
|
---|
| 120 | public:
|
---|
| 121 | ExtendedCamera (String name, SceneManager *sceneMgr, Camera *camera = 0) {
|
---|
| 122 | // Basic member references setup
|
---|
| 123 | mName = name;
|
---|
| 124 | mSceneMgr = sceneMgr;
|
---|
| 125 |
|
---|
| 126 | // Create the camera's node structure
|
---|
| 127 | mCameraNode = mSceneMgr->getRootSceneNode ()->createChildSceneNode (mName);
|
---|
| 128 | mTargetNode = mSceneMgr->getRootSceneNode ()->createChildSceneNode (mName + "_target");
|
---|
| 129 | mCameraNode->setAutoTracking (true, mTargetNode); // The camera will always look at the camera target
|
---|
| 130 | mCameraNode->setFixedYawAxis (true); // Needed because of auto tracking
|
---|
| 131 |
|
---|
| 132 | // Create our camera if it wasn't passed as a parameter
|
---|
| 133 | if (camera == 0) {
|
---|
| 134 | mCamera = mSceneMgr->createCamera (mName);
|
---|
| 135 | mOwnCamera = true;
|
---|
| 136 | }
|
---|
| 137 | else {
|
---|
| 138 | mCamera = camera;
|
---|
| 139 | mOwnCamera = false;
|
---|
| 140 | }
|
---|
| 141 |
|
---|
| 142 | mCamera->setFOVy(Radian(Degree(12.0)));
|
---|
| 143 | // ... and attach the Ogre camera to the camera node
|
---|
| 144 | mCameraNode->attachObject (mCamera);
|
---|
| 145 |
|
---|
| 146 | // Default tightness
|
---|
| 147 | mTightness = 0.01f;
|
---|
| 148 | }
|
---|
| 149 | ~ExtendedCamera () {
|
---|
| 150 | mCameraNode->detachAllObjects ();
|
---|
| 151 | if (mOwnCamera)
|
---|
| 152 | delete mCamera;
|
---|
| 153 | mSceneMgr->destroySceneNode (mName);
|
---|
| 154 | mSceneMgr->destroySceneNode (mName + "_target");
|
---|
| 155 | }
|
---|
| 156 |
|
---|
| 157 | void setFOVy(Ogre::Radian fovy)
|
---|
| 158 | {
|
---|
| 159 | mCamera->setFOVy(Radian(Degree(fovy)));
|
---|
| 160 | }
|
---|
| 161 |
|
---|
| 162 | void setTightness (Real tightness) {
|
---|
| 163 | mTightness = tightness;
|
---|
| 164 | }
|
---|
| 165 |
|
---|
| 166 | Real getTightness () {
|
---|
| 167 | return mTightness;
|
---|
| 168 | }
|
---|
| 169 |
|
---|
| 170 | Vector3 getCameraPosition () {
|
---|
| 171 | return mCameraNode->getPosition ();
|
---|
| 172 | }
|
---|
| 173 |
|
---|
| 174 | void instantUpdate (Vector3 cameraPosition, Vector3 targetPosition) {
|
---|
| 175 | mCameraNode->setPosition (cameraPosition);
|
---|
| 176 | mTargetNode->setPosition (targetPosition);
|
---|
| 177 | }
|
---|
| 178 |
|
---|
| 179 | void update (Real elapsedTime, Vector3 cameraPosition, Vector3 targetPosition) {
|
---|
| 180 | // Handle movement
|
---|
| 181 | Vector3 displacement;
|
---|
| 182 |
|
---|
| 183 | displacement = (cameraPosition - mCameraNode->getPosition ()) * mTightness;
|
---|
| 184 | mCameraNode->translate (displacement);
|
---|
| 185 |
|
---|
| 186 | displacement = (targetPosition - mTargetNode->getPosition ()) * mTightness;
|
---|
| 187 | mTargetNode->translate (displacement);
|
---|
| 188 | }
|
---|
| 189 | };
|
---|
| 190 |
|
---|