-
Notifications
You must be signed in to change notification settings - Fork 1
/
Character.cpp
87 lines (64 loc) · 2.86 KB
/
Character.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include "Character.h"
#define SPEED 100
Character::Character (Ogre::String name, Ogre::SceneManager *sceneMgr, Ogre::Camera *camera):mName(name), mSceneMgr(sceneMgr),
mCamera(camera), grounded(true) {
mMainNode = mSceneMgr->getRootSceneNode ()->createChildSceneNode (mName, Ogre::Vector3(0, 100, 0));
mSightNode = mMainNode->createChildSceneNode (mName + "_sight", Ogre::Vector3 (0, 0, -100));
mCameraNode = mMainNode->createChildSceneNode (mName + "_camera", Ogre::Vector3 (0, 100, 250));
mHeroNode = mMainNode->createChildSceneNode (mName + "_hero", Ogre::Vector3 (0, 0, 0));
mEntity = mSceneMgr->createEntity (mName, "robot.mesh");
mHeroNode->attachObject (mEntity);
mHeroNode->yaw(Ogre::Degree(90));
mCameraNode->attachObject(mCamera);
Ogre::AxisAlignedBox box = mEntity->getBoundingBox();
mHeroLength = box.getSize().x;
mEntity->setCastShadows(true);
mAnimationState = mEntity->getAnimationState("Idle");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
}
Character::~Character () {
mMainNode->detachAllObjects ();
delete mEntity;
mMainNode->removeAndDestroyAllChildren ();
mSceneMgr->destroySceneNode (mName);
}
void Character::move(Ogre::Real elapsedTime, Ogre::Vector3 direction, Ogre::Real rotation) {
mAnimationState->addTime(elapsedTime);
if(direction != Ogre::Vector3::ZERO && !isCollision(mMainNode->getPosition(), direction)) {
mAnimationState = mEntity->getAnimationState("Walk");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
if(grounded)
mMainNode->translate(direction * elapsedTime, Ogre::Node::TS_LOCAL);
}else
{
mAnimationState = mEntity->getAnimationState("Idle");
mAnimationState->setLoop(true);
mAnimationState->setEnabled(true);
}
}
void Character::ground(Ogre::Real elapsedTime) {
Ogre::Vector3 direction = Ogre::Vector3::NEGATIVE_UNIT_Y * 50;
if(!isCollision(mMainNode->getPosition(), direction) && mMainNode->getPosition().y >= 0)
mMainNode->translate(direction * elapsedTime, Ogre::Node::TS_LOCAL);
else if(isCollision(mMainNode->getPosition(), direction) || mMainNode->getPosition().y <= 0)
grounded = true;
}
void Character::setVisible (bool visible) {
mMainNode->setVisible (visible);
}
bool Character::isCollision(const Ogre::Vector3& position, const Ogre::Vector3& direction)
{
Ogre::Ray ray(position, mMainNode->getOrientation() * direction/100);
mRaySceneQuery = mSceneMgr->createRayQuery(ray);
Ogre::RaySceneQueryResult &result = mRaySceneQuery->execute();
Ogre::RaySceneQueryResult::iterator itr;
if(result.size() > 0)
for (itr = result.begin(); itr != result.end(); itr++) {
if (itr->movable->getName().compare("RoboOgre")!=0 && itr->movable->getName().compare("PlayerCam")!=0 && itr->movable->getName().find("Cube") != Ogre::String::npos && itr->distance < mHeroLength/2 ) {
return true;
}
}
return false;
}