Added support for alignment in HUD items

This commit is contained in:
Diego Martínez 2013-04-22 06:53:55 -03:00 committed by Perttu Ahola
parent 58ded5cd27
commit 7c37b1891a
9 changed files with 38 additions and 2 deletions

View File

@ -409,6 +409,9 @@ ranging in value from 0 to 1.
The name field is not yet used, but should contain a description of what the HUD element represents. The name field is not yet used, but should contain a description of what the HUD element represents.
The direction field is the direction in which something is drawn. The direction field is the direction in which something is drawn.
0 draws from left to right, 1 draws from right to left, 2 draws from top to bottom, and 3 draws from bottom to top. 0 draws from left to right, 1 draws from right to left, 2 draws from top to bottom, and 3 draws from bottom to top.
The alignment field specifies how the item will be aligned. It ranges from -1 to 1,
with 0 being the center, -1 is moved to the left/up, and 1 is to the right/down. Fractional
values can be used.
Below are the specific uses for fields in each type; fields not listed for that type are ignored. Below are the specific uses for fields in each type; fields not listed for that type are ignored.
Note: Future revisions to the HUD API may be incompatible; the HUD API is still in the experimental stages. Note: Future revisions to the HUD API may be incompatible; the HUD API is still in the experimental stages.
@ -418,6 +421,7 @@ Note: Future revisions to the HUD API may be incompatible; the HUD API is still
- scale: The scale of the image, with 1 being the original texture size. - scale: The scale of the image, with 1 being the original texture size.
Only the X coordinate scale is used. Only the X coordinate scale is used.
- text: The name of the texture that is displayed. - text: The name of the texture that is displayed.
- alignment: The alignment of the image.
- text - text
Displays text on the HUD. Displays text on the HUD.
- scale: Defines the bounding rectangle of the text. - scale: Defines the bounding rectangle of the text.
@ -425,6 +429,7 @@ Note: Future revisions to the HUD API may be incompatible; the HUD API is still
- text: The text to be displayed in the HUD element. - text: The text to be displayed in the HUD element.
- number: An integer containing the RGB value of the color used to draw the text. - number: An integer containing the RGB value of the color used to draw the text.
Specify 0xFFFFFF for white text, 0xFF0000 for red, and so on. Specify 0xFFFFFF for white text, 0xFF0000 for red, and so on.
- alignment: The alignment of the text.
- statbar - statbar
Displays a horizontal bar made up of half-images. Displays a horizontal bar made up of half-images.
- text: The name of the texture that is used. - text: The name of the texture that is used.
@ -1857,4 +1862,6 @@ HUD Definition (hud_add, hud_get)
^ Selected item in inventory. 0 for no item selected. ^ Selected item in inventory. 0 for no item selected.
direction = 0, direction = 0,
^ Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top ^ Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top
alignment = {x=0, y=0},
^ See "HUD Element Types"
} }

View File

@ -2054,6 +2054,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
u32 number = readU32(is); u32 number = readU32(is);
u32 item = readU32(is); u32 item = readU32(is);
u32 dir = readU32(is); u32 dir = readU32(is);
v2f align = readV2F1000(is);
ClientEvent event; ClientEvent event;
event.type = CE_HUDADD; event.type = CE_HUDADD;
@ -2066,6 +2067,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
event.hudadd.number = number; event.hudadd.number = number;
event.hudadd.item = item; event.hudadd.item = item;
event.hudadd.dir = dir; event.hudadd.dir = dir;
event.hudadd.align = new v2f(align);
m_client_event_queue.push_back(event); m_client_event_queue.push_back(event);
} }
else if(command == TOCLIENT_HUDRM) else if(command == TOCLIENT_HUDRM)

View File

