Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/trunk/src/world_entities/player.cc @ 5760

Last change on this file since 5760 was 5751, checked in by bensch, 19 years ago

orxonox/trunk: really cool hack, to let the fighter fly up and down :)

File size: 9.7 KB
RevLine 
[4592]1/*
[3471]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: Christian Meyer
14*/
15
[5357]16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
[3590]17
[5635]18
19#include "executor/executor.h"
[3471]20#include "player.h"
[3596]21
[3620]22#include "track_manager.h"
[3484]23#include "objModel.h"
[3655]24#include "resource_manager.h"
[5355]25#include "factory.h"
[4826]26
[5556]27#include "weapons/weapon_manager.h"
28#include "weapons/test_gun.h"
29#include "weapons/turret.h"
[5750]30#include "weapons/cannon.h"
[3471]31
[3620]32#include "list.h"
33
[4404]34#include "event_handler.h"
[4389]35
[4404]36#include "event.h"
[4287]37
[3471]38using namespace std;
39
[5750]40CREATE_FACTORY(Player, CL_PLAYER);
[4010]41
[3471]42/**
[4885]43 * creates a new Player
[4836]44 * @param isFree if the player is free
[3471]45*/
[4762]46Player::Player()
[3471]47{
[4780]48  this->init();
[3471]49}
50
51/**
[4975]52 * loads a Players information from a specified file.
53 * @param fileName the name of the File to load the player from (absolute path)
54 */
55Player::Player(const char* fileName)
[3471]56{
[4975]57  this->init();
58  TiXmlDocument doc(fileName);
59
60  if(!doc.LoadFile())
61  {
62    PRINTF(2)("Loading file %s failed for player.\n", fileName);
63    return;
64  }
65
66  this->loadParams(doc.RootElement());
[3583]67}
[3566]68
[4010]69/**
[4836]70 *  creates a new Player from Xml Data
71 * @param root the xml element containing player data
[4592]72
[4836]73   @todo add more parameters to load
[4010]74*/
[4780]75Player::Player(const TiXmlElement* root)
[4010]76{
[4780]77  this->init();
[5155]78  if (root != NULL)
79    this->loadParams(root);
[4597]80
[4010]81  //weapons:
[5750]82  Weapon* wpRight = new TestGun(0);
[4953]83  wpRight->setName("testGun Right");
[5750]84  Weapon* wpLeft = new TestGun(1);
[4953]85  wpLeft->setName("testGun Left");
[5750]86  Weapon* cannon = dynamic_cast<Weapon*>(Factory::getFirst()->fabricate(CL_CANNON));
[4592]87
[5750]88  cannon->setName("BFG");
89
[4953]90  this->weaponMan->addWeapon(wpLeft, 1, 0);
91  this->weaponMan->addWeapon(wpRight,1 ,1);
[5750]92  this->weaponMan->addWeapon(cannon, 0, 6);
93
[5041]94  //this->weaponMan->addWeapon(turret, 3, 0);
[4953]95
[5435]96  this->weaponMan->changeWeaponConfig(1);
[4010]97}
[3583]98
[4780]99/**
[4975]100 *  destructs the player, deletes alocated memory
101 */
102Player::~Player ()
103{
104  /* do not delete the weapons, they are contained in the pnode tree
105  and will be deleted there.
106  this only frees the memory allocated to save the list.
107  */
108  delete this->weaponMan;
109}
110
[5453]111//#include "glgui_pushbutton.h"
[5395]112
[4975]113/**
[4780]114 * initializes a Player
115 */
116void Player::init()
117{
[5037]118//  this->setRelDir(Quaternion(M_PI, Vector(1,0,0)));
[4780]119  this->setClassID(CL_PLAYER, "Player");
[5144]120
[5300]121  PRINTF(4)("PLAYER INIT\n");
[4780]122  travelSpeed = 15.0;
123  bUp = bDown = bLeft = bRight = bAscend = bDescend = false;
124  bFire = false;
125  acceleration = 10.0;
[4834]126
[5453]127//   GLGuiButton* button = new GLGuiPushButton();
128//   button->show();
129//   button->setLabel("orxonox");
130//   button->setBindNode(this);
[4834]131
[4953]132  this->weaponMan = new WeaponManager(this);
[5750]133  this->weaponMan->setSlotCount(7);
[5064]134
[4953]135  this->weaponMan->setSlotPosition(0, Vector(-2.6, .1, -3.0));
[5441]136  this->weaponMan->setSlotCapability(0, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
[5064]137
[4953]138  this->weaponMan->setSlotPosition(1, Vector(-2.6, .1, 3.0));
[5441]139  this->weaponMan->setSlotCapability(1, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
[5064]140
[4969]141  this->weaponMan->setSlotPosition(2, Vector(-1.5, .5, -.5));
142  this->weaponMan->setSlotDirection(2, Quaternion(-M_PI_4*.5, Vector(1,0,0)));
[5064]143
[4969]144  this->weaponMan->setSlotPosition(3, Vector(-1.5, .5, .5));
145  this->weaponMan->setSlotDirection(3, Quaternion(M_PI_4*.5, Vector(1,0,0)));
[5064]146
147  this->weaponMan->setSlotPosition(4, Vector(-1.5, -.5, .5));
148  this->weaponMan->setSlotDirection(4, Quaternion(-M_PI_4*.5+M_PI, Vector(1,0,0)));
149
150  this->weaponMan->setSlotPosition(5, Vector(-1.5, -.5, -.5));
151  this->weaponMan->setSlotDirection(5, Quaternion(+M_PI_4*.5-M_PI, Vector(1,0,0)));
[5750]152//
153   this->weaponMan->setSlotPosition(6, Vector(-1, 0.0, 0));
154   this->weaponMan->setSlotCapability(6, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
155   //
156//   this->weaponMan->setSlotPosition(8, Vector(-2.5, -0.3, -2.0));
157//   this->weaponMan->setSlotDirection(8, Quaternion(-M_PI, Vector(1,0,0)));
158//
159//   this->weaponMan->setSlotPosition(9, Vector(-2.5, -0.3, 2.0));
160//   this->weaponMan->setSlotDirection(9, Quaternion(+M_PI, Vector(1,0,0)));:
[5064]161
[4780]162}
163
164
[3583]165/**
[4885]166 * loads the Settings of a Player from an XML-element.
[4780]167 * @param root the XML-element to load the Player's properties from
168 */
169void Player::loadParams(const TiXmlElement* root)
170{
171  static_cast<WorldEntity*>(this)->loadParams(root);
172
173
174
175}
176
177/**
[4885]178 * adds a weapon to the weapon list of player
[4836]179 * @param weapon to add
[3583]180*/
181void Player::addWeapon(Weapon* weapon)
182{
[3878]183  this->weaponMan->addWeapon(weapon);
[3471]184}
185
[3583]186
[3471]187/**
[4836]188 *  removes a weapon from the player
189 * @param weapon to remove
[3583]190*/
191void Player::removeWeapon(Weapon* weapon)
192{
[3878]193  this->weaponMan->removeWeapon(weapon);
[3583]194}
195
196
197/**
[4836]198 *  effect that occurs after the player is spawned
[3471]199*/
200void Player::postSpawn ()
201{
[3474]202  //setCollision(new CollisionCluster(1.0, Vector(0,0,0)));
[3471]203}
204
[3584]205
[3471]206/**
[4836]207 *  the action occuring if the player left the game
[3471]208*/
[3584]209void Player::leftWorld ()
210{}
[3471]211
[3584]212
[5435]213WorldEntity* ref = NULL;
[3471]214/**
[5435]215 *  this function is called, when two entities collide
216 * @param entity: the world entity with whom it collides
217 *
218 * Implement behaviour like damage application or other miscellaneous collision stuff in this function
219 */
220void Player::collidesWith(WorldEntity* entity, const Vector& location)
[3471]221{
[5435]222  if (entity->isA(CL_TURRET_POWER_UP) && entity != ref)
223  {
224    this->ADDWEAPON();
225    ref = entity;
226    }
227//  PRINTF(3)("collision %s vs %s @ (%f,%f,%f)\n", this->getClassName(), entity->getClassName(), location.x, location.y, location.z);
[3471]228}
229
[4592]230/**
[4836]231 *  draws the player after transforming him.
[3471]232*/
[5500]233void Player::draw () const
[4592]234{
[3471]235  glMatrixMode(GL_MODELVIEW);
[3526]236  glPushMatrix();
[3471]237  /* translate */
[4592]238  glTranslatef (this->getAbsCoor ().x,
239                this->getAbsCoor ().y,
240                this->getAbsCoor ().z);
[3471]241  /* rotate */
[4998]242  Vector tmpRot = this->getAbsDir().getSpacialAxis();
243  glRotatef (this->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
[3471]244  this->model->draw();
[3526]245  glPopMatrix();
[3750]246
[3877]247  this->weaponMan->draw();
[4994]248
249  //this->debug(0);
[3471]250}
251
252
253/**
[4836]254 *  the function called for each passing timeSnap
255 * @param time The timespan passed since last update
[3471]256*/
[3584]257void Player::tick (float time)
[3471]258{
[4885]259  // player controlled movement
260  this->move(time);
[4592]261
[3877]262  this->weaponMan->tick(time);
[3584]263  // weapon system manipulation
[4885]264  this->weaponAction();
[3471]265}
266
[3584]267
[3471]268/**
[4836]269 *  action if player moves
270 * @param time the timeslice since the last frame
[3471]271*/
272void Player::move (float time)
273{
274  Vector accel(0.0, 0.0, 0.0);
[5751]275  Vector rot(0.0, 0.0, 0.0);
276  float rotVal = 0.0;
[3471]277  /* FIXME: calculating the direction and orthDirection every timeSlice is redundant! save it somewhere */
278  /* calculate the direction in which the craft is heading  */
279  Vector direction (1.0, 0.0, 0.0);
280  //direction = this->absDirection.apply (direction);
281  Vector orthDirection (0.0, 0.0, 1.0);
282  //orthDirection = orthDirection.cross (direction);
283
[3966]284  if( this->bUp && this->getRelCoor().x < 20)
[5751]285    accel += direction;
[3966]286  if( this->bDown && this->getRelCoor().x > -5)
[5751]287    accel -= direction;
288
[5483]289  if( this->bLeft && TrackManager::getInstance()->getWidth() > -this->getRelCoor().z*2)
[5751]290  {
291    accel -=(orthDirection);
292    rot +=Vector(1,0,0);
293    rotVal -= .4;
294  }
[5483]295  if( this->bRight && TrackManager::getInstance()->getWidth() > this->getRelCoor().z*2)
[5751]296  {
297    accel += orthDirection;
298    rot += Vector(1,0,0);
299    rotVal += .4;
300  }
301  if (this->bAscend )
302  {
303    accel += Vector(0,1,0);
304    rot += Vector(0,0,1);
305    rotVal += .4;
306  }
307  if (this->bDescend )
308  {
309    accel -= Vector(0,1,0);
310    rot += Vector(0,0,1);
311    rotVal -= .4;
312  }
313
[4885]314  if( this->bAscend ) { /* FIXME */ }
[4836]315  if( this->bDescend) {/* FIXME */} /* @todo up and down player movement */
[3471]316
[5751]317  Vector move = accel * time *acceleration;
[5483]318
[5751]319/*  if (accel.z < 0)
320    this->setRelDirSoft(Quaternion(-.4, accel), 5);
[5483]321  else if (accel.z > 0)
[5751]322    this->setRelDirSoft(Quaternion(.4, accel), 5);
323  else*/
324  rot.normalize();
325  this->setRelDirSoft(Quaternion(rotVal, rot), 5);
[3811]326  this->shiftCoor (move);
[3471]327}
[3584]328
329
330/**
[4885]331 * weapon manipulation by the player
[3584]332*/
[4885]333void Player::weaponAction()
[3584]334{
[3618]335  if( this->bFire)
[3584]336    {
[3875]337      this->weaponMan->fire();
[3584]338    }
339}
340
341/**
[4781]342 * @todo switch statement ??
343 */
[4404]344void Player::process(const Event &event)
345{
[4409]346  if( event.type == KeyMapper::PEV_UP)
347      this->bUp = event.bPressed;
348  else if( event.type == KeyMapper::PEV_DOWN)
349      this->bDown = event.bPressed;
350  else if( event.type == KeyMapper::PEV_RIGHT)
[4413]351      this->bRight= event.bPressed;
[4409]352  else if( event.type == KeyMapper::PEV_LEFT)
[4413]353      this->bLeft = event.bPressed;
[4412]354  else if( event.type == KeyMapper::PEV_FIRE1)
[4885]355      this->bFire = event.bPressed;
[4952]356  else if( event.type == KeyMapper::PEV_NEXT_WEAPON && event.bPressed)
[4954]357    this->weaponMan->nextWeaponConfig();//if( !event.bPressed) this->bWeaponChange = !this->bWeaponChange;
[4952]358  else if ( event.type == KeyMapper::PEV_PREVIOUS_WEAPON && event.bPressed)
359    this->weaponMan->previousWeaponConfig();
[5751]360
361  else if( event.type == SDLK_PAGEUP)
362    this->bAscend = event.bPressed; //this->shiftCoor(0,.1,0);
363  else if( event.type == SDLK_PAGEDOWN)
364    this->bDescend = event.bPressed; //this->shiftCoor(0,-.1,0);
[4404]365}
[5435]366
[5750]367#include "weapons/aiming_turret.h"
[5435]368// FIXME THIS MIGHT BE CONSIDERED EITHER A FEATURE, OR A BUG
369void Player::ADDWEAPON()
370{
[5750]371  Weapon* turret = NULL;
[5435]372
[5750]373  if ((float)rand()/RAND_MAX < .1)
374  {
375    //if (this->weaponMan->hasFreeSlot(2, WTYPE_TURRET))
376    {
377      turret = new Turret();
378      this->weaponMan->addWeapon(turret, 2);
379      this->weaponMan->changeWeaponConfig(2);
380    }
381  }
382  else
383  {
384    //if (this->weaponMan->hasFreeSlot(3))
385    {
386      turret = new AimingTurret();
387      this->weaponMan->addWeapon(turret, 3);
[5435]388
[5750]389      this->weaponMan->changeWeaponConfig(3);
390    }
391  }
392
393  if(turret != NULL)
394  {
395    turret->setName("Turret");
396    turret->setStateDuration(WS_SHOOTING, (float)rand()/RAND_MAX*.5+.1);
397  }
[5435]398}
Note: See TracBrowser for help on using the repository browser.