#include "dxstdafx.h" #include ".\weapon.h" #include "Player.h" #include "Scene.h" #include "SoundNode.h" #include "GameManager.h" Weapon::Weapon(void) : Node() { for(int i=0;isetStateTime(i, 0); this->soundNode[i] = NULL; this->soundNames[i] = ""; } this->enteredState = true; this->setState(this->STATE_IDLE); this->munitionQuantity = 0; this->Cweapon = 12.5; //this->leftPos.setXYZ(1.4f, 1.4f, -0.5f); //this->rightPos.setXYZ(-1.4f, 1.4f, -0.5f); this->leftPos.setXYZ(1.6f, 1.6f, -0.5f); this->rightPos.setXYZ(-1.6f, 1.6f, -0.5f); this->bFire = false; this->player = NULL; D3DXMatrixIdentity(&this->myWorldMatrix); } Weapon::~Weapon(void) { } void Weapon::setPlayer(Player &_player) { this->player = &_player; } void Weapon::setStateTime(int state, float time) { this->timeForState[state] = time; } void Weapon::setStateSound(int state, std::string soundfile) { if(soundfile.compare("")!=0) { this->soundNames[state] = soundfile; this->soundNode[state] = (SoundNode*) this->myScene->createNode(this->myScene->NODE_SOUND);//, *this); this->soundNode[state]->loadFile(soundfile, false); this->soundNode[state]->setKillSoundNodeAfterPlayed(false); } } void Weapon::addMunition(int quantity) { this->munitionQuantity+=quantity; } int Weapon::getAmo() { return this->munitionQuantity; } void Weapon::fire() { this->bFire = true; } void Weapon::update(float dt) { this->myStateTime+=dt; switch(this->myState) { case this->STATE_IDLE: if(this->enteredState) { this->enteredState = false; } if(this->munitionQuantity<=0) { this->setState(this->STATE_EMPTY); Node::update(dt); return; } if(this->bFire) { this->bFire = false; this->setState(this->STATE_PRELOAD); } this->enteredState = false; break; case this->STATE_PRELOAD: if(this->enteredState) { if(this->soundNode[this->myState]) this->soundNode[this->myState]->play(); this->enteredState = false; } this->bFire = false; if(this->myStateTime>=this->timeForState[this->myState]) this->setState(this->STATE_FIRE); break; case this->STATE_FIRE: if(this->enteredState) { if(this->soundNode[this->myState]) this->soundNode[this->myState]->play(); this->doFire(); this->munitionQuantity--; this->enteredState = false; } this->bFire = false; if(this->myStateTime>=this->timeForState[this->myState]) this->setState(this->STATE_POSTLOAD); break; case this->STATE_POSTLOAD: if(this->enteredState) { if(this->soundNode[this->myState]) this->soundNode[this->myState]->play(); this->enteredState = false; } if(this->myStateTime>=this->timeForState[this->myState]) this->setState(this->STATE_IDLE); break; case this->STATE_EMPTY: if(this->enteredState) { this->enteredState = false; } if(this->munitionQuantity>0) { this->setState(this->STATE_IDLE); } if( this->munitionQuantity<=0 && this->bFire && this->soundNode[this->myState] && this->soundNode[this->myState]->getTimeToPlay()==-1) { this->myScene->manager->printToConsole("playing empty sound!"); this->soundNode[this->myState]->play(); this->soundNode[this->myState]->setPosition(this->getPosition()); this->bFire = false; } break; } Node::update(dt); } void Weapon::setState(int state) { this->myState = state; this->enteredState = true; this->myStateTime = 0; } void Weapon::setWeaponType(int type) { this->weaponType = type; } int Weapon::getWeaponType() { return this->weaponType; } void Weapon::setFireAt(Vector _fireAt) { this->vFireAt = _fireAt; } void Weapon::calcWorldMatrix(D3DXMATRIX &pMatWorld) { D3DXVECTOR4 temp; this->vRealFireAt = this->vRealFireAt + (this->vFireAt-this->vRealFireAt)*this->Cweapon*this->myScene->getDeltaTime(); D3DXVec4Transform(&temp, &this->leftPos, &pMatWorld); Vector left(temp.x, temp.y, temp.z); this->orientWeaponTo(*this->leftWeapon, left); D3DXVec4Transform(&temp, &this->rightPos, &pMatWorld); Vector right(temp.x, temp.y, temp.z); this->orientWeaponTo(*this->rightWeapon, right); this->getAbsoluteVector(this->absMinAABBox, this->minAABBox); this->getAbsoluteVector(this->absMaxAABBox, this->maxAABBox); this->getAbsoluteVector(this->myAbsPos, Vector(0, 0, 0)); } void Weapon::orientWeaponTo(Object3d &obj, Vector &origin) { //LookAtMatrix aufstellen D3DXMATRIXA16 wMat; D3DXMatrixTranslation(&wMat, origin.x, origin.y, origin.z); //rotationsmatrix berechnen //Alpha Vector diffXZ; Vector diffYZ; Vector dirZ(0, 0, 1); Vector diff(this->vRealFireAt.x-origin.x, this->vRealFireAt.y-origin.y, this->vRealFireAt.z-origin.z); diff.normalize(); diffXZ = diff; diffYZ = diff; //Alpha diff.y = 0; diffYZ.normalize(); //Beta diffXZ.y = 0; diffXZ.normalize(); float a = (diffYZ.y!=0) ? -acos(diffYZ.dotProd(diff))*diffYZ.y/abs(diffYZ.y): -acos(diffYZ.dotProd(diff)); //a+=D3DX_PI/2; float b = (diffXZ.x!=0) ? acos(diffXZ.dotProd(dirZ))*diffXZ.x/abs(diffXZ.x) : acos(diffXZ.dotProd(dirZ)); float g = 0; D3DXQUATERNION quat; D3DXMATRIXA16 rotMat; D3DXQuaternionIdentity(&quat); D3DXQuaternionRotationYawPitchRoll(&quat, b, a, g); D3DXMatrixRotationQuaternion(&rotMat, &quat); D3DXMatrixMultiply(&wMat, &rotMat, &wMat); obj.setWorldMatrix(wMat); } void Weapon::setSoftKill(bool _softKill, float _duration) { this->setTimeToLive(_duration); Node::setSoftKill(_softKill, _duration); this->leftWeapon->setTimeToLive(_duration); this->leftWeapon->setSoftKill(_softKill, _duration); this->rightWeapon->setTimeToLive(_duration); this->rightWeapon->setSoftKill(_softKill, _duration); }