Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

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

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

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

File size: 9.7 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: Christian Meyer
14*/
15
16#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_WORLD_ENTITY
17
18
19#include "executor/executor.h"
20#include "player.h"
21
22#include "track_manager.h"
23#include "objModel.h"
24#include "resource_manager.h"
25#include "factory.h"
26
27#include "weapons/weapon_manager.h"
28#include "weapons/test_gun.h"
29#include "weapons/turret.h"
30#include "weapons/cannon.h"
31
32#include "list.h"
33
34#include "event_handler.h"
35
36#include "event.h"
37
38using namespace std;
39
40CREATE_FACTORY(Player, CL_PLAYER);
41
42/**
43 * creates a new Player
44 * @param isFree if the player is free
45*/
46Player::Player()
47{
48  this->init();
49}
50
51/**
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)
56{
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());
67}
68
69/**
70 *  creates a new Player from Xml Data
71 * @param root the xml element containing player data
72
73   @todo add more parameters to load
74*/
75Player::Player(const TiXmlElement* root)
76{
77  this->init();
78  if (root != NULL)
79    this->loadParams(root);
80
81  //weapons:
82  Weapon* wpRight = new TestGun(0);
83  wpRight->setName("testGun Right");
84  Weapon* wpLeft = new TestGun(1);
85  wpLeft->setName("testGun Left");
86  Weapon* cannon = dynamic_cast<Weapon*>(Factory::getFirst()->fabricate(CL_CANNON));
87
88  cannon->setName("BFG");
89
90  this->weaponMan->addWeapon(wpLeft, 1, 0);
91  this->weaponMan->addWeapon(wpRight,1 ,1);
92  this->weaponMan->addWeapon(cannon, 0, 6);
93
94  //this->weaponMan->addWeapon(turret, 3, 0);
95
96  this->weaponMan->changeWeaponConfig(1);
97}
98
99/**
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
111//#include "glgui_pushbutton.h"
112
113/**
114 * initializes a Player
115 */
116void Player::init()
117{
118//  this->setRelDir(Quaternion(M_PI, Vector(1,0,0)));
119  this->setClassID(CL_PLAYER, "Player");
120
121  PRINTF(4)("PLAYER INIT\n");
122  travelSpeed = 15.0;
123  bUp = bDown = bLeft = bRight = bAscend = bDescend = false;
124  bFire = false;
125  acceleration = 10.0;
126
127//   GLGuiButton* button = new GLGuiPushButton();
128//   button->show();
129//   button->setLabel("orxonox");
130//   button->setBindNode(this);
131
132  this->weaponMan = new WeaponManager(this);
133  this->weaponMan->setSlotCount(7);
134
135  this->weaponMan->setSlotPosition(0, Vector(-2.6, .1, -3.0));
136  this->weaponMan->setSlotCapability(0, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
137
138  this->weaponMan->setSlotPosition(1, Vector(-2.6, .1, 3.0));
139  this->weaponMan->setSlotCapability(1, WTYPE_ALLDIRS | WTYPE_DIRECTIONAL);
140
141  this->weaponMan->setSlotPosition(2, Vector(-1.5, .5, -.5));
142  this->weaponMan->setSlotDirection(2, Quaternion(-M_PI_4*.5, Vector(1,0,0)));
143
144  this->weaponMan->setSlotPosition(3, Vector(-1.5, .5, .5));
145  this->weaponMan->setSlotDirection(3, Quaternion(M_PI_4*.5, Vector(1,0,0)));
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)));
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)));:
161
162}
163
164
165/**
166 * loads the Settings of a Player from an XML-element.
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/**
178 * adds a weapon to the weapon list of player
179 * @param weapon to add
180*/
181void Player::addWeapon(Weapon* weapon)
182{
183  this->weaponMan->addWeapon(weapon);
184}
185
186
187/**
188 *  removes a weapon from the player
189 * @param weapon to remove
190*/
191void Player::removeWeapon(Weapon* weapon)
192{
193  this->weaponMan->removeWeapon(weapon);
194}
195
196
197/**
198 *  effect that occurs after the player is spawned
199*/
200void Player::postSpawn ()
201{
202  //setCollision(new CollisionCluster(1.0, Vector(0,0,0)));
203}
204
205
206/**
207 *  the action occuring if the player left the game
208*/
209void Player::leftWorld ()
210{}
211
212
213WorldEntity* ref = NULL;
214/**
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)
221{
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);
228}
229
230/**
231 *  draws the player after transforming him.
232*/
233void Player::draw () const
234{
235  glMatrixMode(GL_MODELVIEW);
236  glPushMatrix();
237  /* translate */
238  glTranslatef (this->getAbsCoor ().x,
239                this->getAbsCoor ().y,
240                this->getAbsCoor ().z);
241  /* rotate */
242  Vector tmpRot = this->getAbsDir().getSpacialAxis();
243  glRotatef (this->getAbsDir().getSpacialAxisAngle(), tmpRot.x, tmpRot.y, tmpRot.z );
244  this->model->draw();
245  glPopMatrix();
246
247  this->weaponMan->draw();
248
249  //this->debug(0);
250}
251
252
253/**
254 *  the function called for each passing timeSnap
255 * @param time The timespan passed since last update
256*/
257void Player::tick (float time)
258{
259  // player controlled movement
260  this->move(time);
261
262  this->weaponMan->tick(time);
263  // weapon system manipulation
264  this->weaponAction();
265}
266
267
268/**
269 *  action if player moves
270 * @param time the timeslice since the last frame
271*/
272void Player::move (float time)
273{
274  Vector accel(0.0, 0.0, 0.0);
275  Vector rot(0.0, 0.0, 0.0);
276  float rotVal = 0.0;
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
284  if( this->bUp && this->getRelCoor().x < 20)
285    accel += direction;
286  if( this->bDown && this->getRelCoor().x > -5)
287    accel -= direction;
288
289  if( this->bLeft && TrackManager::getInstance()->getWidth() > -this->getRelCoor().z*2)
290  {
291    accel -=(orthDirection);
292    rot +=Vector(1,0,0);
293    rotVal -= .4;
294  }
295  if( this->bRight && TrackManager::getInstance()->getWidth() > this->getRelCoor().z*2)
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
314  if( this->bAscend ) { /* FIXME */ }
315  if( this->bDescend) {/* FIXME */} /* @todo up and down player movement */
316
317  Vector move = accel * time *acceleration;
318
319/*  if (accel.z < 0)
320    this->setRelDirSoft(Quaternion(-.4, accel), 5);
321  else if (accel.z > 0)
322    this->setRelDirSoft(Quaternion(.4, accel), 5);
323  else*/
324  rot.normalize();
325  this->setRelDirSoft(Quaternion(rotVal, rot), 5);
326  this->shiftCoor (move);
327}
328
329
330/**
331 * weapon manipulation by the player
332*/
333void Player::weaponAction()
334{
335  if( this->bFire)
336    {
337      this->weaponMan->fire();
338    }
339}
340
341/**
342 * @todo switch statement ??
343 */
344void Player::process(const Event &event)
345{
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)
351      this->bRight= event.bPressed;
352  else if( event.type == KeyMapper::PEV_LEFT)
353      this->bLeft = event.bPressed;
354  else if( event.type == KeyMapper::PEV_FIRE1)
355      this->bFire = event.bPressed;
356  else if( event.type == KeyMapper::PEV_NEXT_WEAPON && event.bPressed)
357    this->weaponMan->nextWeaponConfig();//if( !event.bPressed) this->bWeaponChange = !this->bWeaponChange;
358  else if ( event.type == KeyMapper::PEV_PREVIOUS_WEAPON && event.bPressed)
359    this->weaponMan->previousWeaponConfig();
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);
365}
366
367#include "weapons/aiming_turret.h"
368// FIXME THIS MIGHT BE CONSIDERED EITHER A FEATURE, OR A BUG
369void Player::ADDWEAPON()
370{
371  Weapon* turret = NULL;
372
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);
388
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  }
398}
Note: See TracBrowser for help on using the repository browser.