Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/proxy/src/world_entities/space_ships/turbine_hover.cc @ 9500

Last change on this file since 9500 was 9500, checked in by bensch, 18 years ago

compiles again, the Playables should now be able to choose their design per team

File size: 17.9 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: Benjamin Grauer
13   co-programmer: ...
14
15*/
16
17#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
18
19#include "turbine_hover.h"
20
21#include "weapons/weapon_manager.h"
22#include "weapons/test_gun.h"
23#include "weapons/turret.h"
24#include "weapons/cannon.h"
25
26#include "util/loading/factory.h"
27#include "key_mapper.h"
28#include "state.h"
29
30#include "graphics_engine.h"
31#include "dot_emitter.h"
32#include "sprite_particles.h"
33
34#include "debug.h"
35
36CREATE_FACTORY(TurbineHover, CL_TURBINE_HOVER);
37
38/**
39 *  destructs the turbine_hover, deletes alocated memory
40 */
41TurbineHover::~TurbineHover ()
42{
43  this->setPlayer(NULL);
44}
45
46/**
47 * @brief loads a TurbineHover information from a specified file.
48 * @param fileName the name of the File to load the turbine_hover from (absolute path)
49 */
50TurbineHover::TurbineHover(const std::string& fileName)
51{
52  this->init();
53  TiXmlDocument doc(fileName);
54
55  if(!doc.LoadFile())
56  {
57    PRINTF(2)("Loading file %s failed for TurbineHover.\n", fileName.c_str());
58    return;
59  }
60
61  this->loadParams(doc.RootElement());
62}
63
64/**
65 * @brief creates a new Spaceship from Xml Data
66 * @param root the xml element containing spaceship data
67
68   @todo add more parameters to load
69*/
70TurbineHover::TurbineHover(const TiXmlElement* root)
71{
72  this->init();
73  if (root != NULL)
74    this->loadParams(root);
75
76  //weapons:
77  Weapon* wpRight = new TestGun(0);
78  wpRight->setName("testGun Right");
79  Weapon* wpLeft = new TestGun(1);
80  wpLeft->setName("testGun Left");
81  //Weapon* cannon = dynamic_cast<Weapon*>(Factory::fabricate(CL_HYPERBLASTER));
82
83  //  cannon->setName("BFG");
84
85  this->addWeapon(wpLeft, 1, 0);
86  this->addWeapon(wpRight,1 ,1);
87  //this->addWeapon(cannon, 0, 2);
88
89  this->getWeaponManager().changeWeaponConfig(1);
90  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
91
92  this->loadModel("models/ships/hoverglider_mainbody.obj");
93}
94
95
96/**
97 * @brief initializes a TurbineHover
98 */
99void TurbineHover::init()
100{
101  //  this->setRelDir(Quaternion(M_PI, Vector(1,0,0)));
102  this->setClassID(CL_TURBINE_HOVER, "TurbineHover");
103
104  this->setSupportedPlaymodes(Playable::Full3D | Playable::Horizontal | Playable::Vertical);
105
106  this->loadModel("models/ships/hoverglider_wing.obj", 1.0f, 3);
107  this->loadModel("models/ships/hoverglider_turbine.obj", 1.0f, 4);
108  this->loadModel("models/ships/hoverglider_turbine_rotors.obj", 1.0f, 5);
109
110  bForward = bBackward = bLeft = bRight = bAscend = bDescend = false;
111  mouseSensitivity = 0.005;
112
113  this->rotorSpeed = 1000.0f;
114  this->rotorCycle = 0.0f;
115  this->cameraLook = 0.0f;
116  this->rotation = 0.0f;
117  this->acceleration = 10.0f;
118  this->airFriction = 2.0f;
119
120  this->setHealthMax(100);
121  this->setHealth(100);
122
123
124  // camera - issue
125  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
126  this->cameraNode.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
127  //this->cameraNode.setParentMode(PNODE_ROTATE_MOVEMENT);
128  this->cameraNode.setParent(this);
129  this->cameraNode.setRelCoor(0,5,0);
130
131  // rotors
132  this->wingNodeLeft.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT );
133  this->wingNodeLeft.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
134  this->wingNodeLeft.setParent(this);
135  this->wingNodeLeft.setRelCoor(-1.5, -.3, -1.0);
136  this->rotorNodeLeft.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
137  this->rotorNodeLeft.setParent(&this->wingNodeLeft);
138  this->rotorNodeLeft.setRelCoor(0, 1.0, -2.3);
139
140  this->wingNodeRight.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
141  this->wingNodeRight.addNodeFlags(PNODE_PROHIBIT_CHILD_DELETE);
142  this->wingNodeRight.setParent(this);
143  this->wingNodeRight.setRelCoor(-1.5, -0.3, 1.0);
144  this->rotorNodeRight.addNodeFlags(PNODE_PROHIBIT_DELETE_WITH_PARENT);
145  this->rotorNodeRight.setParent(&this->wingNodeRight);
146  this->rotorNodeRight.setRelCoor(0, 1.0, 2.3);
147
148  // PARTICLES
149  this->burstEmitter[0] = new DotEmitter(200, 5.0, .01);
150  this->burstEmitter[0]->setParent(&this->rotorNodeLeft);
151  this->burstEmitter[0]->setRelCoor(0, -0.7, 0);
152  this->burstEmitter[0]->setRelDir(Quaternion(-M_PI_2, Vector(0,0,1)));
153  this->burstEmitter[0]->setName("TurbineHover_Burst_emitter_Left");
154
155  this->burstEmitter[1] = new DotEmitter(200, 5.0, .01);
156  this->burstEmitter[1]->setParent(&this->rotorNodeRight);
157  this->burstEmitter[1]->setRelCoor(0, -0.7, 0);
158  this->burstEmitter[1]->setRelDir(Quaternion(-M_PI_2, Vector(0,0,1)));
159  this->burstEmitter[1]->setName("TurbineHover_Burst_emitter_Right");
160
161
162  this->burstSystem = new SpriteParticles(1000);
163  this->burstSystem->addEmitter(this->burstEmitter[0]);
164  this->burstSystem->addEmitter(this->burstEmitter[1]);
165  this->burstSystem->setName("SpaceShip_Burst_System");
166  ((SpriteParticles*)this->burstSystem)->setMaterialTexture("maps/radial-trans-noise.png");
167  this->burstSystem->setLifeSpan(1.0, .3);
168  this->burstSystem->setRadius(0.0, 1.5);
169  this->burstSystem->setRadius(0.05, 1.8);
170  this->burstSystem->setRadius(.5, .8);
171  this->burstSystem->setRadius(1.0, 0);
172  this->burstSystem->setColor(0.0, .7,.7,1,.5);
173  this->burstSystem->setColor(0.2, 0,0,0.8,.5);
174  this->burstSystem->setColor(0.5, .5,.5,.8,.3);
175  this->burstSystem->setColor(1.0, .8,.8,.8,.0);
176
177
178  //add events to the eventlist of the Playable
179  this->registerEvent(KeyMapper::PEV_FORWARD);
180  this->registerEvent(KeyMapper::PEV_BACKWARD);
181  this->registerEvent(KeyMapper::PEV_LEFT);
182  this->registerEvent(KeyMapper::PEV_RIGHT);
183  this->registerEvent(KeyMapper::PEV_UP);
184  this->registerEvent(KeyMapper::PEV_DOWN);
185  this->registerEvent(KeyMapper::PEV_FIRE1);
186  this->registerEvent(KeyMapper::PEV_NEXT_WEAPON);
187  this->registerEvent(KeyMapper::PEV_PREVIOUS_WEAPON);
188  this->registerEvent(EV_MOUSE_MOTION);
189
190  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
191
192  // WEAPON_MANAGER configuration
193  this->getWeaponManager().setSlotCount(5);
194
195  this->getWeaponManager().setSlotPosition(0, Vector(-0.28, 1.186, -2.750), &this->wingNodeLeft);
196  this->getWeaponManager().setSlotCapability(0, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
197
198  this->getWeaponManager().setSlotPosition(1, Vector(-0.28, 1.186, 2.750), &this->wingNodeRight);
199  this->getWeaponManager().setSlotCapability(1, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
200
201  this->getWeaponManager().setSlotPosition(2, Vector(-1.63, .809, -.003));
202  this->getWeaponManager().setSlotCapability(2, WTYPE_HEAVY);
203
204  /// TODO: THESE ARE TOO MUCH
205  this->getWeaponManager().setSlotPosition(3, Vector(-1.63, .678, -.652));
206  this->getWeaponManager().setSlotDirection(3, Quaternion(-24/180 * M_PI, Vector(1,0,0)));
207
208  this->getWeaponManager().setSlotPosition(4, Vector(-1.63, .678, .652));
209  this->getWeaponManager().setSlotDirection(4, Quaternion(24/180 * M_PI, Vector(1,0,0)));
210
211  this->cameraNode.setRelCoor(1,5,0);
212  this->getWeaponManager().getFixedTarget()->setParent(&this->cameraNode);
213  this->getWeaponManager().getFixedTarget()->setRelCoor(1000,0,0);
214
215  registerVar( new SynchronizeableBool( &bForward, &bForward, "bForward", PERMISSION_OWNER ) );
216  registerVar( new SynchronizeableBool( &bBackward, &bBackward, "bBackward", PERMISSION_OWNER ) );
217  registerVar( new SynchronizeableBool( &bLeft, &bLeft, "bLeft", PERMISSION_OWNER ) );
218  registerVar( new SynchronizeableBool( &bRight, &bRight, "bRight", PERMISSION_OWNER ) );
219  registerVar( new SynchronizeableBool( &bAscend, &bAscend, "bAscend", PERMISSION_OWNER ) );
220  registerVar( new SynchronizeableBool( &bDescend, &bDescend, "bDescend", PERMISSION_OWNER ) );
221  registerVar( new SynchronizeableQuaternion( &direction, &direction, "direction", PERMISSION_OWNER ) );
222  registerVar( new SynchronizeableFloat( &cameraLook, &cameraLook, "cameraLook", PERMISSION_OWNER ) );
223  registerVar( new SynchronizeableFloat( &rotation, &rotation, "rotation", PERMISSION_OWNER ) );
224}
225
226/**
227 * @brief loads the Settings of a TurbineHover from an XML-element.
228 * @param root the XML-element to load the Spaceship's properties from
229 */
230void TurbineHover::loadParams(const TiXmlElement* root)
231{
232  Playable::loadParams(root);
233}
234
235
236void TurbineHover::setBoostColor(const Color& color)
237{
238  printf("color:: "), color.debug();
239  this->burstSystem->setColor(0.0, color);
240  this->burstSystem->setColor(0.2, color * 0.6);
241  this->burstSystem->setColor(0.5, color * .3 + Color(0.5, 0.5, 0.8, 0.3));
242  this->burstSystem->setColor(1.0, 0.8, 0.8, 0.8, 0.0);
243}
244
245void TurbineHover::setPlayDirection(const Quaternion& rot, float speed)
246{
247  this->direction = Quaternion (rot.getHeading(), Vector(0,1,0));
248}
249
250void TurbineHover::enter()
251{
252  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( true);
253
254  if (State::getCameraNode != NULL)
255  {
256    State::getCameraNode()->setParentSoft(&this->cameraNode);
257    State::getCameraNode()->setRelCoorSoft(-10, 0,0);
258    State::getCameraTargetNode()->setParentSoft(&this->cameraNode);
259  }
260}
261
262void TurbineHover::leave()
263{
264  dynamic_cast<Element2D*>(this->getWeaponManager().getFixedTarget())->setVisibility( false);
265  this->detachCamera();
266
267}
268
269void TurbineHover::setTeam(int teamID)
270{
271  printf("::::::::::::::::: TEAM ::: %d\n", teamID);
272  if (teamID == 0)
273    this->setBoostColor(Color::blue);
274  else if (teamID == 1)
275    this->setBoostColor(Color::red);
276}
277
278
279
280/**
281 * @brief effect that occurs after the TurbineHover is spawned
282*/
283void TurbineHover::postSpawn ()
284{
285  //setCollision(new CollisionCluster(1.0, Vector(0,0,0)));
286}
287
288/**
289 * @brief the action occuring if the turbine_hover left the game
290*/
291void TurbineHover::leftWorld ()
292{}
293
294/**
295 * @brief this function is called, when two entities collide
296 * @param entity: the world entity with whom it collides
297 *
298 * Implement behaviour like damage application or other miscellaneous collision stuff in this function
299 */
300void TurbineHover::collidesWith(WorldEntity* entity, const Vector& location)
301{
302  Playable::collidesWith(entity, location);
303}
304
305
306
307/**
308 * @brief the function called for each passing timeSnap
309 * @param time The timespan passed since last update
310*/
311void TurbineHover::tick (float dt)
312{
313  //  this->debugNode(1);
314  Playable::tick(dt);
315
316  // spaceship controlled movement
317
318  // TRYING TO FIX PNode.
319  //this->cameraNode.setRelCoor(Vector(0.0f, 5.0f, 0.0f));//, 30.0f);
320  //this->cameraNode.setRelDir(Quaternion(this->smoothRotator  *10.0, Vector(0,1,0)));
321
322  this->movement(dt);
323  this->rotorCycle += this->rotorSpeed * dt;
324}
325
326
327#include "shared_network_data.h"
328
329/**
330 * @brief calculate the velocity
331 * @param time the timeslice since the last frame
332*/
333void TurbineHover::movement (float dt)
334{
335  Vector accel(0.0, 0.0, 0.0);
336
337  if( this->bForward )
338  {
339    accel += Vector(this->acceleration, 0, 0);
340  }
341
342  if( this->bBackward )
343  {
344    accel -= Vector(this->acceleration, 0, 0);
345  }
346  if( this->bLeft)
347  {
348    accel -= Vector(0, 0, this->acceleration);
349  }
350
351  if( this->bRight)
352  {
353    accel += Vector(0, 0, this->acceleration);
354  }
355
356  if (this->bAscend )
357  {
358    accel += Vector(0, this->acceleration, 0);
359  }
360  if (this->bDescend )
361  {
362    accel -= Vector(0, this->acceleration, 0);
363  }
364
365  switch(this->getPlaymode())
366  {
367    case Playable::Full3D:
368      {
369        Vector accelerationDir = this->getAbsDir().apply(accel * this->acceleration);
370
371        // this is the air friction (necessary for a smooth control)
372        Vector damping = (this->velocity * this->airFriction);
373
374
375        this->velocity += (accelerationDir - damping)* dt;
376        //if (this->getOwner() != SharedNetworkData::getInstance()->getHostID())
377          this->shiftCoor (this->velocity * dt);
378
379        // limit the maximum rotation speed.
380        if (this->rotation != 0.0f)
381        {
382          float maxRot = 10.0 * dt;
383          if (unlikely(this->rotation > maxRot)) this->rotation = maxRot;
384          if (unlikely(this->rotation < -maxRot)) this->rotation = -maxRot;
385          this->direction *= Quaternion(-M_PI/4.0*this->rotation, Vector(0,1,0));
386
387          this->rotation = 0.0f;
388        }
389
390        //if (this->getOwner() != SharedNetworkData::getInstance()->getHostID())
391          this->setRelDirSoft(this->direction * Quaternion(-cameraLook, Vector(0,0,1)), 5);
392
393        this->wingNodeLeft.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
394        this->rotorNodeLeft.setRelDirSoft(Quaternion(-accel.x * .07+this->rotation + cameraLook, Vector(0,0,1)), 5);
395
396        this->wingNodeRight.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
397        this->rotorNodeRight.setRelDirSoft(Quaternion(-accel.x*.07 -this->rotation + cameraLook, Vector(0,0,1)), 5);
398      }
399      break;
400
401    case Playable::Horizontal:
402      {
403        accel.y = 0.0;
404        Vector accelerationDir = this->getAbsDir().apply(accel * this->acceleration);
405        accelerationDir.y = 0.0;
406
407        // this is the air friction (necessary for a smooth control)
408        Vector damping = (this->velocity * this->airFriction);
409
410
411        this->velocity += (accelerationDir - damping)* dt;
412        this->shiftCoor (this->velocity * dt);
413
414        // limit the maximum rotation speed.
415        if (this->rotation != 0.0f)
416        {
417          float maxRot = 10.0 * dt;
418          if (unlikely(this->rotation > maxRot)) this->rotation = maxRot;
419          if (unlikely(this->rotation < -maxRot)) this->rotation = -maxRot;
420          this->direction *= Quaternion(-M_PI/4.0*this->rotation, Vector(0,1,0));
421
422          this->rotation = 0.0f;
423        }
424
425        this->setRelDirSoft(this->direction, 5);
426
427        this->wingNodeLeft.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
428        this->rotorNodeLeft.setRelDirSoft(Quaternion(-accel.x * .07+this->rotation, Vector(0,0,1)), 5);
429
430        this->wingNodeRight.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
431        this->rotorNodeRight.setRelDirSoft(Quaternion(-accel.x*.07 -this->rotation, Vector(0,0,1)), 5);
432      }
433      break;
434
435    case Playable::Vertical:
436      {
437        accel.z = 0;
438        Vector accelerationDir = this->getAbsDir().apply(accel * this->acceleration);
439        accelerationDir.z=0;
440
441        // this is the air friction (necessary for a smooth control)
442        Vector damping = (this->velocity * this->airFriction);
443
444        this->velocity += (accelerationDir - damping)* dt;
445        this->shiftCoor (this->velocity * dt);
446
447        this->setRelDirSoft(this->direction * Quaternion(-cameraLook, Vector(0,0,1)), 5);
448
449        this->wingNodeLeft.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
450        this->rotorNodeLeft.setRelDirSoft(Quaternion(-accel.x * .07+this->rotation + cameraLook, Vector(0,0,1)), 5);
451
452        this->wingNodeRight.setRelDirSoft(Quaternion(accel.z * .05 +this->rotation, Vector(1,0,0)), 5);
453        this->rotorNodeRight.setRelDirSoft(Quaternion(-accel.x*.07 -this->rotation + cameraLook, Vector(0,0,1)), 5);
454      }
455      break;
456    default:
457      PRINTF(2)("Playmode %s Not Implemented\n", Playable::playmodeToString(this->getPlaymode()).c_str());
458  }
459}
460
461
462void TurbineHover::draw() const
463{
464  Vector tmpRot;
465  WorldEntity::draw();
466
467  glPushMatrix();
468  /// LEFT SIDE
469  glTranslatef (this->wingNodeLeft.getAbsCoor ().x,
470                this->wingNodeLeft.getAbsCoor ().y,
471                this->wingNodeLeft.getAbsCoor ().z);
472  tmpRot = this->wingNodeLeft.getAbsDir().getSpacialAxis();
473  glRotatef (this->wingNodeLeft.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
474  this->getModel(3)->draw();
475  glPopMatrix ();
476
477  glPushMatrix();
478  glTranslatef (this->rotorNodeLeft.getAbsCoor ().x,
479                this->rotorNodeLeft.getAbsCoor ().y,
480                this->rotorNodeLeft.getAbsCoor ().z);
481  tmpRot = this->rotorNodeLeft.getAbsDir().getSpacialAxis();
482  glRotatef (this->rotorNodeLeft.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
483  this->getModel(4)->draw();
484  glRotatef(this->rotorCycle, 0,1,0);
485  this->getModel(5)->draw();
486  glPopMatrix ();
487
488  /// RIGHT SIDE
489  glPushMatrix();
490  glTranslatef (this->wingNodeRight.getAbsCoor ().x,
491                this->wingNodeRight.getAbsCoor ().y,
492                this->wingNodeRight.getAbsCoor ().z);
493  tmpRot = this->wingNodeRight.getAbsDir().getSpacialAxis();
494  glRotatef (this->wingNodeRight.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
495  glScalef(1,1,-1);
496  this->getModel(3)->draw();
497  glPopMatrix ();
498
499  glPushMatrix();
500  glTranslatef (this->rotorNodeRight.getAbsCoor ().x,
501                this->rotorNodeRight.getAbsCoor ().y,
502                this->rotorNodeRight.getAbsCoor ().z);
503  tmpRot = this->rotorNodeRight.getAbsDir().getSpacialAxis();
504  glRotatef (this->rotorNodeRight.getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
505  glScalef(1,1,-1);
506  this->getModel(4)->draw();
507  glRotatef(this->rotorCycle, 0,1,0);
508  this->getModel(5)->draw();
509  glPopMatrix ();
510}
511
512/**
513 * @todo switch statement ??
514 */
515void TurbineHover::process(const Event &event)
516{
517  Playable::process(event);
518
519  if( event.type == KeyMapper::PEV_LEFT)
520    this->bLeft = event.bPressed;
521  else if( event.type == KeyMapper::PEV_RIGHT)
522    this->bRight = event.bPressed;
523  else if( event.type == KeyMapper::PEV_UP)
524    this->bAscend = event.bPressed; //this->shiftCoor(0,.1,0);
525  else if( event.type == KeyMapper::PEV_DOWN)
526    this->bDescend = event.bPressed; //this->shiftCoor(0,-.1,0);
527  else if( event.type == KeyMapper::PEV_FORWARD)
528    this->bForward = event.bPressed; //this->shiftCoor(0,.1,0);
529  else if( event.type == KeyMapper::PEV_BACKWARD)
530    this->bBackward = event.bPressed; //this->shiftCoor(0,-.1,0);
531  else if( event.type == EV_MOUSE_MOTION)
532  {
533    float xMouse, yMouse;
534    xMouse = event.xRel*mouseSensitivity;
535    yMouse = event.yRel*mouseSensitivity;
536
537    // rotate the Player around the y-axis
538    this->rotation += xMouse;
539
540    this->cameraLook += yMouse;
541    // rotate the Camera around the z-axis
542    if (cameraLook > M_PI_4)
543      cameraLook = M_PI_4;
544    else if (cameraLook < -M_PI_4)
545      cameraLook = -M_PI_4;
546    //this->cameraNode.setRelDirSoft(this->direction,10);
547  }
548}
Note: See TracBrowser for help on using the repository browser.