Added offset support for HUD items

master
Diego Martínez 2013-04-22 20:47:59 -03:00 committed by Perttu Ahola
parent 7c37b1891a
commit 9894167bbf
9 changed files with 43 additions and 8 deletions

View File

@ -412,6 +412,9 @@ The direction field is the direction in which something is drawn.
The alignment field specifies how the item will be aligned. It ranges from -1 to 1, 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 with 0 being the center, -1 is moved to the left/up, and 1 is to the right/down. Fractional
values can be used. values can be used.
The offset field specifies a pixel offset from the position. Contrary to position,
the offset is not scaled to screen size. This allows for some precisely-positioned
items in the HUD.
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.
@ -422,6 +425,7 @@ Note: Future revisions to the HUD API may be incompatible; the HUD API is still
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. - alignment: The alignment of the image.
- offset: offset in pixels from position.
- 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.
@ -430,12 +434,14 @@ Note: Future revisions to the HUD API may be incompatible; the HUD API is still
- 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. - alignment: The alignment of the text.
- offset: offset in pixels from position.
- 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.
- number: The number of half-textures that are displayed. - number: The number of half-textures that are displayed.
If odd, will end with a vertically center-split texture. If odd, will end with a vertically center-split texture.
- direction - direction
- offset: offset in pixels from position.
- inventory - inventory
- text: The name of the inventory list to be displayed. - text: The name of the inventory list to be displayed.
- number: Number of items in the inventory to be displayed. - number: Number of items in the inventory to be displayed.
@ -1864,4 +1870,6 @@ HUD Definition (hud_add, hud_get)
^ 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}, alignment = {x=0, y=0},
^ See "HUD Element Types" ^ See "HUD Element Types"
offset = {x=0, y=0},
^ See "HUD Element Types"
} }

View File

@ -2055,6 +2055,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
u32 item = readU32(is); u32 item = readU32(is);
u32 dir = readU32(is); u32 dir = readU32(is);
v2f align = readV2F1000(is); v2f align = readV2F1000(is);
v2f offset = readV2F1000(is);
ClientEvent event; ClientEvent event;
event.type = CE_HUDADD; event.type = CE_HUDADD;
@ -2068,6 +2069,7 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
event.hudadd.item = item; event.hudadd.item = item;
event.hudadd.dir = dir; event.hudadd.dir = dir;
event.hudadd.align = new v2f(align); event.hudadd.align = new v2f(align);
event.hudadd.offset = new v2f(offset);
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

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

View File

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

View File

