Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/world_entities/effects/explosion.cc @ 10695

Last change on this file since 10695 was 10695, checked in by snellen, 17 years ago

changes on soundengine and mover by fabian landau

File size: 4.5 KB
RevLine 
[4593]1/*
[3708]2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004 orx
5
6   This program is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 2, or (at your option)
9   any later version.
10
11   ### File Specific
12   main-programmer: Patrick Boenzli
[5443]13   co-programmer: Benjamin Grauer
14
[3708]15*/
[5357]16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WEAPON
[3708]17
[7047]18#include "explosion.h"
[3708]19
[9869]20#include "loading/fast_factory.h"
[3708]21
[5443]22#include "state.h"
[5054]23
[9869]24#include "particles/box_emitter.h"
25#include "particles/sprite_particles.h"
[5443]26
[10695]27#include "sound/resource_sound_buffer.h"
28#include "sound_engine.h"
29
30
[10114]31ObjectListDefinition(Explosion);
[9869]32CREATE_FAST_FACTORY_STATIC(Explosion);
[9406]33
[10665]34#include "script_class.h"
35CREATE_SCRIPTABLE_CLASS(Explosion,
36                        // Coordinates
37                            addMethod("getAbsCoorX", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorX))
38                            ->addMethod("getAbsCoorY", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorY))
39                            ->addMethod("getAbsCoorZ", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorZ))
40                            ->addMethod("setAbsCoor", Executor3<PNode, lua_State*,float,float,float>(&PNode::setAbsCoor))
41                            ->addMethod("setAbsDir", Executor4<PNode, lua_State*,float,float,float,float>(&PNode::setAbsDir))
42                        //Explode !
43                            ->addMethod("explode", Executor3<Explosion, lua_State*, float, float, float>(&Explosion::explode))
[10695]44                            ->addMethod("setExplosionSound", Executor1<Explosion, lua_State*, const std::string&>(&Explosion::setExplosionSound))
[10665]45                       );
46
[3708]47/**
[4836]48 *  standard constructor
[3708]49*/
[7047]50Explosion::Explosion ()
[3755]51{
[9869]52  this->registerObject(this, Explosion::_objectList);
[7104]53  this->toList(OM_DEAD_TICK);
[4597]54
[9235]55  this->emitter = new BoxEmitter(Vector(10,10,10), 200, 45, M_2_PI);
[7047]56  this->emitter->addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
[5443]57  this->emitter->setParent(this);
[5449]58  this->emitter->setSpread(M_PI, M_PI);
[7047]59
60  this->lifeCycle = 0.0f;
[7105]61  this->lifeTime = .5f;
[10695]62 
63  this->explosionSound.setSourceNode(this);
64 
[3755]65}
[3708]66
67
68/**
[4836]69 *  standard deconstructor
[3708]70*/
[7047]71Explosion::~Explosion ()
[3708]72{
[7047]73  delete this->emitter;
[10695]74  if (this->explosionSound.isPlaying())
75    this->explosionSound.stop();
[5445]76  /* this is normaly done by World.cc by deleting the ParticleEngine */
[9869]77  if (Explosion::explosionParticles != NULL && Explosion::objectList().size() <= 1)
[7047]78     Explosion::explosionParticles = NULL;
[3708]79}
80
[7047]81SpriteParticles* Explosion::explosionParticles = NULL;
[5443]82
[7103]83void Explosion::explode(PNode* position, const Vector& size)
84{
85  Explosion* explosion = dynamic_cast<Explosion*>(Explosion::fastFactory->resurrect());
[7105]86  explosion->setAbsCoor(position->getAbsCoor());
[7103]87  explosion->emitter->setSize(size);
88  explosion->activate();
89}
90
91
[10665]92void Explosion::explode(float x, float y, float z)
93{
94  Explosion* explosion = dynamic_cast<Explosion*>(Explosion::fastFactory->resurrect());
95  explosion->setAbsCoor(this->getAbsCoor());
96  explosion->emitter->setSize(Vector(x,y,z));
97  explosion->activate();
[10695]98 
99 
[10665]100}
101
102
[7047]103void Explosion::activate()
[5443]104{
[7047]105  if (unlikely(Explosion::explosionParticles == NULL))
[5447]106  {
[7103]107    Explosion::explosionParticles = new SpriteParticles(5000);
[7047]108    Explosion::explosionParticles->setName("ExplosionExplosionParticles");
[10317]109    Explosion::explosionParticles->setMaterialTexture("textures/radial-trans-noise.png");
[7105]110    Explosion::explosionParticles->setLifeSpan(1.5, .3);
[7047]111    Explosion::explosionParticles->setRadius(0.0, 10);
[9235]112    Explosion::explosionParticles->setRadius(.5, 30.0);
[7047]113    Explosion::explosionParticles->setRadius(1.0, 10.0);
[7106]114    Explosion::explosionParticles->setColor(0.0, 1,0,0,1);
115    Explosion::explosionParticles->setColor(0.5, .8,.8,0,.5);
116    Explosion::explosionParticles->setColor(0.8, .8,.8,.3,.3);
[7047]117    Explosion::explosionParticles->setColor(1.0, 1,1,1,.0);
[5447]118  }
[5443]119
[7047]120  this->emitter->setSystem(Explosion::explosionParticles);
[7105]121  this->emitter->updateNode(.01);
[7120]122  this->emitter->updateNode(.01);
[7047]123  this->toList(OM_DEAD_TICK);
[7103]124  this->lifeCycle = 0.0;
[10695]125 
126  this->explosionSound.play(this->explosionSoundBuffer, OrxSound::SoundEngine::getInstance()->getEffectsVolume(), 0.01, true);
[5443]127}
128
129
[7047]130void Explosion::deactivate()
[5443]131{
[6619]132  this->emitter->setSystem(NULL);
[7047]133  this->toList(OM_DEAD);
134  Explosion::fastFactory->kill(this);
[5443]135}
136
137
[3708]138/**
[4836]139 *  signal tick, time dependent things will be handled here
140 * @param time since last tick
[3708]141*/
[7047]142void Explosion::tick (float dt)
[3708]143{
[7047]144  this->lifeCycle += dt;
145  if(this->lifeTime < this->lifeCycle)
[6056]146    this->deactivate();
[3708]147}
Note: See TracBrowser for help on using the repository browser.