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 |
|
---|