Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: orxonox.OLD/branches/playability/src/util/hud.cc @ 10332

Last change on this file since 10332 was 10332, checked in by muellmic, 17 years ago

in this version the acid splasher isn't loaded anymore. it then doesn't crash when shooting.

File size: 14.4 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//#define DEBUG_SPECIAL_MODULE DEBUG_MODULE_
17
18#include "hud.h"
19
20#include "state.h"
21#include "debug.h"
22
23#include "world_entities/weapons/weapon_manager.h"
24#include "glgui_widget.h"
25#include "glgui_box.h"
26#include "glgui_bar.h"
27#include "elements/glgui_energywidgetvertical.h"
28
29#include "glgui_inputline.h"
30#include "specials/glgui_notifier.h"
31#include "elements/glgui_radar.h"
32#include "world_entities/space_ships/space_ship.h"
33
34
35
36/// HACK
37#include "player.h"
38#include "playable.h"
39
40ObjectListDefinition(Hud);
41/**
42 * standard constructor
43 * @todo this constructor is not jet implemented - do it
44*/
45Hud::Hud ()
46{
47  this->registerObject(this, Hud::_objectList);
48
49  //this->setSize2D(
50  this->weaponManager = NULL;
51  this->weaponManagerSecondary = NULL;
52  this->energyWidget = NULL;
53  this->shieldWidget = NULL;
54  this->armorWidget = NULL;
55  //this->leftRect = NULL;
56  //this->rightRect = NULL;
57  this->resX = 1;
58  this->resY = 1;
59
60  this->overlayPercentage = 40;
61  this->overlayActive = false;
62  this->rightRect = new OrxGui::GLGuiImage();
63  this->leftRect = new OrxGui::GLGuiImage();
64
65  this->inputLine = new OrxGui::GLGuiInputLine();
66  this->inputLine->setParent2D(this);
67  this->notifier = new OrxGui::GLGuiNotifier();
68  this->notifier->setParent2D(this);
69  notifier->setAbsCoor2D(100,100);
70
71  this->_radar = new OrxGui::GLGuiRadar();
72  this->radarCenterNode = NULL;
73
74  this->subscribeEvent(ES_ALL, EV_VIDEO_RESIZE);
75  this->subscribeEvent(ES_ALL, SDLK_TAB);
76
77  //this->shipValuesBox = NULL;
78}
79
80
81/**
82 * standard deconstructor
83*/
84Hud::~Hud ()
85{
86  delete this->inputLine;
87  delete this->notifier;
88
89  delete this->_radar;
90  delete this->rightRect;
91  delete this->leftRect;
92  //if (this->shipValuesBox != NULL)
93    //delete this->shipValuesBox;
94
95  // delete what has to be deleted here
96}
97
98
99void Hud::loadParams(const TiXmlElement* root)
100{
101  Element2D::loadParams(root);
102}
103
104void Hud::notifyUser(const std::string& message)
105{
106  this->notifier->pushNotifyMessage(message);
107}
108
109void Hud::setBackGround()
110{}
111
112void Hud::setEnergyWidget(OrxGui::GLGuiWidget* widget)
113{
114  //if (this->shipValuesBox == NULL)
115    //this->createShipValuesBox();
116
117  // decopple old widget
118  if (this->energyWidget != NULL)
119  {
120    this->energyWidget->hide();
121  }
122
123  this->energyWidget = widget;
124  if (this->energyWidget != NULL)
125  {
126    //this->energyWidget->shiftDir2D(270);
127    //dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (this->energyWidget)->setDisplayedName("Electronics");
128    //this->shipValuesBox->pack(this->energyWidget);
129    //dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (this->energyWidget)->setStandardSettings();
130    this->energyWidget->setParent2D(this->leftRect);
131    this->energyWidget->show();
132    /*    this->energyWidget->frontMaterial().setDiffuseMap("hud_energy_bar.png");
133        this->energyWidget->frontMaterial().setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/
134  }
135
136  this->updateResolution();
137}
138
139void Hud::setShiledWidget(OrxGui::GLGuiWidget* widget)
140{
141  /*
142  if (this->shipValuesBox == NULL)
143    this->createShipValuesBox();
144  */
145
146  // decopple old widget
147  if (this->shieldWidget != NULL)
148  {
149    this->shieldWidget->hide();
150  }
151
152  this->shieldWidget = widget;
153  if (this->shieldWidget != NULL)
154  {
155    //this->shieldWidget->shiftDir2D(270);
156    //this->shipValuesBox->pack(this->shieldWidget);
157    //dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (this->shieldWidget)->setStandardSettings();
158    this->shieldWidget->setParent2D(this->leftRect);
159    this->shieldWidget->show();
160    /*    this->shieldWidget->frontMaterial().setDiffuseMap("hud_energy_bar.png");
161        this->shieldWidget->frontMaterial().setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/
162  }
163  else
164    printf("schild im hud nicht uebergeben!!!!!!!!!!!!!!!!!!!!!!!!!");
165
166  this->updateResolution();
167}
168
169void Hud::setArmorWidget(OrxGui::GLGuiWidget* widget)
170{
171  /*
172  if (this->shipValuesBox == NULL)
173    this->createShipValuesBox();
174  */
175
176// decopple old widget
177  if (this->armorWidget != NULL)
178  {
179    this->armorWidget->hide();
180  }
181
182  this->armorWidget = widget;
183  if (this->armorWidget != NULL)
184  {
185    //this->armorWidget->shiftDir2D(270);
186    //this->shipValuesBox->pack(this->armorWidget);
187    //dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (this->armorWidget)->setStandardSettings();
188    this->armorWidget->setParent2D(this->leftRect);
189    this->armorWidget->show();
190    /*    this->armorWidget->frontMaterial().setDiffuseMap("hud_energy_bar.png");
191        this->armorWidget->frontMaterial().setBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);*/
192  }
193
194  this->updateResolution();
195}
196
197void Hud::setWeaponManager(WeaponManager* weaponMan, WeaponManager* weaponManSec)
198{
199  //clearWeaponManager();
200
201  //Hide all widgets
202  if (this->weaponManager != NULL)
203  {
204    for (unsigned int i = 0; i < this->weaponManager->getSlotCount(); i++)
205    {
206      Weapon* weapon = this->weaponManager->getWeapon(i);
207      if (weapon != NULL)
208      {
209        weapon->getEnergyWidget()->hide();
210        //this->weaponsWidgetsPrim.remove(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
211      }
212    }
213  }
214
215  if (this->weaponManagerSecondary != NULL)
216  {
217    for (unsigned int i = 0; i < this->weaponManagerSecondary->getSlotCount(); i++)
218    {
219      Weapon* weapon = this->weaponManagerSecondary->getWeapon(i);
220      if (weapon != NULL)
221      {
222        weapon->getEnergyWidget()->hide();
223        //this->weaponsWidgetsSec.remove(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
224      }
225    }
226  }
227
228  this->weaponManager = weaponMan;
229  this->weaponManagerSecondary = weaponManSec; 
230
231  this->updateWeaponManager();
232  //  this->updateResolution();
233}
234
235/*
236void Hud::clearWeaponManager()
237{
238  //Hide all widgets
239  if (this->weaponManager != NULL)
240  {
241    for (unsigned int i = 0; i < this->weaponManager->getSlotCount(); i++)
242    {
243      Weapon* weapon = this->weaponManager->getWeapon(i);
244      if (weapon != NULL)
245      {
246        weapon->getEnergyWidget()->hide();
247        //this->weaponsWidgetsPrim.remove(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
248      }
249    }
250  }
251
252  if (this->weaponManagerSecondary != NULL)
253  {
254    for (unsigned int i = 0; i < this->weaponManagerSecondary->getSlotCount(); i++)
255    {
256      Weapon* weapon = this->weaponManagerSecondary->getWeapon(i);
257      if (weapon != NULL)
258      {
259        weapon->getEnergyWidget()->hide();
260        //this->weaponsWidgetsSec.remove(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
261      }
262    }
263  }
264
265  //this->weaponsWidgetsPrim.clear();
266  //this->weaponsWidgetsSec.clear();
267}
268*/
269
270void Hud::updateWeaponManager()
271{
272  // hide all the Widgets
273 
274  std::list<OrxGui::GLGuiEnergyWidgetVertical*>::iterator weaponWidget;
275  for (weaponWidget = this->weaponsWidgetsPrim.begin(); weaponWidget != this->weaponsWidgetsPrim.end(); weaponWidget++)
276  {
277    (*weaponWidget)->hide();
278  }
279  this->weaponsWidgetsPrim.clear();
280
281  for (weaponWidget = this->weaponsWidgetsSec.begin(); weaponWidget != this->weaponsWidgetsSec.end(); weaponWidget++)
282  {
283    (*weaponWidget)->hide();
284  }
285  this->weaponsWidgetsSec.clear();
286 
287
288  // add all that we need again.
289
290  if (this->weaponManager != NULL)
291    for (unsigned int i = 0; i < this->weaponManager->getSlotCount(); i++)
292    {
293      Weapon* weapon = this->weaponManager->getWeapon(i);
294      if (weapon != NULL)
295      {
296        //PRINTF(0)("WEAPON %s::%s in Slots\n", weapon->getClassCName(), weapon->getName());
297        weapon->getEnergyWidget()->setParent2D(this->rightRect);
298        weapon->getEnergyWidget()->show();
299        weapon->getEnergyWidget()->setBackgroundColor(Color(.8,.2,.11, 0.1));
300        weapon->getEnergyWidget()->setFrontColor(Color( .2,.5,.7,.6));
301        weapon->getEnergyWidget()->setWidgetSize(120,30);
302        //weapon->getEnergyWidget()->frontMaterial().setTransparency(.6);
303        this->weaponsWidgetsPrim.push_back(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
304      }
305    }
306
307  if (this->weaponManagerSecondary != NULL)
308    for (unsigned int i = 0; i < this->weaponManagerSecondary->getSlotCount(); i++)
309    {
310      Weapon* weapon = this->weaponManagerSecondary->getWeapon(i);
311      if (weapon != NULL)
312      {
313        //PRINTF(0)("WEAPON %s::%s in Slots\n", weapon->getClassCName(), weapon->getName());
314        weapon->getEnergyWidget()->setParent2D(this->rightRect);
315        weapon->getEnergyWidget()->show();
316        weapon->getEnergyWidget()->setBackgroundColor(Color(.8,.2,.11, 0.1));
317        weapon->getEnergyWidget()->setFrontColor(Color( .2,.5,.7,.6));
318        weapon->getEnergyWidget()->setWidgetSize(150,50);
319        //weapon->getEnergyWidget()->frontMaterial().setTransparency(.6);
320        this->weaponsWidgetsSec.push_back(dynamic_cast<OrxGui::GLGuiEnergyWidgetVertical*> (weapon->getEnergyWidget()));
321      }
322    }
323
324  this->updateResolution();
325
326}
327
328void Hud::addWeaponWidget(OrxGui::GLGuiWidget* widget)
329{}
330
331void Hud::removeWeaponWidget(OrxGui::GLGuiWidget* widget)
332{}
333
334void Hud::updateResolution()
335{
336  this->resX = State::getResX();
337  this->resY = State::getResY();
338
339  this->setSize2D(.2 * this->resX, this->resY);
340  this->notifier->setAbsCoor2D(0.7 * this->resX, 0.3 * this->resY);
341  this->notifier->setWidgetSize(0.25 * this->resX, 0.6 * this->resY);
342
343  int overlayWidth = this->resX * (overlayPercentage)/(200);
344  if (overlayWidth < 100)
345    overlayWidth = 100;
346
347  this->rightRect->hide();
348  this->leftRect->hide();
349
350  this->leftRect->setParent2D(this);
351  this->leftRect->setWidgetSize(float(overlayWidth), float(this->resY));
352  this->leftRect->setAbsCoor2D(0,0);
353  this->leftRect->setBackgroundTexture(Texture());
354  this->leftRect->setBackgroundColor(Color(0,0,0.7,0.2));
355  this->leftRect->setForegroundTexture(Texture());
356  this->leftRect->setForegroundColor(Color(0,0,0,0));
357
358  this->rightRect->setParent2D(this);
359  this->rightRect->setWidgetSize(float(overlayWidth), float(this->resY));
360  this->rightRect->setAbsCoor2D(this->resX - overlayWidth,0);
361  this->rightRect->setBackgroundTexture(Texture());
362  this->rightRect->setBackgroundColor(Color(0,0,0.7,0.2));
363  this->rightRect->setForegroundTexture(Texture());
364  this->rightRect->setForegroundColor(Color(0,0,0,0));
365
366
367  if (this->overlayActive == true)
368  {
369    this->rightRect->show();
370    this->leftRect->show();
371  }
372
373
374  if (State::getPlayer() && State::getPlayer()->getPlayable() && State::getObjectManager())
375  {
376    PRINTF(4)("UPDATING RADAR\n");
377    this->_radar->setParent2D(this->leftRect);
378    if (radarCenterNode == NULL)
379      this->_radar->setCenterNode(State::getPlayer()->getPlayable());
380    else
381      this->_radar->setCenterNode(this->radarCenterNode);
382
383    //this->_radar->addEntityList(&State::getObjectManager()->getEntityList((OM_LIST)(State::getPlayer()->getPlayable()->getOMListNumber()+1)), Color(.4, .4, 1.0));
384    this->_radar->addEntityList(&State::getObjectManager()->getEntityList(OM_GROUP_00), Color(1, 0, 0));
385    this->_radar->addEntityList(&State::getObjectManager()->getEntityList(OM_GROUP_01), Color(0, 0, 1));
386    this->_radar->setAbsCoor2D(0, 0.01 * this->resY);
387    this->_radar->setWidgetSize(0.18 * this->resX, 0.2 * this->resY);
388    this->_radar->setRange(300);
389    this->_radar->show();
390
391    if (this->armorWidget != NULL)
392      this->armorWidget->setRelCoor2D(100,0.2*this->resY + this->armorWidget->getSizeX2D());
393    if (this->shieldWidget != NULL)
394      this->shieldWidget->setRelCoor2D(60,0.2*this->resY + this->armorWidget->getSizeX2D());
395    if (this->energyWidget != NULL)
396      this->energyWidget->setRelCoor2D(20,0.2*this->resY + this->armorWidget->getSizeX2D());
397    //this->shieldWidget->setRelCoor2D(0.1*this->resX + this->armorWidget->getSizeX2D(),0);
398    //this->energyWidget->setRelCoor2D(0.1*this->resX + this->armorWidget->getSizeX2D() + this->shieldWidget->getSizeX2D(),0);
399  }
400
401  /*
402  if (this->shipValuesBox != NULL)
403  {
404    this->shipValuesBox->setAbsCoor2D(0.2 * this->resX, 0.4 * this->resY);
405    this->shipValuesBox->setWidgetSize(.4 * this->resX, 0.1 * this->resY);
406  }
407  else
408    createShipValuesBox();
409  */
410
411  std::list<OrxGui::GLGuiEnergyWidgetVertical*>::iterator weaponWidget;
412  Vector2D pos = Vector2D(overlayWidth, 0.4*this->resY);
413  //PRINTF(0)("Cur Pos: %f,%f\n",pos.x,pos.y);
414  // out of reasons i can't get behind, this version is segfaulting when calling getSizeX2D or getSizeY2D. the other
415  // element2D- related function works tough.. :s
416
417  for (weaponWidget = this->weaponsWidgetsPrim.begin(); weaponWidget != this->weaponsWidgetsPrim.end(); weaponWidget++)
418  {
419    float ySize = (*weaponWidget)->getSizeY2D();
420    if (pos.x < ySize)
421    {
422      pos.x = overlayWidth;
423      pos.y += (*weaponWidget)->getSizeX2D();
424    }
425    pos.x -= ySize;
426    (*weaponWidget)->setAbsCoor2D(pos.x + this->rightRect->getAbsCoor2D().x, pos.y);
427    //(*weaponWidget)->setAbsCoor2D(0,100);
428    (*weaponWidget)->show();
429    //printf("update thing %s::%s\n", (*weaponWidget)->getClassCName(), (*weaponWidget)->getName());
430  }
431
432  pos.y += 160;
433  pos.x = 0; //overlayWidth + this->rightRect->getAbsCoor2D().x;
434  for (weaponWidget = this->weaponsWidgetsSec.begin(); weaponWidget != this->weaponsWidgetsSec.end(); weaponWidget++)
435  {
436    float ySize = (*weaponWidget)->getSizeY2D();
437    if (pos.x < ySize)
438    {
439      pos.x = overlayWidth;
440      pos.y += (*weaponWidget)->getSizeX2D();
441    }
442    pos.x -= ySize;
443    PRINTF(0)("secweaponwidget y-size: %f/n", (*weaponWidget)->getSizeY2D());
444    (*weaponWidget)->setAbsCoor2D(pos.x + this->rightRect->getAbsCoor2D().x, pos.y);
445    (*weaponWidget)->show();
446    //printf("update thing %s::%s\n", (*weaponWidget)->getClassCName(), (*weaponWidget)->getName());
447  }
448
449}
450
451void Hud::draw() const
452{
453  //  GLGuiWidget::draw();
454}
455
456
457void Hud::process(const Event &event)
458{
459  if (event.type == EV_VIDEO_RESIZE)
460    this->updateResolution();
461  else if (event.type == SDLK_TAB)
462  {
463    /// TODO SHOW THE INPUT-LINE
464  //  this->inputLine->select();
465  }
466}
467
468/*
469void Hud::createShipValuesBox()
470{
471  this->shipValuesBox = new OrxGui::GLGuiBox(OrxGui::Vertical);
472  //this->shipValuesBox->setWidgetSize(1000,500);
473  //this->shipValuesBox->setBackgroundTexture("maps/gui_container_background.png");
474  this->shipValuesBox->setBackgroundTexture(Texture());
475  this->shipValuesBox->setBackgroundColor(Color(0,0,1,0.5));
476  this->shipValuesBox->setVisibility(true);
477}
478*/
479
480
Note: See TracBrowser for help on using the repository browser.