@ -230,6 +230,7 @@ struct ClientEvent
u32 number; u32 number;
u32 item; u32 item;
u32 dir; u32 dir;
v2f *align;
} hudadd; } hudadd;
struct{ struct{
u32 id; u32 id;

View File

@ -452,6 +452,7 @@ enum ToClientCommand
u32 number u32 number
u32 item u32 item
u32 dir u32 dir
v2f1000 align
*/ */
TOCLIENT_HUDRM = 0x50, TOCLIENT_HUDRM = 0x50,

View File

@ -2106,6 +2106,7 @@ void the_game(
delete event.hudadd.name; delete event.hudadd.name;
delete event.hudadd.scale; delete event.hudadd.scale;
delete event.hudadd.text; delete event.hudadd.text;
delete event.hudadd.align;
continue; continue;
} }
@ -2118,6 +2119,7 @@ void the_game(
e->number = event.hudadd.number; e->number = event.hudadd.number;
e->item = event.hudadd.item; e->item = event.hudadd.item;
e->dir = event.hudadd.dir; e->dir = event.hudadd.dir;
e->align = *event.hudadd.align;
if (id == nhudelem) if (id == nhudelem)
player->hud.push_back(e); player->hud.push_back(e);
@ -2128,6 +2130,7 @@ void the_game(
delete event.hudadd.name; delete event.hudadd.name;
delete event.hudadd.scale; delete event.hudadd.scale;
delete event.hudadd.text; delete event.hudadd.text;
delete event.hudadd.align;
} }
else if (event.type == CE_HUDRM) else if (event.type == CE_HUDRM)
{ {
@ -2169,6 +2172,9 @@ void the_game(
case HUD_STAT_DIR: case HUD_STAT_DIR:
e->dir = event.hudchange.data; e->dir = event.hudchange.data;
break; break;
case HUD_STAT_ALIGN:
e->align = *event.hudchange.v2fdata;
break;
} }
delete event.hudchange.v2fdata; delete event.hudchange.v2fdata;

View File

@ -186,6 +186,9 @@ void Hud::drawLuaElements() {
core::rect<s32> rect(0, 0, imgsize.Width * e->scale.X, core::rect<s32> rect(0, 0, imgsize.Width * e->scale.X,
imgsize.Height * e->scale.X); imgsize.Height * e->scale.X);
rect += pos; rect += pos;
v2s32 offset((e->align.X - 1.0) * ((imgsize.Width * e->scale.X) / 2),
(e->align.Y - 1.0) * ((imgsize.Height * e->scale.X) / 2));
rect += offset;
driver->draw2DImage(texture, rect, driver->draw2DImage(texture, rect,
core::rect<s32>(core::position2d<s32>(0,0), imgsize), core::rect<s32>(core::position2d<s32>(0,0), imgsize),
NULL, colors, true); NULL, colors, true);
@ -195,7 +198,11 @@ void Hud::drawLuaElements() {
(e->number >> 8) & 0xFF, (e->number >> 8) & 0xFF,
(e->number >> 0) & 0xFF); (e->number >> 0) & 0xFF);
core::rect<s32> size(0, 0, e->scale.X, text_height * e->scale.Y); core::rect<s32> size(0, 0, e->scale.X, text_height * e->scale.Y);
font->draw(narrow_to_wide(e->text).c_str(), size + pos, color); std::wstring text = narrow_to_wide(e->text);
core::dimension2d<u32> textsize = font->getDimension(text.c_str());
v2s32 offset((e->align.X - 1.0) * (textsize.Width / 2),
(e->align.Y - 1.0) * (textsize.Height / 2));
font->draw(text.c_str(), size + pos + offset, color);
break; } break; }
case HUD_ELEM_STATBAR: case HUD_ELEM_STATBAR:
drawStatbar(pos, HUD_CORNER_UPPER, e->dir, e->text, e->number); drawStatbar(pos, HUD_CORNER_UPPER, e->dir, e->text, e->number);

View File

@ -47,7 +47,8 @@ enum HudElementStat {
HUD_STAT_TEXT, HUD_STAT_TEXT,
HUD_STAT_NUMBER, HUD_STAT_NUMBER,
HUD_STAT_ITEM, HUD_STAT_ITEM,
HUD_STAT_DIR HUD_STAT_DIR,
HUD_STAT_ALIGN
}; };
struct HudElement { struct HudElement {
@ -59,6 +60,7 @@ struct HudElement {
u32 number; u32 number;
u32 item; u32 item;
u32 dir; u32 dir;
v2f align;
}; };

View File

@ -47,6 +47,7 @@ struct EnumString es_HudElementStat[] =
{HUD_STAT_NUMBER, "number"}, {HUD_STAT_NUMBER, "number"},
{HUD_STAT_ITEM, "item"}, {HUD_STAT_ITEM, "item"},
{HUD_STAT_DIR, "direction"}, {HUD_STAT_DIR, "direction"},
{HUD_STAT_ALIGN, "alignment"},
{0, NULL}, {0, NULL},
}; };
@ -751,6 +752,10 @@ int ObjectRef::l_hud_add(lua_State *L)
elem->item = getintfield_default(L, 2, "item", 0); elem->item = getintfield_default(L, 2, "item", 0);
elem->dir = getintfield_default(L, 2, "direction", 0); elem->dir = getintfield_default(L, 2, "direction", 0);
lua_getfield(L, 2, "alignment");
elem->align = lua_istable(L, -1) ? read_v2f(L, -1) : v2f();
lua_pop(L, 1);
u32 id = get_server(L)->hudAdd(player, elem); u32 id = get_server(L)->hudAdd(player, elem);
if (id == (u32)-1) { if (id == (u32)-1) {
delete elem; delete elem;
@ -833,6 +838,9 @@ int ObjectRef::l_hud_change(lua_State *L)
case HUD_STAT_DIR: case HUD_STAT_DIR:
e->dir = lua_tonumber(L, 4); e->dir = lua_tonumber(L, 4);
value = &e->dir; value = &e->dir;
case HUD_STAT_ALIGN:
e->align = read_v2f(L, 4);
value = &e->align;
} }
get_server(L)->hudChange(player, id, stat, value); get_server(L)->hudChange(player, id, stat, value);

View File

@ -3616,6 +3616,7 @@ void Server::SendHUDAdd(u16 peer_id, u32 id, HudElement *form)
writeU32(os, form->number); writeU32(os, form->number);
writeU32(os, form->item); writeU32(os, form->item);
writeU32(os, form->dir); writeU32(os, form->dir);
writeV2F1000(os, form->align);
// Make data buffer // Make data buffer
std::string s = os.str(); std::string s = os.str();
@ -3650,6 +3651,7 @@ void Server::SendHUDChange(u16 peer_id, u32 id, HudElementStat stat, void *value
switch (stat) { switch (stat) {
case HUD_STAT_POS: case HUD_STAT_POS:
case HUD_STAT_SCALE: case HUD_STAT_SCALE:
case HUD_STAT_ALIGN:
writeV2F1000(os, *(v2f *)value); writeV2F1000(os, *(v2f *)value);
break; break;
case HUD_STAT_NAME: case HUD_STAT_NAME: