Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/playability/src/world_entities/projectiles/spike.cc @ 10229

Last change on this file since 10229 was 10196, checked in by nicolasc, 17 years ago

just another upload
GUI seems to work, but there are still some unexplainable segfaults

File size: 4.2 KB
Line 
1/*
2   orxonox - the future of 3D-vertical-scrollers
3
4   Copyright (C) 2004-2006 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: Nicolas Schlumberger, Marc Schaerrer
13   co-programmer: Benjamin Grauer
14
15*/
16
17
18#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WEAPON
19
20#include "spike.h"
21
22#include "state.h"
23#include "model.h"
24
25#include "particles/dot_emitter.h"
26#include "particles/sprite_particles.h"
27
28#include <cassert>
29#include "debug.h"
30
31#include "space_ships/space_ship.h"
32
33
34#include "class_id_DEPRECATED.h"
35ObjectListDefinition(Spike);
36CREATE_FAST_FACTORY_STATIC(Spike);
37
38/**
39 *  standard constructor
40*/
41Spike::Spike () : Projectile()
42{
43  this->registerObject(this, Spike::_objectList);
44
45  this->loadModel("models/projectiles/spike.obj");
46
47  this->setMinEnergy(1);
48  this->setHealthMax(0);
49  this->lifeSpan = 2.0;
50
51  this->emitter = new DotEmitter(100, 5, M_2_PI);
52  this->emitter->setParent(this);
53  this->emitter->setSpread(M_PI, M_PI);
54  this->emitter->setEmissionRate(300.0);
55  this->emitter->setEmissionVelocity(50.0);
56
57  this->angle = 0;
58  this->rotationSpeed = 130;
59/*
60  this->halo = new Billboard();
61  this->halo->setSize(.35, .35);
62  this->halo->setTexture("hbolt_halo.png");*/
63}
64
65
66/**
67 *  standard deconstructor
68*/
69Spike::~Spike ()
70{
71  // delete this->emitter;
72
73  /* this is normaly done by World.cc by deleting the ParticleEngine */
74  if (Spike::explosionParticles != NULL && Spike::objectList().size() <= 1)
75  {
76    //if (ClassList::exists(Spike::explosionParticles, CL_PARTICLE_SYSTEM))
77    //  delete Spike::explosionParticles;
78    PRINTF(1)("Deleting Spike Particles\n");
79    Spike::explosionParticles = NULL;
80  }
81
82}
83
84SpriteParticles* Spike::explosionParticles = NULL;
85
86void Spike::activate()
87{
88  if (unlikely(Spike::explosionParticles == NULL))
89  {
90    Spike::explosionParticles = new SpriteParticles(1000);
91    Spike::explosionParticles->setName("BoltExplosionParticles");
92    Spike::explosionParticles->setLifeSpan(.5, .3);
93    Spike::explosionParticles->setRadius(0.0, 10.0);
94    Spike::explosionParticles->setRadius(.5, 6.0);
95    Spike::explosionParticles->setRadius(1.0, 3.0);
96    Spike::explosionParticles->setColor(0.0, 1,1,0,.9);
97    Spike::explosionParticles->setColor(0.5, .8,.8,0,.5);
98    Spike::explosionParticles->setColor(1.0, .8,.8,.7,.0);
99  }
100
101  this->setDamage(5);
102  this->setHealth(0);
103}
104
105
106void Spike::deactivate()
107{
108  assert (Spike::explosionParticles != NULL);
109  Spike::explosionParticles->removeEmitter(this->emitter);
110  this->lifeCycle = 0.0;
111
112  this->toList(OM_NULL);
113  this->removeNode();
114  Spike::fastFactory->kill(this);
115}
116
117
118void Spike::collidesWith(WorldEntity* entity, const Vector& location)
119{
120  PRINTF(0)("Collision with Spike\n");
121  if (this->hitEntity != entity && entity->isA(CL_NPC))
122    this->destroy( entity );
123  this->hitEntity = entity;
124  dynamic_cast<SpaceShip*>(entity)->damage(this->getDamage(),0);
125//   this->deactivate();
126}
127
128/**
129 *  signal tick, time dependent things will be handled here
130 * @param dt time since last tick
131*/
132void Spike::tick (float dt)
133{
134  //Vector v = *this->flightDirection * ( this->speed * time * 1000 + 0.1);
135  Vector v = this->velocity * dt;
136  this->shiftCoor(v);
137
138  if (this->tickLifeCycle(dt))
139    this->deactivate();
140
141  angle += rotationSpeed * dt;
142}
143
144/**
145 *  the function gets called, when the projectile is destroyed
146*/
147void Spike::destroy (WorldEntity* killer)
148{
149  Projectile::destroy( killer );
150  PRINTF(5)("DESTROY Spike\n");
151  this->lifeCycle = .95; //!< @todo calculate this usefully.
152
153  this->emitter->setSystem(Spike::explosionParticles);
154}
155
156
157void Spike::draw () const
158{
159  glPushAttrib(GL_ENABLE_BIT);
160  //glDisable(GL_LIGHTING);
161
162  glMatrixMode(GL_MODELVIEW);
163  glPushMatrix();
164
165  float matrix[4][4];
166  glTranslatef (this->getAbsCoor ().x, this->getAbsCoor ().y, this->getAbsCoor ().z);
167  Vector tmpRot = this->getAbsDir().getSpacialAxis();
168  glRotatef (this->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
169  glRotatef(angle, 1.0, 0.0, 0.0);
170  this->getAbsDir().matrix (matrix);
171  glMultMatrixf((float*)matrix);
172  this->getModel()->draw();
173
174//   this->halo->draw();
175
176  glPopMatrix();
177
178  glPopAttrib();
179}
180
Note: See TracBrowser for help on using the repository browser.