Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/fabienHS15/src/modules/overlays/hud/HUDWeaponMode.cc @ 10739

Last change on this file since 10739 was 10739, checked in by fvultier, 9 years ago

HUD improved. Corrected text rescaling. Renamed reload to shieldRecharge in Pawn.cc, … to avoid confusion with the weapon system.

File size: 10.0 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabien Vultier
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29#include "HUDWeaponMode.h"
30
31#include "core/CoreIncludes.h"
32#include "core/XMLPort.h"
33#include "util/Convert.h"
34#include "core/class/Super.h"
35
36namespace orxonox
37{
38    RegisterClass(HUDWeaponMode);
39
40    HUDWeaponMode::HUDWeaponMode(Context* context) : OrxonoxOverlay(context)
41    {
42        RegisterObject(HUDWeaponMode);
43
44        weaponIndex_ = 0;
45        weaponModeIndex_ = 0;
46
47        overlayElementIcon_ = static_cast<Ogre::PanelOverlayElement* >(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "HUDWeaponMode" + getUniqueNumberString()));
48        overlayElementIcon_->setPosition(0.0f,0.0f);
49        overlayElementIcon_->setDimensions(1.0f,1.0f);
50        this->background_->addChild(overlayElementIcon_);
51
52        overlayElementReplenish_ = static_cast<Ogre::PanelOverlayElement* >(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "HUDWeaponMode" + getUniqueNumberString()));
53        overlayElementReplenish_->setPosition(0.0f,0.0f);
54        overlayElementReplenish_->setDimensions(1.0f,1.0f);
55        this->background_->addChild(overlayElementReplenish_);
56
57        overlayElementMunition_ = static_cast<Ogre::PanelOverlayElement* >(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "HUDWeaponMode" + getUniqueNumberString()));
58        overlayElementMunition_->setPosition(0.0f,0.0f);
59        overlayElementMunition_->setDimensions(1.0f,1.0f);
60        this->background_->addChild(overlayElementMunition_);
61
62        overlayElementState_ = static_cast<Ogre::PanelOverlayElement* >(Ogre::OverlayManager::getSingleton().createOverlayElement("Panel", "HUDWeaponMode" + getUniqueNumberString()));
63        overlayElementState_->setPosition(0.0f,0.0f);
64        overlayElementState_->setDimensions(1.0f,1.0f);
65        this->background_->addChild(overlayElementState_);
66
67        overlayElementIcon_->show();
68        overlayElementReplenish_->show();
69        overlayElementMunition_->show();
70        overlayElementState_->show();
71
72        // Create two text overlays
73        this->textOverlayLeft_ = new OverlayText(this->getContext());
74        assert(this->textOverlayLeft_.get());
75        this->textOverlayLeft_->setCaption("???");
76        textOverlayLeft_->setPickPoint(Vector2(0.0f,0.0f));
77        textOverlayLeft_->setVisible(true);
78        textOverlayLeft_->setAlignment(OverlayText::Center);
79        textOverlayLeft_->setTextSize(0.02f);
80        textOverlayLeft_->setColour(ColourValue(0.21,0.70,0.21,1.0));
81        textOverlayLeft_->setAspectCorrection(false);
82        textOverlayLeft_->setZOrder(600);
83       
84        this->textOverlayRight_ = new OverlayText(this->getContext());
85        assert(this->textOverlayLeft_.get());
86        this->textOverlayRight_->setCaption("???");
87        textOverlayRight_->setPickPoint(Vector2(0.0f,0.0f));
88        textOverlayRight_->setVisible(true);
89        textOverlayRight_->setAlignment(OverlayText::Center);
90        textOverlayRight_->setTextSize(0.02f);
91        textOverlayRight_->setColour(ColourValue(0.21,0.70,0.21,1.0));
92        textOverlayRight_->setAspectCorrection(false);
93        textOverlayRight_->setZOrder(600);
94
95        materialNameState_ = "Orxonox/WSHUD_Reloading";
96
97        overlayElementReplenish_->setMaterialName("Orxonox/WSHUD_Replenish");
98    }
99
100    HUDWeaponMode::~HUDWeaponMode()
101    {
102        if (this->isInitialized())
103        {
104            this->textOverlayLeft_->destroy();
105            this->textOverlayRight_->destroy();
106        }
107    }
108
109    void HUDWeaponMode::XMLPort(Element& xmlelement, XMLPort::Mode mode)
110    {
111        SUPER(HUDWeaponMode, XMLPort, xmlelement, mode);
112    }
113
114    void HUDWeaponMode::tick(float dt)
115    {
116        SUPER(HUDWeaponMode, tick, dt);
117
118        if (this->owner_ && this->weaponMode_)
119        {
120            std::string lastMaterialNameState = materialNameState_;
121
122            if (weaponMode_->getReloading())
123            {
124                materialNameState_ = "Orxonox/WSHUD_Reloading";
125            }
126            else
127            {
128                materialNameState_ = "Orxonox/WSHUD_Ready";
129            }           
130
131            Munition* munition = this->weaponMode_->getMunition();
132
133            if (munition != NULL)
134            {
135                MunitionDeployment::Value deployment = munition->getMunitionDeployment();
136
137                if (deployment == MunitionDeployment::Share)
138                {
139                    this->textOverlayLeft_->setCaption(multi_cast<std::string>(munition->getNumMunitionInCurrentMagazine(weaponMode_)));
140                    this->textOverlayRight_->setCaption(multi_cast<std::string>(munition->getNumMagazines()));
141                }
142                else if (deployment == MunitionDeployment::Stack)
143                {
144                    this->textOverlayLeft_->setCaption(multi_cast<std::string>(munition->getNumMunition(weaponMode_)));
145                    this->textOverlayRight_->setCaption("");
146                }
147                else if (deployment == MunitionDeployment::Separate)
148                {
149                    this->textOverlayLeft_->setCaption(multi_cast<std::string>(munition->getNumMunitionInCurrentMagazine(weaponMode_)));
150                    this->textOverlayRight_->setCaption(multi_cast<std::string>(munition->getNumMagazines()));
151                }
152
153                if (munition->getNumMunition(weaponMode_) == 0)
154                {
155                    materialNameState_ = "Orxonox/WSHUD_Empty";
156                }
157            }
158
159            if (munition->isA(Class(ReplenishingMunition)))
160            {
161                ReplenishingMunition* replenishingMunition = dynamic_cast<ReplenishingMunition*>(munition);
162
163                if (replenishingMunition->canAddMunition(1))
164                {
165                    float progress = 1.0f - replenishingMunition->getProgress();
166                    overlayElementReplenish_->setDimensions(1.0f,progress);                   
167                }
168                else
169                {
170                    overlayElementReplenish_->setDimensions(1.0f,1.0f);
171                }
172            }
173
174            if (materialNameState_ != lastMaterialNameState)
175            {
176                overlayElementState_->setMaterialName(materialNameState_);
177            }
178        }
179    }   
180
181    void HUDWeaponMode::positionChanged()
182    {
183        OrxonoxOverlay::positionChanged();
184
185        positionHUDChilds();
186    }
187
188    void HUDWeaponMode::sizeChanged()
189    {
190        OrxonoxOverlay::sizeChanged();
191
192        positionHUDChilds();
193    }
194
195    void HUDWeaponMode::changedOwner()
196    {
197        SUPER(HUDWeaponMode, changedOwner);
198
199        this->owner_ = orxonox_cast<Pawn*>(this->getOwner());
200    }
201
202    void HUDWeaponMode::changedOverlayGroup()
203    {
204        SUPER(HUDWeaponMode, changedOverlayGroup);
205
206        this->getOverlayGroup()->addElement(this->textOverlayLeft_.get());
207        this->getOverlayGroup()->addElement(this->textOverlayRight_.get());
208    }   
209
210    void HUDWeaponMode::changedVisibility()
211    {
212        SUPER(HUDWeaponMode, changedVisibility);
213
214        this->textOverlayLeft_->setVisible(this->isVisible());
215        this->textOverlayRight_->setVisible(this->isVisible());
216    }
217
218    void HUDWeaponMode::changedName()
219    {
220        SUPER(HUDWeaponMode, changedName);
221
222        //this->textOverlay_->setName(this->getName() + "text");
223    } 
224
225    void HUDWeaponMode::setWeaponMode(WeaponMode* weaponMode)
226    {
227        weaponMode_ = weaponMode;
228
229        if (!weaponMode_)
230        {
231            return;
232        }
233
234        std::string materialName = weaponMode_->getHUDImageString();
235
236        overlayElementIcon_->setMaterialName(materialName);
237
238        Munition* munition = this->weaponMode_->getMunition();
239
240        if (munition != NULL)
241        {
242            MunitionDeployment::Value deployment = munition->getMunitionDeployment();
243
244            if (deployment == MunitionDeployment::Share)
245            {
246                overlayElementMunition_->setMaterialName("Orxonox/WSHUD_MunitionShare");
247            }
248            else if (deployment == MunitionDeployment::Stack)
249            {
250                overlayElementMunition_->setMaterialName("Orxonox/WSHUD_MunitionStack");
251            }
252            else if (deployment == MunitionDeployment::Separate)
253            {
254                overlayElementMunition_->setMaterialName("Orxonox/WSHUD_MunitionSeparate");
255            }
256        }
257    }
258
259    void HUDWeaponMode::positionHUDChilds()
260    {
261        Vector2 size = Vector2(getSize().x*45.0f/150.0f, getSize().y);
262        Vector2 offset1 = Vector2(getSize().x*82.5f/150.0f, 0.0f);
263        Vector2 offset2 = Vector2(getSize().x*127.5f/150.0f, 0.0f);
264
265        textOverlayLeft_->setPosition(getPosition() + offset1);
266        textOverlayRight_->setPosition(getPosition() + offset2);
267
268        textOverlayLeft_->setSize(size);
269        textOverlayRight_->setSize(size);
270
271        textOverlayLeft_->setTextSize(getSize().y);
272        textOverlayRight_->setTextSize(getSize().y);
273    }
274
275    void HUDWeaponMode::updateSize()
276    {
277        this->setSize(weaponModeHUDActualSize_);
278        updatePosition();
279    }
280
281    void HUDWeaponMode::updatePosition()
282    {
283        this->setPosition(Vector2(weaponModeHUDActualSize_.x*weaponIndex_,weaponModeHUDActualSize_.y*weaponModeIndex_) + this->positionOffset_);
284    }     
285}
Note: See TracBrowser for help on using the repository browser.