source: GTP/trunk/App/Games/Jungle_Rumble/src/SimpleBullet.cpp @ 1378

Revision 1378, 10.2 KB checked in by giegl, 18 years ago (diff)

GTPD - Jungle Rumble - integrate into GTP SVN structure

Line 
1#include "dxstdafx.h"
2#include ".\simplebullet.h"
3#include "Object3d.h"
4#include "GameScene.h"
5#include "Player.h"
6#include "Goodie.h"
7#include "GameManager.h"
8#include "UserContactReport.h"
9#include "Terrain.h"
10#include "ParticleEmitter.h"
11#include "ParticleGroup.h"
12#include "Sprite.h"
13#include "Box.h"
14#include "UserContactReport.h"
15
16SimpleBullet::SimpleBullet(void) : Bullet()
17{
18        this->filename = "";
19        this->speed = -1;
20        this->impactForce = -1;
21        this->spriteTimer = 0;
22        this->nodeType |= GameScene::NODE_SIMPLEBULLET;
23        this->bulletObj = NULL;
24}
25
26SimpleBullet::~SimpleBullet(void)
27{
28}
29
30void SimpleBullet::initBullet()
31{
32        Vector tempPos;
33        tempPos = this->myPosition + this->dir*2;
34        this->bulletObj = (Object3d*) ((GameScene*) this->myScene)->createNode(((GameScene*) this->myScene)->NODE_OBJECT3D, *this);
35        switch(this->bulletType) {
36                case this->TYPE_MG:
37                        if(this->filename.compare("")==0) {
38                                this->bulletObj->loadMeshFromFile("./media/models/munition1.x");
39                        } else {
40                                this->bulletObj->loadMeshFromFile(this->filename);
41                        }
42                        this->setExplodeAtDeath(false);
43                        this->setTimeToLive(5);
44                        if(this->speed==-1)
45                                this->speed = 100;
46                        if(this->impactForce==-1)
47                                this->impactForce = 3;
48                        this->impactRadius = 15;
49                        this->impactDamage = 20;
50                        this->createPActor();
51                       
52                        this->orientAndMove(this->dir, Vector(0, 1, 0), tempPos, false);
53                        this->setImpactSound("./media/sound/bomb.wav");
54                        this->setFlySound("./media/sound/mgFly.wav");
55                        this->flySound->play();
56                        break;
57                case this->TYPE_BOMB:
58                        if(this->filename.compare("")==0) {
59                                this->bulletObj->loadMeshFromFile("./media/models/munition2.x");
60                        } else {
61                                this->bulletObj->loadMeshFromFile(this->filename);
62                        }
63                        this->setExplodeAtDeath(true);
64                        this->setTimeToLive(5);
65                        if(this->speed==-1)
66                                this->speed = 30;
67                        if(this->impactForce==-1)
68                                this->impactForce = 8;
69                        this->impactRadius = 15;
70                        this->setImpactSound("./media/sound/bigboom.wav");
71                        this->createPActor();
72                        break;
73                case this->TYPE_ALIEN:
74                        if(this->filename.compare("")==0) {
75                                this->bulletObj->loadMeshFromFile("./media/models/munition3.x");
76                        } else {
77                                this->bulletObj->loadMeshFromFile(this->filename);
78                        }
79                        this->setExplodeAtDeath(false);
80                        this->setTimeToLive(10);
81                        if(this->speed==-1)
82                                this->speed = 200;
83                        if(this->impactForce==-1)
84                                this->impactForce = 2;
85                        this->impactRadius = 15;
86                        this->setImpactSound("./media/sound/bomb.wav");
87                        this->setFlySound("./media/sound/alienFly.wav");
88                        this->flySound->play();
89                        this->createPActor();
90                        this->orientAndMove(this->dir, Vector(0, 1, 0), tempPos, false);
91                        break;
92        }
93        this->createParticleEffect();
94}
95
96void SimpleBullet::impactTimeOut()
97{
98        if(this->bulletType==this->TYPE_BOMB) {
99                this->collectEnvironmentInformation();
100                this->setStandardExplosionForces();
101                this->impactSound->play();
102                if(this->terrainHit) {
103                        Vector p = this->getAbsolutePosition();
104                        ((GameScene*) this->myScene)->getTerrain()->impact(p.x, p.z, (int)this->impactForce);
105                        ((GameScene* )this->myScene)->reduceHealthOnPlayers(this);
106                }
107        }
108        this->killMe();
109}
110
111void SimpleBullet::impactPlayer(Player* player, Vector normal)
112{
113        if(player!=this->myPlayer && this->bulletType!=this->TYPE_BOMB) {
114                Vector p;
115                p = this->getAbsolutePosition();
116                this->exploded = true;
117                player->setPlayerHit(p, *this);
118                if(this->impactSound) {
119                        this->impactSound->play();
120                }
121                this->collectEnvironmentInformation();
122                this->setStandardExplosionForces();
123                ((GameScene* )this->myScene)->reduceHealthOnPlayers(this);
124                this->killMe();
125        }
126}
127
128void SimpleBullet::impactTerrain(Vector normal)
129{
130        Vector p;
131        p = this->getAbsolutePosition();
132        switch(this->bulletType) {
133                case this->TYPE_MG:
134                case this->TYPE_ALIEN:
135                        this->exploded = true;
136                        ((GameScene*) this->myScene)->getTerrain()->impact(p.x, p.z, (int)this->impactForce);
137                        p.y = ((GameScene*)this->myScene)->getTerrain()->getHeight(p.x, p.z) - 1;
138                        if(this->impactSound) {
139                                this->impactSound->play();
140                        }
141                        this->impactNormal = normal;
142                        this->collectEnvironmentInformation();
143                        this->setStandardExplosionForces();
144                        ((GameScene* )this->myScene)->reduceHealthOnPlayers(this);
145                        this->killMe();
146                        break;
147        }
148}
149
150void SimpleBullet::impactGoodie(Goodie* goodie, Vector normal)
151{
152        this->myScene->manager->printToConsole("impactGoodie!!!");
153}
154
155void SimpleBullet::impactOther(Object3d* other, Vector normal)
156{
157        Vector p;
158        p = this->getAbsolutePosition();
159        switch(this->bulletType) {
160                case this->TYPE_MG:
161                        this->exploded = true;
162                        this->impactSound->play();
163                        this->collectEnvironmentInformation();
164                        this->setStandardExplosionForces();
165                        ((GameScene* )this->myScene)->reduceHealthOnPlayers(this);
166                        this->killMe();
167                        break;
168                case this->TYPE_BOMB:
169                        break;
170                case this->TYPE_ALIEN:
171                        this->exploded = true;
172                        if(this->impactSound) {
173                                this->impactSound->play();
174                        }
175                        this->collectEnvironmentInformation();
176                        this->setStandardExplosionForces();
177                        ((GameScene* )this->myScene)->reduceHealthOnPlayers(this);
178                        this->killMe();
179                        break;
180        }
181}
182
183void SimpleBullet::createPActor()
184{
185        Vector temp;
186        temp = dir;
187        temp.normalize();
188        if(temp.length()<0.99 || temp.length()>1.1) {
189                temp.setXYZ(0, 0, 1);
190        }
191        if(this->filename.compare("")!=0) {
192                this->bulletObj->generatePhysicMesh(Object3d::COL_CONVEX);
193                this->pActorDesc = *this->bulletObj->getActorDescriptor();
194                this->setBehaveAs(this->RIGIDBODY);
195                temp = temp*this->speed;
196                this->pActor->setLinearVelocity(temp.getNxVector());
197                this->setColDetGroup(UserContactReport::COLGROUP_BULLET);
198                return;
199        }
200        NxCapsuleShapeDesc capsuleDesc;
201        NxSphereShapeDesc sphereDesc;
202        Vector rotV(D3DX_PI/2,0,0);
203        NxMat34 pose(NxMat33(rotV.getNxQuatRotation()), NxVec3(0, 0, 0));
204        switch(this->bulletType) {
205                case this->TYPE_MG:   
206                        capsuleDesc.height = (NxReal)3.5;
207                        capsuleDesc.radius = (NxReal)0.1;
208                        capsuleDesc.localPose = pose;
209                        this->pActorDesc.shapes.pushBack(&capsuleDesc);
210                        this->pActorDesc.density = 10;
211                        this->setBehaveAs(this->RIGIDBODY);
212                        temp = temp*this->speed;
213                        if(this->pActor) {
214                                this->pActor->setLinearVelocity(temp.getNxVector());
215                                this->setColDetGroup(UserContactReport::COLGROUP_BULLET);
216                        }
217                        break;
218                case this->TYPE_BOMB:
219                        sphereDesc.radius = 0.5f;
220                        this->pActorDesc.shapes.pushBack(&sphereDesc);
221                        this->pActorDesc.density = 50;
222                        this->setBehaveAs(this->RIGIDBODY);
223                        temp = temp*this->speed;
224                        if(this->pActor) {
225                                this->pActor->setLinearVelocity(temp.getNxVector());
226                                this->setColDetGroup(UserContactReport::COLGROUP_BULLET);
227                        }
228                        break;
229                case this->TYPE_ALIEN:
230                        capsuleDesc.height = 2.5f;
231                        capsuleDesc.radius = 0.2f;
232                        capsuleDesc.localPose = pose;
233                        this->pActorDesc.shapes.pushBack(&capsuleDesc);
234                        this->pActorDesc.density = 0.5;
235                        this->setBehaveAs(this->RIGIDBODY);
236                        temp = temp*this->speed;
237                        if(this->pActor) {
238                                this->pActor->setLinearVelocity(temp.getNxVector());
239                                this->setColDetGroup(UserContactReport::COLGROUP_BULLET);
240                                this->pActor->raiseBodyFlag(NX_BF_DISABLE_GRAVITY);
241                        }
242                        break;
243        }
244}
245
246void SimpleBullet::update(float dt)
247{
248       
249        this->spriteTimer+=dt;
250        if(this->spriteTimer>0.08f) {
251                this->spriteTimer = 0;
252                Sprite *rauch;
253                rauch = (Sprite*) this->myScene->createNode(Scene::NODE_SPRITE);
254                rauch->setDimension(3, 3);
255                rauch->setTexture("./media/textures/explosion.png");
256                rauch->setFPS(64);
257                rauch->setTimeToLive(1);
258                rauch->setRowColumnCount(8, 8);
259                rauch->setFrameCount(64);
260                rauch->setLoopAnimation(true);
261                rauch->setLookAtCamera(true);
262                rauch->setAlpha(0.5f);
263                rauch->setPosition(this->getAbsolutePosition());
264        }
265        Bullet::update(dt);
266}
267
268Node* SimpleBullet::clone()
269{
270        SimpleBullet* sb = (SimpleBullet*) this->myScene->createNode(GameScene::NODE_SIMPLEBULLET, *this->father, true);
271        sb->setBulletType(this->bulletType);
272        sb->initBullet();
273        return sb;
274}
275
276void SimpleBullet::setXFile(std::string _filename)
277{
278        this->filename = _filename;
279}
280
281void SimpleBullet::setSpeed(float _speed)
282{
283        this->speed = _speed;
284}
285
286void SimpleBullet::createParticleEffect()
287{
288        //Particle impact stuff
289        ParticleGroup* pg = (ParticleGroup*) this->myScene->createNode(Scene::NODE_PARTICLEGROUP, true);
290        ParticleEmitter* spPE = (ParticleEmitter*) this->myScene->createNode(Scene::NODE_PARTICLEEMITTER);
291        SPTR<Node> sn = this->myScene->getSmartPointer(spPE);
292        pg->addParticleEmitter(sn);
293        spPE->setPosition(this->getAbsolutePosition());
294        spPE->setEMEmissionDuration(0.2f);
295        spPE->setEMRotationalDegree(0, 0, 150);
296        spPE->setDimensions(this->impactForce, this->impactForce, 0);
297        spPE->setEMParticleVelocity(this->impactForce*6);
298        spPE->setEMHorizontalDegree(0.3f);
299        spPE->setEMVerticalDegree(0.3f);
300        spPE->setEMBirthRate(25);
301        spPE->setEMParticleLifeTime(1.5f);
302        spPE->setRotation(-D3DX_PI/2, 0, 0);
303        spPE->setColDetGroup(UserContactReport::COLGROUP_NOCOL);
304        spPE->setDeleteMeAfterEmission(true);
305        spPE->setStandBy(true);
306
307        Sprite *fire;
308        fire = (Sprite*) this->myScene->createNode(Scene::NODE_SPRITE);
309        fire->setDimension(4, 4);
310        fire->setTexture("./media/textures/rauch.bmp");
311        fire->setLookAtCamera(true);
312        fire->setAlpha(0.5f);
313        fire->generatePhysicMesh();
314        fire->setKeyFrame(Sprite::KEY_START, 1, 1, 0, 0, 4, 4, 0);
315        fire->setKeyFrame(Sprite::KEY_MIDDLE, 1, 1, 0.5, 0.5, 8, 8, 0.5);
316        fire->setKeyFrame(Sprite::KEY_END, 0, 1, 1, 1, 10, 10, 1);
317
318        Sprite *fire3;
319        fire3 = (Sprite*) this->myScene->createNode(Scene::NODE_SPRITE);
320        fire3->setDimension(2, 2);
321        fire3->setTexture("./media/textures/explosion.png");
322        fire3->setLookAtCamera(true);
323        fire3->setAlpha(0.5f);
324        fire3->generatePhysicMesh();
325        fire3->setFPS(43);
326        fire3->setRowColumnCount(8, 8);
327        fire3->setFrameCount(64);
328        fire3->setLoopAnimation(true);
329        fire3->setKeyFrame(Sprite::KEY_START, 1, 1, 0, 0, 4, 4, 0);
330        fire3->setKeyFrame(Sprite::KEY_MIDDLE, 1, 1, 0.5, 0.5, 8, 8, 0.5);
331        fire3->setKeyFrame(Sprite::KEY_END, 0, 1, 1, 1, 10, 10, 1);
332
333        spPE->addRefNode(*fire);
334        spPE->addRefNode(*fire);
335        spPE->addRefNode(*fire3);
336        spPE->addRefNode(*fire);
337        spPE->addRefNode(*fire3);
338
339        this->addParticleEmitter(spPE);
340}
341
342void SimpleBullet::killMe()
343{
344        if(this->bulletObj) {
345                this->bulletObj->killMe();
346        }
347        Bullet::killMe();
348}
Note: See TracBrowser for help on using the repository browser.