#include "dxstdafx.h" #include ".\simpleweapon.h" #include "GameManager.h" #include "SimpleBullet.h" #include "GameScene.h" #include "ParticleEmitter.h" #include "ParticleGroup.h" #include "Sprite.h" #include "Box.h" SimpleWeapon::SimpleWeapon(void) : Weapon() { this->nodeType |= GameScene::NODE_SIMPLEWEAPON; this->fire[0] = NULL; this->fire[1] = NULL; this->ice[0] = NULL; this->ice[1] = NULL; this->leftFire = NULL; this->rightFire = NULL; this->leftIce = NULL; this->rightIce = NULL; } SimpleWeapon::~SimpleWeapon(void) { } void SimpleWeapon::initWeapon() { this->leftWeapon = (Object3d*) this->myScene->createNode(this->myScene->NODE_OBJECT3D, *this); this->rightWeapon = (Object3d*) this->myScene->createNode(this->myScene->NODE_OBJECT3D, *this); this->leftWeapon->setPosition(this->leftPos); this->rightWeapon->setPosition(this->rightPos); switch(this->weaponType) { case this->TYPE_MG: this->leftWeapon->loadMeshFromFile("./media/models/waffe1.x"); this->rightWeapon->loadMeshFromFile("./media/models/waffe1.x"); this->setStateSound(this->STATE_EMPTY, "./media/sound/emptyGun.wav"); this->timeForState[this->STATE_FIRE] = 0.1f; break; case this->TYPE_BOMB: this->leftWeapon->loadMeshFromFile("./media/models/waffe2.x"); this->rightWeapon->loadMeshFromFile("./media/models/waffe2.x"); this->timeForState[this->STATE_FIRE] = 0.05f; this->timeForState[this->STATE_POSTLOAD] = 0.5f; break; case this->TYPE_ALIEN: this->leftWeapon->loadMeshFromFile("./media/models/waffe3.x"); this->rightWeapon->loadMeshFromFile("./media/models/waffe3.x"); this->timeForState[this->STATE_FIRE] = 0.05f; break; case this->TYPE_FIRE: this->leftWeapon->loadMeshFromFile("./media/models/Flammenwerfer_big.x"); this->rightWeapon->loadMeshFromFile("./media/models/Flammenwerfer_big.x"); this->timeForState[this->STATE_FIRE] = 0.0f; this->attachFlameEmitter(this->leftWeapon); this->attachFlameEmitter(this->rightWeapon); break; case this->TYPE_ICE: this->leftWeapon->loadMeshFromFile("./media/models/schneekanone.x"); this->rightWeapon->loadMeshFromFile("./media/models/schneekanone.x"); this->timeForState[this->STATE_FIRE] = 0.0f; this->attachFlameEmitter(this->leftWeapon, false); this->attachFlameEmitter(this->rightWeapon, false); break; } } void SimpleWeapon::doFire() { //this->myScene->manager->printToConsole("do Fire!!!"); if(this->weaponTypeTYPE_FIRE) { SimpleBullet *leftBullet; SimpleBullet *rightBullet; leftBullet = (SimpleBullet *) this->myScene->createNode(((GameScene*)this->myScene)->NODE_SIMPLEBULLET, true); rightBullet = (SimpleBullet *) this->myScene->createNode(((GameScene*)this->myScene)->NODE_SIMPLEBULLET, true); leftBullet->setBulletType(this->weaponType); rightBullet->setBulletType(this->weaponType); Vector leftDir; Vector rightDir; Vector zDir(0, 0, 1); this->leftWeapon->getAbsoluteDirectionVector(leftDir, zDir); this->rightWeapon->getAbsoluteDirectionVector(rightDir, zDir); leftDir.normalize(); rightDir.normalize(); if(leftDir.length()<0.99 || leftDir.length()>1.01) leftDir.setXYZ(0, 0, 1); if(rightDir.length()<0.99 || rightDir.length()>1.01) rightDir.setXYZ(0, 0, 1); leftBullet->setWeaponDirection(leftDir); rightBullet->setWeaponDirection(rightDir); leftBullet->setPlayer(this->player); rightBullet->setPlayer(this->player); leftBullet->setTimeToLive(0.2f); rightBullet->setTimeToLive(0.3f); Vector temp; this->leftWeapon->getAbsoluteVector(temp, zDir*2); leftBullet->setPosition(temp); this->rightWeapon->getAbsoluteVector(temp, zDir*2); rightBullet->setPosition(temp); leftBullet->initBullet(); rightBullet->initBullet(); } else if(this->weaponType == this->TYPE_FIRE) { if(!this->leftFire->isEmitting()) { this->leftFire->restartEmitting(); this->rightFire->restartEmitting(); } } else if(this->weaponType == this->TYPE_ICE) { if(!this->leftIce->isEmitting()) { this->leftIce->restartEmitting(); this->rightIce->restartEmitting(); } } } Node* SimpleWeapon::clone() { SimpleWeapon* sw = (SimpleWeapon*) this->myScene->createNode(GameScene::NODE_SIMPLEWEAPON, *this->father, true); sw->setWeaponType(this->weaponType); sw->initWeapon(); return sw; } void SimpleWeapon::calcWorldMatrix(D3DXMATRIX &pMatWorld) { Weapon::calcWorldMatrix(pMatWorld); if(this->weaponType==this->TYPE_FIRE || this->TYPE_ICE) { D3DXMATRIXA16 mat; D3DXMATRIXA16 transMat; D3DXMatrixTranslation(&transMat, 0, 0, 3); mat = *this->leftWeapon->getWorldMatrix(); D3DXMatrixMultiply(&mat, &transMat, &mat); if(this->leftFire) this->leftFire->setWorldMatrix(mat); if(this->leftIce) this->leftIce->setWorldMatrix(mat); mat = *this->rightWeapon->getWorldMatrix(); D3DXMatrixMultiply(&mat, &transMat, &mat); if(this->rightFire) this->rightFire->setWorldMatrix(mat); if(this->rightIce) this->rightIce->setWorldMatrix(mat); } this->getAbsoluteVector(this->myAbsPos, Vector(0, 0, 0)); } void SimpleWeapon::attachFlameEmitter(Node* node, bool fireEmitter) { //Particle impact stuff ParticleGroup* pg = (ParticleGroup*) this->myScene->createNode(Scene::NODE_PARTICLEGROUP, true); if(fireEmitter) { pg->setUseHeatHaze(true); //Enables HeatHaze for FireParticles!!! } ParticleEmitter* spPE = (ParticleEmitter*) this->myScene->createNode(Scene::NODE_PARTICLEEMITTER); SPTR sn = this->myScene->getSmartPointer(spPE); pg->useGravity(false); pg->addParticleEmitter(sn); spPE->setPosition(0, 0, 10); spPE->setEMParticleVelocity(50); spPE->setDimensions(0.1f, 0.1f, 0.0f); spPE->setEMHorizontalDegree(0.1f); spPE->setEMVerticalDegree(0.1f); spPE->setEMEmissionDuration(1.0f); spPE->setEMRotationalDegree(0, 0, 150); spPE->setEMBirthRate(100); spPE->setEMParticleLifeTime(0.5); if(fireEmitter) { SoundNode* sn = (SoundNode*) this->myScene->createNode(Scene::NODE_SOUND, spPE); sn->loadFile("./media/sound/flame.wav", true); spPE->addEmittingSound(sn); spPE->setColDetGroup(UserContactReport::COLGROUP_FIRE); } else { spPE->setColDetGroup(UserContactReport::COLGROUP_ICE); } spPE->setDeleteMeAfterEmission(false); spPE->setStandBy(true); Sprite *rauch; rauch = (Sprite*) this->myScene->createNode(Scene::NODE_SPRITE, false); rauch->setDimension(3, 3); if(fireEmitter) { rauch->setTexture("./media/textures/particle.png"); } else { rauch->setTexture("./media/textures/iceparticle.png"); } rauch->setLookAtCamera(true); rauch->setAlpha(0.5f); rauch->getActorDescriptor()->density = 0; rauch->getBodyDescriptor()->mass = 0.001f; rauch->setSphereSizeFactor(0.1f); rauch->generatePhysicMesh(); if(fireEmitter) { rauch->setKeyFrame(Sprite::KEY_START, 0.7f, 1, 0.5f, 0.0, 1, 1, 0); rauch->setKeyFrame(Sprite::KEY_MIDDLE, 0.8f, 1, 0.6f, 0.0f, 5, 5, 0.5f); rauch->setKeyFrame(Sprite::KEY_END, 0, 0.5f, 0.5f, 0.5f, 10, 10, 1); } else { rauch->setKeyFrame(Sprite::KEY_START, 0.7f, 0.0, 0.5f, 1.0f, 1, 1, 0); rauch->setKeyFrame(Sprite::KEY_MIDDLE, 0.8f, 0.0, 0.6f, 1.0f, 5, 5, 0.5f); rauch->setKeyFrame(Sprite::KEY_END, 0, 0.5f, 0.5, 0.5f, 10, 10, 1); } rauch->userData = this->player; spPE->addRefNode(*rauch); spPE->addRefNode(*rauch); spPE->addRefNode(*rauch); if(fireEmitter) { if(!this->fire[0]) { this->fire[0] = rauch; } else { this->fire[1] = rauch; } if(node == this->leftWeapon) { this->leftFire = spPE; } else { this->rightFire = spPE; } } else { if(!this->ice[0]) { this->ice[0] = rauch; } else { this->ice[1] = rauch; } if(node == this->leftWeapon) { this->leftIce = spPE; } else { this->rightIce = spPE; } } } void SimpleWeapon::setPlayer(Player &_player) { this->player = &_player; for(int i=0;i<2;i++) { if(this->fire[i]) this->fire[i]->userData = this->player; if(this->ice[i]) this->ice[i]->userData = this->player; } }