source: GTP/trunk/App/Games/Jungle_Rumble/src/HUDRenderer.cpp @ 1378

Revision 1378, 13.2 KB checked in by giegl, 18 years ago (diff)

GTPD - Jungle Rumble - integrate into GTP SVN structure

Line 
1#include "dxstdafx.h"
2#include ".\HUDRenderer.h"
3#include "GameManager.h"
4#include "UserPlayer.h"
5#include "HUD.h"
6
7HUDRenderer::HUDRenderer(void) : Renderer()
8{
9        this->setRenderPriority(300);
10        this->rendererType |= Renderer::RENDERER_HUD;
11        this->sprite = NULL;
12}
13
14HUDRenderer::~HUDRenderer(void)
15{
16        SAFE_RELEASE(this->myFont);
17        SAFE_RELEASE(sprite);
18        this->myFont = NULL;
19        this->sprite = NULL;
20}
21
22void HUDRenderer::init() {
23        // Create a D3DX font object
24        this->setRenderPriority(60);
25        D3DXCreateSprite(DXUTGetD3DDevice(),&sprite);
26        D3DXCreateFont( this->device, 26, 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Arial"), &myFont );
27        fontColor = D3DCOLOR_ARGB(255,255,255,255);
28        SetRect(&textRectangle, 0, this->myScene->manager->screenHeight-200, this->myScene->manager->screenWidth, this->myScene->manager->screenHeight);
29        SetRect(&timeRectangle, 0, this->myScene->manager->screenHeight-100, this->myScene->manager->screenWidth - 20, this->myScene->manager->screenHeight);
30        SetRect(&ammoRectangle, 0, this->myScene->manager->screenHeight-60, this->myScene->manager->screenWidth - 20, this->myScene->manager->screenHeight);
31        SetRect(&helpRectangle, 10, this->myScene->manager->screenHeight-500, this->myScene->manager->screenWidth - 20, this->myScene->manager->screenHeight);
32
33       
34}
35
36void HUDRenderer::render()
37{
38        if(this->myScene->getActivePassId()==Scene::PASS_NORMAL) {
39                this->device->BeginScene();
40                SPTR<Node> node = this->myNode.lock();
41                HUD *hud = (HUD *) (node.get());
42                if(hud!=NULL) {
43                        //disable z buffer:
44                        this->device->SetRenderState(D3DRS_ZENABLE, FALSE);
45
46                        // get the scene in order to receive players
47                        GameScene* gs = (GameScene*)(this->myScene);
48                        //get the sprite:
49                        //LPD3DXSPRITE sprite = *hud->getSprite();
50                        //create scale/rotate matrices
51                        D3DXMATRIX mat;
52                        D3DXMATRIX mat2;
53                        //create surface descriptor
54                        D3DSURFACE_DESC desc;
55                        D3DSURFACE_DESC desc2;
56                       
57                        //draw crosshair:
58                        hud->Textures[0]->GetLevelDesc(0, &desc);       //get texture size             
59                        //calculate transfomation:
60                        D3DXVECTOR3 center((FLOAT)desc.Width/2, (FLOAT)desc.Height/2, 0);
61                        D3DXVECTOR2 trans((float)(this->myScene->getMousePos()[0]),(float)(this->myScene->getMousePos()[1]));
62                        D3DXVECTOR2 scaling(hud->getScaleCrosshairX(),hud->getScaleCrosshairY());
63                        //set matrix:
64                        D3DXMatrixTransformation2D(&mat,NULL,0.0,&scaling,NULL,0,&trans);
65                        sprite->SetTransform(&mat);
66                        //draw crosshair:
67                        sprite->Begin(D3DXSPRITE_ALPHABLEND);
68                        sprite->Draw(hud->Textures[0], NULL, &center, NULL, 0xFFFFFFFF);
69
70                        //draw radar:
71                        hud->Textures[1]->GetLevelDesc(0, &desc);       //get texture size             
72                        //calculate transfomation:
73                        D3DXVECTOR2 rotPoint((FLOAT)desc.Width/2*hud->getScaleRadarX() + hud->getRadarOffsetX(), (FLOAT) this->myScene->manager->screenHeight - (desc.Height/2*hud->getScaleRadarY() + hud->getRadarOffsetY()));
74                        trans = D3DXVECTOR2(rotPoint.x - (FLOAT)(gs->player->getPosition().x/this->myScene->getWidth()*desc.Width*hud->getScaleRadarX()),rotPoint.y - (FLOAT)(desc.Height*hud->getScaleRadarY() - (gs->player->getPosition().z/this->myScene->getDepth()*desc.Height*hud->getScaleRadarY())));
75                        D3DXVECTOR2 trans2(trans.x, trans.y);
76                        scaling = D3DXVECTOR2(hud->getScaleRadarX(),hud->getScaleRadarY());
77                        float rotation = -(gs->player->myRotation.y);
78                        //reset matrix:
79                        D3DXMatrixIdentity(&mat);
80                        D3DXMatrixIdentity(&mat2);
81                        D3DXMATRIX res;
82                        D3DXMatrixTransformation2D(&mat,0,0.0,&scaling,0,0.0f,&trans);
83                        D3DXMatrixTransformation2D(&mat2,0,0.0,0,&rotPoint,rotation,0);
84                        D3DXMatrixMultiply(&res, &mat, &mat2);
85                        sprite->SetTransform(&res);
86                        //draw radar:
87                        sprite->Draw(hud->Textures[1], NULL, 0, 0, 0xFFFFFFFF);
88                       
89                        //draw ai players (enemies)
90                        hud->Textures[2]->GetLevelDesc(0, &desc2);      //get texture size
91                        //calculate location:
92                        center = D3DXVECTOR3((FLOAT)desc2.Width/2, (FLOAT)desc2.Height/2, 0);
93                        //get list:
94                        std::list<SPTR<Node> > *playerList = ((GameScene *)this->myScene)->getPlayerList();
95                        std::list<SPTR<Node> >::iterator it;
96                        Player *activeOpponent = NULL;
97                        for(it=playerList->begin();it!=playerList->end();it++) {
98                                activeOpponent = ((Player *) (*it).get());
99                                if(activeOpponent != (Player *)gs->player) {
100                                        trans = D3DXVECTOR2(trans2.x + activeOpponent->getPosition().x/this->myScene->getWidth()*desc.Width*hud->getScaleRadarX(), trans2.y + (desc.Height*hud->getScaleRadarY() - (activeOpponent->getPosition().z/this->myScene->getDepth()*desc.Height*hud->getScaleRadarY())));
101                                        //reset matrix:
102                                        D3DXMatrixIdentity(&mat);
103                                        D3DXMatrixIdentity(&mat2);
104                                        D3DXMATRIX res;
105                                        D3DXMatrixTransformation2D(&mat,0,0.0,0,0,0.0f,&trans);
106                                        D3DXMatrixTransformation2D(&mat2,0,0.0,0,&rotPoint,rotation,0);
107                                        D3DXMatrixMultiply(&res, &mat, &mat2);
108                                        sprite->SetTransform(&res);
109                                        //draw player:
110                                        sprite->Draw(hud->Textures[2], NULL, &center, NULL, 0xFF0000FF);
111                                }
112                        }
113
114                        //draw player:
115                        trans = D3DXVECTOR2((FLOAT)(desc.Width/2*hud->getScaleRadarX() + hud->getRadarOffsetX()),(FLOAT) this->myScene->manager->screenHeight - (desc.Height/2*hud->getScaleRadarY() + hud->getRadarOffsetY()));
116                        //reset matrix:
117                        D3DXMatrixIdentity(&mat);
118                        D3DXMatrixTransformation2D(&mat,0,0.0,0,0,0,&trans);
119                        sprite->SetTransform(&mat);
120                        //draw player:
121                        sprite->Draw(hud->Textures[2], NULL, &center, NULL, 0xFFFF0000);
122                       
123                        //draw human player health logo & health bar:
124                        hud->Textures[3]->GetLevelDesc(0, &desc);       //get texture size
125                        hud->Textures[4]->GetLevelDesc(0, &desc2);
126                        float offset = 20;
127                        RECT rectangle;
128                        float health = gs->player->getHealth();
129                        if(health>100.0f) {
130                                this->myScene->manager->printToConsole("Health over 100 percent!!!!");
131                                health = 100.0f;
132                        }
133                        if (health<0.0f) {
134                                this->myScene->manager->printToConsole("Health under 0 percent!!!!");
135                                health = 0.0f;
136                        }
137                        SetRect(&rectangle, 0, 0, (int)(desc2.Width*health/100), (int)(desc2.Height));
138                        scaling = D3DXVECTOR2(hud->getScaleUserPlayer(),hud->getScaleUserPlayer());
139                        //reset matrix:
140                        D3DXMatrixIdentity(&mat);
141                        D3DXMatrixTransformation2D(&mat,0,0.0,&scaling,0,0.0f,0);
142                        sprite->SetTransform(&mat);
143                        //set logo position:
144                        D3DXVECTOR3 pos (offset,offset,0.0f);
145                        //draw health logo:
146                        sprite->Draw(hud->Textures[3], NULL, NULL, &pos, 0xFFFFFFFF);
147                        //set bar position:
148                        pos = D3DXVECTOR3(offset + desc.Width + offset, offset, 0);
149                        sprite->Draw(hud->Textures[4], &rectangle, NULL, &pos, 0xFFFFFFFF);
150
151                        //draw ai players health logos & health bars:
152                        hud->Textures[5]->GetLevelDesc(0, &desc);       //get texture size
153                        hud->Textures[6]->GetLevelDesc(0, &desc2);      //get texture size
154                        //scale according to xml settings
155                        scaling = D3DXVECTOR2(hud->getScaleAIPlayer(),hud->getScaleAIPlayer());
156                        D3DXVECTOR2 scalepos((float)this->myScene->manager->screenWidth, 0);
157                        D3DXMatrixIdentity(&mat);
158                        D3DXMatrixTransformation2D(&mat,&scalepos,0.0,&scaling,0,0.0f,0);
159                        sprite->SetTransform(&mat);
160                        //draw info for alle opponents:
161                        float sum = offset;
162                        for(it=playerList->begin();it!=playerList->end();it++) {
163                                activeOpponent = ((Player *) (*it).get());
164                                if(activeOpponent != (Player *)gs->player) {
165                                        //set logo position:
166                                        pos = D3DXVECTOR3((float)this->myScene->manager->screenWidth - desc.Width - offset,sum,0);
167                                        //draw logo:
168                                        sprite->Draw(hud->Textures[5], NULL, NULL, &pos, 0xFFFFFFFF);
169                                        //set health bar position:
170                                        health = activeOpponent->getHealth();
171                                        if(health>100.0f) {
172                                                this->myScene->manager->printToConsole("Health over 100 percent!!!!");
173                                                health = 100.0f;
174                                        }
175                                        if (health<0.0f) {
176                                                this->myScene->manager->printToConsole("Health under 0 percent!!!!");
177                                                health = 0.0f;
178                                        }
179                                        SetRect(&rectangle, (int)(desc2.Width - desc2.Width*health/100), 0, (int)desc2.Width, (int)(desc2.Height));
180                                        pos = D3DXVECTOR3((float)this->myScene->manager->screenWidth - desc.Width - 2*offset - desc2.Width + (int)(desc2.Width - desc2.Width*health/100),sum, 0);
181                                        //draw health bar:
182                                        sprite->Draw(hud->Textures[6], &rectangle, NULL, &pos, 0xFFFFFFFF);
183                                        //next player position:
184                                        sum += desc.Width + offset;
185                                }
186                        }
187
188                        //reset matrix:
189                        D3DXMatrixIdentity(&mat);
190                        sprite->SetTransform(&mat);
191                       
192                        //time output:
193                        std::ostringstream ostr;
194                        ostr.str("");
195                        ostr << "Time left: ";
196                        ostr << hud->minutes;
197                        ostr << " min ";
198                        ostr << hud->seconds;
199                        ostr << " sec";
200                        std::string temp = ostr.str();
201                        std::wstring time(temp.begin(), temp.end());
202                        myFont->DrawText(sprite, time.c_str(), -1, &timeRectangle, DT_RIGHT, fontColor);
203                       
204                        //ammunition output:
205                        ostr.str("");
206                        ostr << "Ammo: ";
207                        ostr << hud->ammoAmount;
208                        temp = ostr.str();
209                        std::wstring ammo(temp.begin(), temp.end());
210                        myFont->DrawText(sprite, ammo.c_str(), -1, &ammoRectangle, DT_RIGHT, fontColor);
211
212                        //message output:
213                        if (hud->messagetimer < hud->messagethreshold) {
214                                hud->messagetimer += hud->messagedt;
215                                if(!hud->bHelp) {
216                    myFont->DrawText(sprite, hud->messagestring.c_str(), -1, &textRectangle, DT_CENTER | DT_WORDBREAK, fontColor);
217                                } else {
218                                        myFont->DrawText(sprite, hud->messagestring.c_str(), -1, &helpRectangle, DT_LEFT | DT_WORDBREAK, fontColor);
219                                }
220                        }
221
222                        //you win output:
223                        if (hud->youwintimer < hud->youwinthreshold) {
224                                hud->youwintimer += hud->youwindt;
225                                //now draw the you win stuff:
226                                std::list<HUD::Letter>::iterator iter;
227                                for(UINT i = 0; i < hud->YouWin.size(); i++) {
228                                        HUD::Letter *tempLetter = &hud->YouWin.at(i);
229                                        scaling = D3DXVECTOR2(tempLetter->scale,tempLetter->scale);
230                                        scalepos = D3DXVECTOR2(tempLetter->x - tempLetter->centerX,tempLetter->y - tempLetter->centerY);
231                                        rotPoint = D3DXVECTOR2(tempLetter->x,tempLetter->y);
232                                        rotation = hud->youwintimer * tempLetter->rotation;
233                                        D3DXMatrixIdentity(&mat);
234                                        D3DXMatrixTransformation2D(&mat,&scalepos,0.0,&scaling,&rotPoint,rotation,0);
235                                        sprite->SetTransform(&mat);
236                                        pos = D3DXVECTOR3(tempLetter->x, tempLetter->y, 0);
237                                        center = D3DXVECTOR3((FLOAT)tempLetter->centerX, (FLOAT)tempLetter->centerY, 0);
238                                        sprite->Draw(tempLetter->texture, NULL, &center, &pos, 0xFFFFFFFF);
239                                }
240                        }
241                        //you lose output:
242                        if (hud->youlosetimer < hud->youlosethreshold) {
243                                hud->youlosetimer += hud->youlosedt;
244                                //now draw the you lose stuff:
245                                std::list<HUD::Letter>::iterator iter;
246                                for(UINT i = 0; i < hud->YouLose.size(); i++) {
247                                        HUD::Letter *tempLetter = &hud->YouLose.at(i);
248                                        scaling = D3DXVECTOR2(tempLetter->scale,tempLetter->scale);
249                                        scalepos = D3DXVECTOR2(tempLetter->x - tempLetter->centerX,tempLetter->y - tempLetter->centerY);
250                                        rotPoint = D3DXVECTOR2(tempLetter->x,tempLetter->y);
251                                        rotation = hud->youlosetimer * tempLetter->rotation;
252                                        D3DXMatrixIdentity(&mat);
253                                        D3DXMatrixTransformation2D(&mat,&scalepos,0.0,&scaling,&rotPoint,rotation,0);
254                                        sprite->SetTransform(&mat);
255                                        pos = D3DXVECTOR3(tempLetter->x, tempLetter->y, 0);
256                                        center = D3DXVECTOR3((FLOAT)tempLetter->centerX, (FLOAT)tempLetter->centerY, 0);
257                                        sprite->Draw(tempLetter->texture, NULL, &center, &pos, 0xFFFFFFFF);
258                                }
259                        }
260
261                        //toasted output:
262                        if (hud->toastedtimer < hud->toastedthreshold) {
263                                hud->toastedtimer += hud->toasteddt;
264                                //now draw the you lose stuff:
265                                std::list<HUD::Letter>::iterator iter;
266                                for(UINT i = 0; i < hud->Toasted.size(); i++) {
267                                        HUD::Letter *tempLetter = &hud->Toasted.at(i);
268                                        scaling = D3DXVECTOR2(tempLetter->scale,tempLetter->scale);
269                                        scalepos = D3DXVECTOR2(tempLetter->x - tempLetter->centerX,tempLetter->y - tempLetter->centerY);
270                                        rotPoint = D3DXVECTOR2(tempLetter->x,tempLetter->y);
271                                        rotation = hud->toastedtimer * tempLetter->rotation;
272                                        D3DXMatrixIdentity(&mat);
273                                        D3DXMatrixTransformation2D(&mat,&scalepos,0.0,&scaling,&rotPoint,rotation,0);
274                                        sprite->SetTransform(&mat);
275                                        pos = D3DXVECTOR3(tempLetter->x, tempLetter->y, 0);
276                                        center = D3DXVECTOR3((FLOAT)tempLetter->centerX, (FLOAT)tempLetter->centerY, 0);
277                                        sprite->Draw(tempLetter->texture, NULL, &center, &pos, 0xFFFFFFFF);
278                                }
279                        }
280
281                        sprite->End();
282
283                        //deactivate textures
284                        this->device->SetTexture(0, 0);
285
286                        //enable z buffer:
287                        this->device->SetRenderState(D3DRS_ZENABLE, TRUE);
288                }
289                this->device->EndScene();
290        }
291}
292
293void HUDRenderer::OnLostDevice( void* pUserContext )
294{
295        this->myFont->OnLostDevice();
296        this->sprite->OnLostDevice();
297}
298
299void HUDRenderer::OnDestroyDevice( void* pUserContext )
300{
301        SAFE_RELEASE(this->myFont);
302        SAFE_RELEASE(sprite);
303        this->myFont = NULL;
304        this->sprite = NULL;
305}
306
307HRESULT HUDRenderer::OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
308{
309        this->device = pd3dDevice;
310        D3DXCreateSprite(this->device,&sprite);
311        D3DXCreateFont( this->device, 26, 0, FW_BOLD, 0, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Arial"), &myFont );
312        fontColor = D3DCOLOR_ARGB(255,255,255,255);
313        return S_OK;
314}
315
316bool HUDRenderer::isLowerThan(Renderer* renderer)
317{
318        //Unter der Annahme, dass es kein zweites HUD gibt!
319        return this->getRenderPriority() < renderer->getRenderPriority();
320}
Note: See TracBrowser for help on using the repository browser.