I was trying solve this problem for few hours and I tried make this what you said in post, but without effect
I saw that problem is no only with 2 buttons but in general problem is with rotate (when I put tank near wall by w or s and try rotate by a or d my tank are rotate through the wall and after that i can press w and go through wall).
That's my code after same changes:
Class Tank:
Code: Select all
class Tank
{
private:
Ogre::SceneNode *_bodyNode;
Ogre::SceneNode *_holderNode;
Ogre::SceneNode *_gunNode;
Ogre::SceneNode *_bodyNode1;
Ogre::Entity *_body;
Ogre::Entity *_body1;
Ogre::Entity *_holder;
Ogre::Entity *_gun;
Ogre::SceneManager *mSceneMgr;
int _x;
int _z;
int _number;
Real mSpeed;
Real mRotate;
Vector3 transVector;
public:
Tank()
{
}
void createTank(Ogre::SceneNode *parentNode, int x, int z, int number)
{
transVector = Vector3::ZERO;
//transVector.z=+mSpeed;
mSpeed=800;
mRotate=200;
this->_x=x;
this->_z=z;
this->_number=number;
_bodyNode = parentNode->createChildSceneNode("bodyNode"+number,Vector3( x, 0, z ));
_body = _bodyNode->getCreator()->createEntity(_bodyNode->getName() + "::_ent", "cialoLeo.mesh");
_bodyNode->attachObject(_body);
_bodyNode -> scale (88, 88, 88);
_body->addQueryFlags(ENTITY_MASK);
_holderNode = _bodyNode->createChildSceneNode("holderNode"+number,Vector3( 0, 0, 0 ));
_holder = _holderNode->getCreator()->createEntity(_holderNode->getName() + "::_ent", "wiezyczkaLeo.mesh");
_holderNode->attachObject(_holder);
_holder->addQueryFlags(ENTITY_MASK);
_gunNode = _holderNode->createChildSceneNode("lufaNode"+number,Vector3( 0, 0, 0 ));
_gun = _gunNode->getCreator()->createEntity(_gunNode->getName() + "::_ent", "lufaLeo.mesh");
_gunNode->attachObject(_gun);
_gun->addQueryFlags(ENTITY_MASK);
}
void setPosition(Vector3 transVectorPOS)
{
_bodyNode->setPosition(transVectorPOS);
}
void setOrientation(const Ogre::Quaternion & transVectorPOS)
{
_bodyNode->setOrientation(transVectorPOS);
}
Vector3 getPosition()
{
return _bodyNode->_getDerivedPosition();
}
const Ogre::Quaternion & getOrientation()
{
return _bodyNode->_getDerivedOrientation();
}
Vector3 getPosition2()
{
const Ogre::AxisAlignedBox& bbox = _body->getWorldBoundingBox(true);
return bbox.getCorner(AxisAlignedBox::FAR_RIGHT_TOP);
}
Vector3 getPosition3()
{
const Ogre::AxisAlignedBox& bbox = _body->getWorldBoundingBox(true);
return bbox.getCorner(AxisAlignedBox::NEAR_LEFT_TOP);
}
Vector3 getPosition4()
{
const Ogre::AxisAlignedBox& bbox = _body->getWorldBoundingBox(true);
return bbox.getCorner(AxisAlignedBox::NEAR_RIGHT_TOP);
}
Vector3 getPosition5()
{
const Ogre::AxisAlignedBox& bbox = _body->getWorldBoundingBox(true);
return bbox.getCorner(AxisAlignedBox::FAR_LEFT_TOP);
}
void goDiagonalLeft(Real evt)
{
_bodyNode->translate(_bodyNode->getOrientation() * Vector3(0,0,300) * evt);
_bodyNode->yaw(Degree(mRotate * evt), Node::TS_LOCAL);
}
void goDiagonalRight(Real evt)
{
_bodyNode->translate(_bodyNode->getOrientation() * Vector3(0,0,300) * evt);
_bodyNode->yaw(Degree(-mRotate * evt), Node::TS_LOCAL);
}
void goAhead(SceneManager *mSceneMgr, Real evt)
{
_bodyNode->translate(_bodyNode->getOrientation() * Vector3(0,0,300) * evt);
}
void goBack(SceneManager *mSceneMgr, Real evt)
{
_bodyNode->translate(_bodyNode->getOrientation() * Vector3(0,0,-300) * evt);
}
void goRight(SceneManager *mSceneMgr, Real evt)
{
_bodyNode->yaw(Degree(-mRotate * evt), Node::TS_LOCAL);
}
void goLeft(SceneManager *mSceneMgr, Real evt)
{
_bodyNode->yaw(Degree(mRotate * evt), Node::TS_LOCAL);
}
~Tank()
{
}
};
virtual bool processUnbufferedKeyInput(const FrameEvent& evt)
Code: Select all
virtual bool processUnbufferedKeyInput(const FrameEvent& evt)
{
mKeyboard->capture();
if(mKeyboard->isKeyDown(OIS::KC_ESCAPE))
return false;
if(mKeyboard->isKeyDown(OIS::KC_A))
{
a=true;
change1=true;
}
if(mKeyboard->isKeyDown(OIS::KC_W))
{
w=true;
change=true;
}
if(mKeyboard->isKeyDown(OIS::KC_S))
{
s=true;
change=true;
}
if(mKeyboard->isKeyDown(OIS::KC_D))
{
//change=true;
d=true;
change1=true;
}
return true;
}
bool frameStarted(const FrameEvent &evt)
Code: Select all
bool frameStarted(const FrameEvent &evt)
//goLeft and goRight are rotates
{
Vector3 oldPos = _t1.getPosition();
const Ogre::Quaternion & oldOrientation= _t1.getOrientation();
Vector3 oldPos2 = _t1.getPosition2();
Vector3 oldPos3 = _t1.getPosition3();
Vector3 oldPos4 = _t1.getPosition4();
Vector3 oldPos5 = _t1.getPosition5();
Vector3 oldPos6 = _t1.getPosition5();
if (change&&change1)
{
if(w&&a)
{
_t1.goDiagonalLeft(evt.timeSinceLastFrame);
w=false;
a=false;
}
if(w&&d)
{
_t1.goDiagonalRight(evt.timeSinceLastFrame);
w=false;
d=false;
}
}
else if(change1&&!change)
{
if(a)
{
_t1.goLeft(mSceneMgr,evt.timeSinceLastFrame);
a=false;
}
if(d)
{
_t1.goRight(mSceneMgr,evt.timeSinceLastFrame);
d=false;
}
}
else if (change&&(!change1))
{
if(w)
{
_t1.goAhead(mSceneMgr,evt.timeSinceLastFrame);
w=false;
}
if(s)
{
_t1.goBack(mSceneMgr,evt.timeSinceLastFrame);
s=false;
}
}
if (oldPos.squaredDistance(_t1.getPosition()) > 10)
{
mCollisionTools = new MOC::CollisionTools(mSceneMgr);
if (mCollisionTools->collidesWithEntity(oldPos2, _t1.getPosition2(), 2.5f, 0.0f, ENTITY_MASK))
{
_t1.setPosition(oldPos);
_t1.setOrientation(oldOrientation);
}
else if (mCollisionTools->collidesWithEntity(oldPos3, _t1.getPosition3(), 2.5f, 0.0f, ENTITY_MASK))
{
_t1.setPosition(oldPos);
_t1.setOrientation(oldOrientation);
}
else if (mCollisionTools->collidesWithEntity(oldPos4, _t1.getPosition4(), 2.5f, 0.0f, ENTITY_MASK))
{
_t1.setPosition(oldPos);
_t1.setOrientation(oldOrientation);
}
else if (mCollisionTools->collidesWithEntity(oldPos5, _t1.getPosition5(), 2.5f, 0.0f, ENTITY_MASK))
{
_t1.setPosition(oldPos);
_t1.setOrientation(oldOrientation);
}
}
change=false;
change1=false;
return ExampleFrameListener::frameStarted(evt);
}
protected:
AnimationState *mAnimationState;
Entity *Body;
SceneNode *mSceneNode;
SceneNode *mSceneNode1;
SceneManager *mSceneMgr;
MOC::CollisionTools* mCollisionTools;
Vector3 transVector1;
Tank _t1;
Tank _t2;
bool a,w,s,d;
bool up,down,left,right;
bool change, change1;
int x;
};