Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/playability/src/world_entities/projectiles/hbolt.cc @ 10042

Last change on this file since 10042 was 10036, checked in by nicolasc, 18 years ago

equalized energy usage of all blasters
solved the fire echo problem, by implementing the releaseFire()
other spaceships need update

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