Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

Last change on this file since 10680 was 10665, checked in by snellen, 18 years ago

explosion is now scriptable

File size: 4.1 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
[10114]27ObjectListDefinition(Explosion);
[9869]28CREATE_FAST_FACTORY_STATIC(Explosion);
[9406]29
[10665]30#include "script_class.h"
31CREATE_SCRIPTABLE_CLASS(Explosion,
32                        // Coordinates
33                            addMethod("getAbsCoorX", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorX))
34                            ->addMethod("getAbsCoorY", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorY))
35                            ->addMethod("getAbsCoorZ", Executor0ret<PNode, lua_State*, float>(&PNode::getAbsCoorZ))
36                            ->addMethod("setAbsCoor", Executor3<PNode, lua_State*,float,float,float>(&PNode::setAbsCoor))
37                            ->addMethod("setAbsDir", Executor4<PNode, lua_State*,float,float,float,float>(&PNode::setAbsDir))
38                        //Explode !
39                            ->addMethod("explode", Executor3<Explosion, lua_State*, float, float, float>(&Explosion::explode))
40                       );
41
[3708]42/**
[4836]43 *  standard constructor
[3708]44*/
[7047]45Explosion::Explosion ()
[3755]46{
[9869]47  this->registerObject(this, Explosion::_objectList);
[7104]48  this->toList(OM_DEAD_TICK);
[4597]49
[9235]50  this->emitter = new BoxEmitter(Vector(10,10,10), 200, 45, M_2_PI);
[7047]51  this->emitter->addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
[5443]52  this->emitter->setParent(this);
[5449]53  this->emitter->setSpread(M_PI, M_PI);
[7047]54
55  this->lifeCycle = 0.0f;
[7105]56  this->lifeTime = .5f;
[7047]57
[3755]58}
[3708]59
60
61/**
[4836]62 *  standard deconstructor
[3708]63*/
[7047]64Explosion::~Explosion ()
[3708]65{
[7047]66  delete this->emitter;
[5444]67
[5445]68  /* this is normaly done by World.cc by deleting the ParticleEngine */
[9869]69  if (Explosion::explosionParticles != NULL && Explosion::objectList().size() <= 1)
[7047]70     Explosion::explosionParticles = NULL;
[3708]71}
72
[7047]73SpriteParticles* Explosion::explosionParticles = NULL;
[5443]74
[7103]75void Explosion::explode(PNode* position, const Vector& size)
76{
77  Explosion* explosion = dynamic_cast<Explosion*>(Explosion::fastFactory->resurrect());
[7105]78  explosion->setAbsCoor(position->getAbsCoor());
[7103]79  explosion->emitter->setSize(size);
80  explosion->activate();
81}
82
83
[10665]84void Explosion::explode(float x, float y, float z)
85{
86  Explosion* explosion = dynamic_cast<Explosion*>(Explosion::fastFactory->resurrect());
87  explosion->setAbsCoor(this->getAbsCoor());
88  explosion->emitter->setSize(Vector(x,y,z));
89  explosion->activate();
90}
91
92
[7047]93void Explosion::activate()
[5443]94{
[7047]95  if (unlikely(Explosion::explosionParticles == NULL))
[5447]96  {
[7103]97    Explosion::explosionParticles = new SpriteParticles(5000);
[7047]98    Explosion::explosionParticles->setName("ExplosionExplosionParticles");
[10317]99    Explosion::explosionParticles->setMaterialTexture("textures/radial-trans-noise.png");
[7105]100    Explosion::explosionParticles->setLifeSpan(1.5, .3);
[7047]101    Explosion::explosionParticles->setRadius(0.0, 10);
[9235]102    Explosion::explosionParticles->setRadius(.5, 30.0);
[7047]103    Explosion::explosionParticles->setRadius(1.0, 10.0);
[7106]104    Explosion::explosionParticles->setColor(0.0, 1,0,0,1);
105    Explosion::explosionParticles->setColor(0.5, .8,.8,0,.5);
106    Explosion::explosionParticles->setColor(0.8, .8,.8,.3,.3);
[7047]107    Explosion::explosionParticles->setColor(1.0, 1,1,1,.0);
[5447]108  }
[5443]109
[7047]110  this->emitter->setSystem(Explosion::explosionParticles);
[7105]111  this->emitter->updateNode(.01);
[7120]112  this->emitter->updateNode(.01);
[7047]113  this->toList(OM_DEAD_TICK);
[7103]114  this->lifeCycle = 0.0;
[5443]115}
116
117
[7047]118void Explosion::deactivate()
[5443]119{
[6619]120  this->emitter->setSystem(NULL);
[7047]121  this->toList(OM_DEAD);
122  Explosion::fastFactory->kill(this);
[5443]123}
124
125
[3708]126/**
[4836]127 *  signal tick, time dependent things will be handled here
128 * @param time since last tick
[3708]129*/
[7047]130void Explosion::tick (float dt)
[3708]131{
[7047]132  this->lifeCycle += dt;
133  if(this->lifeTime < this->lifeCycle)
[6056]134    this->deactivate();
[3708]135}
Note: See TracBrowser for help on using the repository browser.