1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
/*
client/hudenginestatus.cc
This file is part of the Osirion project and is distributed under
the terms and conditions of the GNU General Public License version 2
*/
#include "client/hudenginestatus.h"
#include "core/core.h"
#include "core/application.h"
#include "ui/ui.h"
#include "ui/paint.h"
#include "render/gl.h"
namespace client
{
HUDEngineStatus::HUDEngineStatus(ui::Widget *parent) : ui::Widget(parent)
{
set_border(false);
set_background(false);
}
void HUDEngineStatus::draw()
{
const float padding = font()->width() * 0.25f;
math::Vector2f pos(global_location());
pos[0] += padding;
pos[1] += padding;
math::Vector2f s(size());
s[0] -= 2.0f * padding;
s[1] -= 2.0f * padding;
// thrust
const float blink_t = core::application()->time() * 2.0f;
std::ostringstream thruststr;
switch(core::localcontrol()->state()) {
case core::Entity::Normal:
thruststr << "^B" << roundf(core::localcontrol()->thrust() * 100.0f) << "%";
break;
case core::Entity::ImpulseInitiate:
case core::Entity::JumpInitiate:
if ((blink_t - floorf(blink_t)) < 0.5f) {
thruststr << "^B--";
}
break;
default:
thruststr << "^B--";
break;
}
// speed
std::ostringstream speedstr;
speedstr << "^B" << roundf(core::localcontrol()->speed() * 100.0f);
ui::Paint::set_color(palette()->foreground());
ui::Paint::draw_label(pos, s, ui::root()->font_large(), thruststr.str(), ui::AlignLeft | ui::AlignVCenter);
ui::Paint::draw_label(pos, s, ui::root()->font_large(), speedstr.str(), ui::AlignRight | ui::AlignVCenter);
// health bar size
const float hb_width = width() - 12 * ui::root()->font_large()->width() - 2.0f * padding;
const float hb_height = ui::root()->font_tiny()->width();
const float hb_f = hb_width * core::localcontrol()->health() / 100.0f;
pos.assign(global_location());
pos[0] += (width() - hb_width) * 0.5f;
pos[1] += (height() - hb_height) * 0.5f;
// health bar
gl::color(0, 1, 0, 1);
gl::begin(gl::Quads);
gl::vertex(pos[0], pos[1]);
gl::vertex(pos[0] + hb_f, pos[1]);
gl::vertex(pos[0] + hb_f, pos[1] + hb_height);
gl::vertex(pos[0], pos[1] + hb_height);
gl::end();
// health bar frame
gl::color(palette()->foreground());
gl::begin(gl::LineLoop);
gl::vertex(pos[0], pos[1]);
gl::vertex(pos[0] + hb_width, pos[1]);
gl::vertex(pos[0] + hb_width, pos[1] + hb_height);
gl::vertex(pos[0], pos[1] + hb_height);
gl::end();
}
bool HUDEngineStatus::on_keypress(const int key, const unsigned int modifier)
{
return false;
}
} // namespace client
|