#pragma once #include "Ogre.h" #include "OgreBillboardParticleRenderer.h" #include "OgreIlluminationManager.h" #include "NXOgre.h" using namespace Ogre; using namespace NxOgre; enum PlayerAnimState { PLAYERANIMSTATE_STAND, PLAYERANIMSTATE_IDLE, PLAYERANIMSTATE_ATTACK, PLAYERANIMSTATE_BLOCK, PLAYERANIMSTATE_WALK, PLAYERANIMSTATE_PAIN, PLAYERANIMSTATE_DEATH, PLAYERANIMSTATE_TURN }; class PlayerCharacter; class MyCharMoveController; class CharacterManager { public: static CharacterManager& getSingleton() { if(mSingleton == 0) mSingleton = new CharacterManager(); return *mSingleton; } PlayerCharacter* getTrigger(NxOgre::Actor* a) { if(triggers.find(a)== triggers.end()) return 0; return triggers[a]; } PlayerCharacter* getTarget(NxOgre::Actor* a) { if(targets.find(a)== targets.end()) return 0; return targets[a]; } void addTrigger(NxOgre::Actor* a, PlayerCharacter* c){triggers[a] = c;} void addTarget(NxOgre::Actor* a, PlayerCharacter* c){targets[a] = c;} SceneManager* mSceneManager; Scene* mScene; protected: CharacterManager(){} static CharacterManager* mSingleton; std::map triggers; std::map targets; }; class PlayerCharacter : public FrameListener { public: PlayerCharacter(String name, Scene* scene, SceneManager* sceneManager, Vector3 dimensions, Vector3 startPosition, bool debug = false); virtual void addPlayerMesh(String meshname, float meshscale, bool rotateModel); virtual bool frameStarted(const FrameEvent& evt); virtual void doAction(float dt){} virtual float getHit(){return 0;} virtual void addHit(float hit){mHealth -= hit; if(mHealth < 0) mHealth = 0;} static unsigned int frameListenerPriority; Entity* getMeshEntity(){return mCharacterMeshEntity;} protected: String mName; Entity* mCharacterMeshEntity; SceneNode* mPlayerBoundDebugNode; Scene* mScene; Character* mPlayerCharacter; SceneNode* mPlayerNode; float mMeshScale; AnimationState* mCharacterMesh_AnimState; SceneManager* mSceneManager; PlayerAnimState mCurrentAnimState; int mWeapon; bool mMoving; bool mForceAnimChange; MyCharMoveController* mCharacterController; Vector3 mPlayerDimensions; bool mRunning; bool isAlive; bool mDebug; float mHealth; float getAnimSpeed(){return 1.2;} virtual String getAnimStateName(PlayerAnimState as, int option = 0){return "stand";} virtual void setAnimState(PlayerAnimState as){} }; class AlienCharacter : public PlayerCharacter { public: AlienCharacter(String name, Scene* scene, SceneManager* sceneManager, Vector3 dimensions, Vector3 startPosition, bool debug = false); ~AlienCharacter(){} void doAction(float dt); bool frameStarted(const FrameEvent& evt) { return PlayerCharacter::frameStarted(evt); } protected: String getAnimStateName(PlayerAnimState as, int option = 0); void setAnimState(PlayerAnimState as); static float MaxHealth; }; class FPSPlayer : public PlayerCharacter { public: FPSPlayer(Scene* scene, SceneManager* sceneManager, Vector3 dimensions, Vector3 startPosition, float cameraHeight, Camera* cam, bool debug = false); ~FPSPlayer(void); void addPlayerMesh(String meshname, float meshscale, bool rotateModel); virtual void processKeyInputs(InputReader* inputDevice); bool frameStarted(const FrameEvent& evt); virtual void processMouseInputs(InputReader* inputDevice); Vector3 getPosition(){return mPlayerNode->getWorldPosition(); return mPlayerCharacter->getGlobalPosition();} Vector3 getDirection() { Vector3 dir = mCamera->getDerivedDirection(); dir.normalise(); return dir; } // Vector3 getOrienation(){return mPlayerCharacter->getGlobalOrientation();} static FPSPlayer* thePlayer; static FPSPlayer* getPlayer(){return thePlayer;} protected: Camera* mCamera; float mCameraHeight; Light* mFlashLight; String getAnimStateName(PlayerAnimState as, int option = 0); void setAnimState(PlayerAnimState as); };