@ -2107,6 +2107,7 @@ void the_game(
delete event.hudadd.scale; delete event.hudadd.scale;
delete event.hudadd.text; delete event.hudadd.text;
delete event.hudadd.align; delete event.hudadd.align;
delete event.hudadd.offset;
continue; continue;
} }
@ -2120,6 +2121,7 @@ void the_game(
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; e->align = *event.hudadd.align;
e->offset = *event.hudadd.offset;
if (id == nhudelem) if (id == nhudelem)
player->hud.push_back(e); player->hud.push_back(e);
@ -2131,6 +2133,7 @@ void the_game(
delete event.hudadd.scale; delete event.hudadd.scale;
delete event.hudadd.text; delete event.hudadd.text;
delete event.hudadd.align; delete event.hudadd.align;
delete event.hudadd.offset;
} }
else if (event.type == CE_HUDRM) else if (event.type == CE_HUDRM)
{ {
@ -2175,6 +2178,9 @@ void the_game(
case HUD_STAT_ALIGN: case HUD_STAT_ALIGN:
e->align = *event.hudchange.v2fdata; e->align = *event.hudchange.v2fdata;
break; break;
case HUD_STAT_OFFSET:
e->offset = *event.hudchange.v2fdata;
break;
} }
delete event.hudchange.v2fdata; delete event.hudchange.v2fdata;

View File

@ -189,6 +189,7 @@ void Hud::drawLuaElements() {
v2s32 offset((e->align.X - 1.0) * ((imgsize.Width * e->scale.X) / 2), v2s32 offset((e->align.X - 1.0) * ((imgsize.Width * e->scale.X) / 2),
(e->align.Y - 1.0) * ((imgsize.Height * e->scale.X) / 2)); (e->align.Y - 1.0) * ((imgsize.Height * e->scale.X) / 2));
rect += offset; rect += offset;
rect += v2s32(e->offset.X, e->offset.Y);
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);
@ -202,11 +203,13 @@ void Hud::drawLuaElements() {
core::dimension2d<u32> textsize = font->getDimension(text.c_str()); core::dimension2d<u32> textsize = font->getDimension(text.c_str());
v2s32 offset((e->align.X - 1.0) * (textsize.Width / 2), v2s32 offset((e->align.X - 1.0) * (textsize.Width / 2),
(e->align.Y - 1.0) * (textsize.Height / 2)); (e->align.Y - 1.0) * (textsize.Height / 2));
font->draw(text.c_str(), size + pos + offset, color); v2s32 offs(e->offset.X, e->offset.Y);
font->draw(text.c_str(), size + pos + offset + offs, color);
break; }
case HUD_ELEM_STATBAR: {
v2s32 offs(e->offset.X, e->offset.Y);
drawStatbar(pos, HUD_CORNER_UPPER, e->dir, e->text, e->number, offs);
break; } break; }
case HUD_ELEM_STATBAR:
drawStatbar(pos, HUD_CORNER_UPPER, e->dir, e->text, e->number);
break;
case HUD_ELEM_INVENTORY: { case HUD_ELEM_INVENTORY: {
InventoryList *inv = inventory->getList(e->text); InventoryList *inv = inventory->getList(e->text);
drawItem(pos, hotbar_imagesize, e->number, inv, e->item, e->dir); drawItem(pos, hotbar_imagesize, e->number, inv, e->item, e->dir);
@ -219,7 +222,7 @@ void Hud::drawLuaElements() {
} }
void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s32 count) { void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s32 count, v2s32 offset) {
const video::SColor color(255, 255, 255, 255); const video::SColor color(255, 255, 255, 255);
const video::SColor colors[] = {color, color, color, color}; const video::SColor colors[] = {color, color, color, color};
@ -234,6 +237,8 @@ void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s
if (corner & HUD_CORNER_LOWER) if (corner & HUD_CORNER_LOWER)
p -= srcd.Height; p -= srcd.Height;
p += offset;
v2s32 steppos; v2s32 steppos;
switch (drawdir) { switch (drawdir) {
case HUD_DIR_RIGHT_LEFT: case HUD_DIR_RIGHT_LEFT:
@ -285,7 +290,7 @@ void Hud::drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem) {
drawItem(pos, hotbar_imagesize, hotbar_itemcount, mainlist, playeritem + 1, 0); drawItem(pos, hotbar_imagesize, hotbar_itemcount, mainlist, playeritem + 1, 0);
drawStatbar(pos - v2s32(0, 4), HUD_CORNER_LOWER, HUD_DIR_LEFT_RIGHT, drawStatbar(pos - v2s32(0, 4), HUD_CORNER_LOWER, HUD_DIR_LEFT_RIGHT,
"heart.png", halfheartcount); "heart.png", halfheartcount, v2s32(0, 0));
} }

View File

@ -48,7 +48,8 @@ enum HudElementStat {
HUD_STAT_NUMBER, HUD_STAT_NUMBER,
HUD_STAT_ITEM, HUD_STAT_ITEM,
HUD_STAT_DIR, HUD_STAT_DIR,
HUD_STAT_ALIGN HUD_STAT_ALIGN,
HUD_STAT_OFFSET
}; };
struct HudElement { struct HudElement {
@ -61,6 +62,7 @@ struct HudElement {
u32 item; u32 item;
u32 dir; u32 dir;
v2f align; v2f align;
v2f offset;
}; };
@ -108,7 +110,7 @@ public:
void drawItem(v2s32 upperleftpos, s32 imgsize, s32 itemcount, void drawItem(v2s32 upperleftpos, s32 imgsize, s32 itemcount,
InventoryList *mainlist, u16 selectitem, u16 direction); InventoryList *mainlist, u16 selectitem, u16 direction);
void drawLuaElements(); void drawLuaElements();
void drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s32 count); void drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s32 count, v2s32 offset);
void drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem); void drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem);
void resizeHotbar(); void resizeHotbar();

View File

@ -48,6 +48,7 @@ struct EnumString es_HudElementStat[] =
{HUD_STAT_ITEM, "item"}, {HUD_STAT_ITEM, "item"},
{HUD_STAT_DIR, "direction"}, {HUD_STAT_DIR, "direction"},
{HUD_STAT_ALIGN, "alignment"}, {HUD_STAT_ALIGN, "alignment"},
{HUD_STAT_OFFSET, "offset"},
{0, NULL}, {0, NULL},
}; };
@ -756,6 +757,10 @@ int ObjectRef::l_hud_add(lua_State *L)
elem->align = lua_istable(L, -1) ? read_v2f(L, -1) : v2f(); elem->align = lua_istable(L, -1) ? read_v2f(L, -1) : v2f();
lua_pop(L, 1); lua_pop(L, 1);
lua_getfield(L, 2, "offset");
elem->offset = 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;
@ -841,6 +846,9 @@ int ObjectRef::l_hud_change(lua_State *L)
case HUD_STAT_ALIGN: case HUD_STAT_ALIGN:
e->align = read_v2f(L, 4); e->align = read_v2f(L, 4);
value = &e->align; value = &e->align;
case HUD_STAT_OFFSET:
e->offset = read_v2f(L, 4);
value = &e->offset;
} }
get_server(L)->hudChange(player, id, stat, value); get_server(L)->hudChange(player, id, stat, value);

View File

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