1 | #include "dxstdafx.h"
|
---|
2 | #include ".\simpleweapon.h"
|
---|
3 | #include "GameManager.h"
|
---|
4 | #include "SimpleBullet.h"
|
---|
5 | #include "GameScene.h"
|
---|
6 | #include "ParticleEmitter.h"
|
---|
7 | #include "ParticleGroup.h"
|
---|
8 | #include "Sprite.h"
|
---|
9 | #include "Box.h"
|
---|
10 |
|
---|
11 | SimpleWeapon::SimpleWeapon(void) : Weapon()
|
---|
12 | {
|
---|
13 | this->nodeType |= GameScene::NODE_SIMPLEWEAPON;
|
---|
14 | this->fire[0] = NULL;
|
---|
15 | this->fire[1] = NULL;
|
---|
16 | this->ice[0] = NULL;
|
---|
17 | this->ice[1] = NULL;
|
---|
18 | this->leftFire = NULL;
|
---|
19 | this->rightFire = NULL;
|
---|
20 | this->leftIce = NULL;
|
---|
21 | this->rightIce = NULL;
|
---|
22 | }
|
---|
23 |
|
---|
24 | SimpleWeapon::~SimpleWeapon(void)
|
---|
25 | {
|
---|
26 | }
|
---|
27 |
|
---|
28 | void SimpleWeapon::initWeapon()
|
---|
29 | {
|
---|
30 | this->leftWeapon = (Object3d*) this->myScene->createNode(this->myScene->NODE_OBJECT3D, *this);
|
---|
31 | this->rightWeapon = (Object3d*) this->myScene->createNode(this->myScene->NODE_OBJECT3D, *this);
|
---|
32 | this->leftWeapon->setPosition(this->leftPos);
|
---|
33 | this->rightWeapon->setPosition(this->rightPos);
|
---|
34 | switch(this->weaponType) {
|
---|
35 | case this->TYPE_MG:
|
---|
36 | this->leftWeapon->loadMeshFromFile("./media/models/waffe1.x");
|
---|
37 | this->rightWeapon->loadMeshFromFile("./media/models/waffe1.x");
|
---|
38 | this->setStateSound(this->STATE_EMPTY, "./media/sound/emptyGun.wav");
|
---|
39 | this->timeForState[this->STATE_FIRE] = 0.1f;
|
---|
40 | break;
|
---|
41 | case this->TYPE_BOMB:
|
---|
42 | this->leftWeapon->loadMeshFromFile("./media/models/waffe2.x");
|
---|
43 | this->rightWeapon->loadMeshFromFile("./media/models/waffe2.x");
|
---|
44 | this->timeForState[this->STATE_FIRE] = 0.05f;
|
---|
45 | this->timeForState[this->STATE_POSTLOAD] = 0.5f;
|
---|
46 | break;
|
---|
47 | case this->TYPE_ALIEN:
|
---|
48 | this->leftWeapon->loadMeshFromFile("./media/models/waffe3.x");
|
---|
49 | this->rightWeapon->loadMeshFromFile("./media/models/waffe3.x");
|
---|
50 | this->timeForState[this->STATE_FIRE] = 0.05f;
|
---|
51 | break;
|
---|
52 | case this->TYPE_FIRE:
|
---|
53 | this->leftWeapon->loadMeshFromFile("./media/models/Flammenwerfer_big.x");
|
---|
54 | this->rightWeapon->loadMeshFromFile("./media/models/Flammenwerfer_big.x");
|
---|
55 | this->timeForState[this->STATE_FIRE] = 0.0f;
|
---|
56 | this->attachFlameEmitter(this->leftWeapon);
|
---|
57 | this->attachFlameEmitter(this->rightWeapon);
|
---|
58 | break;
|
---|
59 | case this->TYPE_ICE:
|
---|
60 | this->leftWeapon->loadMeshFromFile("./media/models/schneekanone.x");
|
---|
61 | this->rightWeapon->loadMeshFromFile("./media/models/schneekanone.x");
|
---|
62 | this->timeForState[this->STATE_FIRE] = 0.0f;
|
---|
63 | this->attachFlameEmitter(this->leftWeapon, false);
|
---|
64 | this->attachFlameEmitter(this->rightWeapon, false);
|
---|
65 | break;
|
---|
66 | }
|
---|
67 | }
|
---|
68 |
|
---|
69 | void SimpleWeapon::doFire()
|
---|
70 | {
|
---|
71 | //this->myScene->manager->printToConsole("do Fire!!!");
|
---|
72 | if(this->weaponType<this->TYPE_FIRE) {
|
---|
73 | SimpleBullet *leftBullet;
|
---|
74 | SimpleBullet *rightBullet;
|
---|
75 |
|
---|
76 | leftBullet = (SimpleBullet *) this->myScene->createNode(((GameScene*)this->myScene)->NODE_SIMPLEBULLET, true);
|
---|
77 | rightBullet = (SimpleBullet *) this->myScene->createNode(((GameScene*)this->myScene)->NODE_SIMPLEBULLET, true);
|
---|
78 | leftBullet->setBulletType(this->weaponType);
|
---|
79 | rightBullet->setBulletType(this->weaponType);
|
---|
80 |
|
---|
81 | Vector leftDir;
|
---|
82 | Vector rightDir;
|
---|
83 | Vector zDir(0, 0, 1);
|
---|
84 | this->leftWeapon->getAbsoluteDirectionVector(leftDir, zDir);
|
---|
85 | this->rightWeapon->getAbsoluteDirectionVector(rightDir, zDir);
|
---|
86 | leftDir.normalize();
|
---|
87 | rightDir.normalize();
|
---|
88 |
|
---|
89 | if(leftDir.length()<0.99 || leftDir.length()>1.01)
|
---|
90 | leftDir.setXYZ(0, 0, 1);
|
---|
91 | if(rightDir.length()<0.99 || rightDir.length()>1.01)
|
---|
92 | rightDir.setXYZ(0, 0, 1);
|
---|
93 |
|
---|
94 | leftBullet->setWeaponDirection(leftDir);
|
---|
95 | rightBullet->setWeaponDirection(rightDir);
|
---|
96 |
|
---|
97 | leftBullet->setPlayer(this->player);
|
---|
98 | rightBullet->setPlayer(this->player);
|
---|
99 |
|
---|
100 | leftBullet->setTimeToLive(0.2f);
|
---|
101 | rightBullet->setTimeToLive(0.3f);
|
---|
102 |
|
---|
103 | Vector temp;
|
---|
104 | this->leftWeapon->getAbsoluteVector(temp, zDir*2);
|
---|
105 | leftBullet->setPosition(temp);
|
---|
106 | this->rightWeapon->getAbsoluteVector(temp, zDir*2);
|
---|
107 | rightBullet->setPosition(temp);
|
---|
108 |
|
---|
109 | leftBullet->initBullet();
|
---|
110 | rightBullet->initBullet();
|
---|
111 | } else if(this->weaponType == this->TYPE_FIRE) {
|
---|
112 | if(!this->leftFire->isEmitting()) {
|
---|
113 | this->leftFire->restartEmitting();
|
---|
114 | this->rightFire->restartEmitting();
|
---|
115 | }
|
---|
116 | } else if(this->weaponType == this->TYPE_ICE) {
|
---|
117 | if(!this->leftIce->isEmitting()) {
|
---|
118 | this->leftIce->restartEmitting();
|
---|
119 | this->rightIce->restartEmitting();
|
---|
120 | }
|
---|
121 | }
|
---|
122 | }
|
---|
123 |
|
---|
124 | Node* SimpleWeapon::clone()
|
---|
125 | {
|
---|
126 | SimpleWeapon* sw = (SimpleWeapon*) this->myScene->createNode(GameScene::NODE_SIMPLEWEAPON, *this->father, true);
|
---|
127 | sw->setWeaponType(this->weaponType);
|
---|
128 | sw->initWeapon();
|
---|
129 | return sw;
|
---|
130 | }
|
---|
131 |
|
---|
132 | void SimpleWeapon::calcWorldMatrix(D3DXMATRIX &pMatWorld)
|
---|
133 | {
|
---|
134 | Weapon::calcWorldMatrix(pMatWorld);
|
---|
135 | if(this->weaponType==this->TYPE_FIRE || this->TYPE_ICE) {
|
---|
136 | D3DXMATRIXA16 mat;
|
---|
137 | D3DXMATRIXA16 transMat;
|
---|
138 | D3DXMatrixTranslation(&transMat, 0, 0, 3);
|
---|
139 | mat = *this->leftWeapon->getWorldMatrix();
|
---|
140 | D3DXMatrixMultiply(&mat, &transMat, &mat);
|
---|
141 | if(this->leftFire) this->leftFire->setWorldMatrix(mat);
|
---|
142 | if(this->leftIce)
|
---|
143 | this->leftIce->setWorldMatrix(mat);
|
---|
144 | mat = *this->rightWeapon->getWorldMatrix();
|
---|
145 | D3DXMatrixMultiply(&mat, &transMat, &mat);
|
---|
146 | if(this->rightFire) this->rightFire->setWorldMatrix(mat);
|
---|
147 | if(this->rightIce)
|
---|
148 | this->rightIce->setWorldMatrix(mat);
|
---|
149 | }
|
---|
150 | this->getAbsoluteVector(this->myAbsPos, Vector(0, 0, 0));
|
---|
151 | }
|
---|
152 |
|
---|
153 | void SimpleWeapon::attachFlameEmitter(Node* node, bool fireEmitter)
|
---|
154 | {
|
---|
155 | //Particle impact stuff
|
---|
156 | ParticleGroup* pg = (ParticleGroup*) this->myScene->createNode(Scene::NODE_PARTICLEGROUP, true);
|
---|
157 | if(fireEmitter) {
|
---|
158 | pg->setUseHeatHaze(true); //Enables HeatHaze for FireParticles!!!
|
---|
159 | }
|
---|
160 |
|
---|
161 | ParticleEmitter* spPE = (ParticleEmitter*) this->myScene->createNode(Scene::NODE_PARTICLEEMITTER);
|
---|
162 | SPTR<Node> sn = this->myScene->getSmartPointer(spPE);
|
---|
163 | pg->useGravity(false);
|
---|
164 | pg->addParticleEmitter(sn);
|
---|
165 | spPE->setPosition(0, 0, 10);
|
---|
166 | spPE->setEMParticleVelocity(50);
|
---|
167 | spPE->setDimensions(0.1f, 0.1f, 0.0f);
|
---|
168 | spPE->setEMHorizontalDegree(0.1f);
|
---|
169 | spPE->setEMVerticalDegree(0.1f);
|
---|
170 | spPE->setEMEmissionDuration(1.0f);
|
---|
171 | spPE->setEMRotationalDegree(0, 0, 150);
|
---|
172 | spPE->setEMBirthRate(100);
|
---|
173 | spPE->setEMParticleLifeTime(0.5);
|
---|
174 | if(fireEmitter) {
|
---|
175 | SoundNode* sn = (SoundNode*) this->myScene->createNode(Scene::NODE_SOUND, spPE);
|
---|
176 | sn->loadFile("./media/sound/flame.wav", true);
|
---|
177 | spPE->addEmittingSound(sn);
|
---|
178 | spPE->setColDetGroup(UserContactReport::COLGROUP_FIRE);
|
---|
179 | } else {
|
---|
180 | spPE->setColDetGroup(UserContactReport::COLGROUP_ICE);
|
---|
181 | }
|
---|
182 | spPE->setDeleteMeAfterEmission(false);
|
---|
183 | spPE->setStandBy(true);
|
---|
184 |
|
---|
185 | Sprite *rauch;
|
---|
186 | rauch = (Sprite*) this->myScene->createNode(Scene::NODE_SPRITE, false);
|
---|
187 | rauch->setDimension(3, 3);
|
---|
188 | if(fireEmitter) {
|
---|
189 | rauch->setTexture("./media/textures/particle.png");
|
---|
190 | } else {
|
---|
191 | rauch->setTexture("./media/textures/iceparticle.png");
|
---|
192 | }
|
---|
193 | rauch->setLookAtCamera(true);
|
---|
194 | rauch->setAlpha(0.5f);
|
---|
195 | rauch->getActorDescriptor()->density = 0;
|
---|
196 | rauch->getBodyDescriptor()->mass = 0.001f;
|
---|
197 | rauch->setSphereSizeFactor(0.1f);
|
---|
198 | rauch->generatePhysicMesh();
|
---|
199 | if(fireEmitter) {
|
---|
200 | rauch->setKeyFrame(Sprite::KEY_START, 0.7f, 1, 0.5f, 0.0, 1, 1, 0);
|
---|
201 | rauch->setKeyFrame(Sprite::KEY_MIDDLE, 0.8f, 1, 0.6f, 0.0f, 5, 5, 0.5f);
|
---|
202 | rauch->setKeyFrame(Sprite::KEY_END, 0, 0.5f, 0.5f, 0.5f, 10, 10, 1);
|
---|
203 | } else {
|
---|
204 | rauch->setKeyFrame(Sprite::KEY_START, 0.7f, 0.0, 0.5f, 1.0f, 1, 1, 0);
|
---|
205 | rauch->setKeyFrame(Sprite::KEY_MIDDLE, 0.8f, 0.0, 0.6f, 1.0f, 5, 5, 0.5f);
|
---|
206 | rauch->setKeyFrame(Sprite::KEY_END, 0, 0.5f, 0.5, 0.5f, 10, 10, 1);
|
---|
207 | }
|
---|
208 | rauch->userData = this->player;
|
---|
209 |
|
---|
210 | spPE->addRefNode(*rauch);
|
---|
211 | spPE->addRefNode(*rauch);
|
---|
212 | spPE->addRefNode(*rauch);
|
---|
213 |
|
---|
214 | if(fireEmitter) {
|
---|
215 | if(!this->fire[0]) {
|
---|
216 | this->fire[0] = rauch;
|
---|
217 | } else {
|
---|
218 | this->fire[1] = rauch;
|
---|
219 | }
|
---|
220 | if(node == this->leftWeapon) {
|
---|
221 | this->leftFire = spPE;
|
---|
222 | } else {
|
---|
223 | this->rightFire = spPE;
|
---|
224 | }
|
---|
225 | } else {
|
---|
226 | if(!this->ice[0]) {
|
---|
227 | this->ice[0] = rauch;
|
---|
228 | } else {
|
---|
229 | this->ice[1] = rauch;
|
---|
230 | }
|
---|
231 | if(node == this->leftWeapon) {
|
---|
232 | this->leftIce = spPE;
|
---|
233 | } else {
|
---|
234 | this->rightIce = spPE;
|
---|
235 | }
|
---|
236 | }
|
---|
237 | }
|
---|
238 |
|
---|
239 | void SimpleWeapon::setPlayer(Player &_player)
|
---|
240 | {
|
---|
241 | this->player = &_player;
|
---|
242 | for(int i=0;i<2;i++) {
|
---|
243 | if(this->fire[i])
|
---|
244 | this->fire[i]->userData = this->player;
|
---|
245 | if(this->ice[i])
|
---|
246 | this->ice[i]->userData = this->player;
|
---|
247 | }
|
---|
248 |
|
---|
249 | } |
---|