From 527deb947ca992d2b0533db02eddf38e8150960b Mon Sep 17 00:00:00 2001 From: kwolekr Date: Sat, 20 Apr 2013 00:21:32 -0400 Subject: [PATCH] Add direction parameter to statbars in HUD API Fix health bar overlap when a larger texture is used --- doc/lua_api.txt | 11 +++---- src/hud.cpp | 68 +++++++++++++++++++++++++--------------- src/hud.h | 6 +++- src/scriptapi_object.cpp | 2 +- 4 files changed, 54 insertions(+), 33 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 1308323a4..aa4503879 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -407,6 +407,8 @@ The position field is used for all element types. To account for differing resolutions, the position coordinates are the percentage of the screen, 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 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. 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. @@ -428,15 +430,12 @@ Note: Future revisions to the HUD API may be incompatible; the HUD API is still - text: The name of the texture that is used. - number: The number of half-textures that are displayed. If odd, will end with a vertically center-split texture. + - direction - inventory - text: The name of the inventory list to be displayed. - number: Number of items in the inventory to be displayed. - item: Position of item that is selected. - - direction: Direction in which the inventory list 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. + - direction Representations of simple things -------------------------------- @@ -1856,6 +1855,6 @@ HUD Definition (hud_add, hud_get) number = 2, item = 3, ^ Selected item in inventory. 0 for no item selected. - dir = 0, + direction = 0, ^ Direction: 0: left-right, 1: right-left, 2: top-bottom, 3: bottom-top } diff --git a/src/hud.cpp b/src/hud.cpp index 349c55add..77cf23173 100644 --- a/src/hud.cpp +++ b/src/hud.cpp @@ -198,7 +198,7 @@ void Hud::drawLuaElements() { font->draw(narrow_to_wide(e->text).c_str(), size + pos, color); break; } case HUD_ELEM_STATBAR: - drawStatbar(pos, e->text, e->number); + drawStatbar(pos, HUD_CORNER_UPPER, e->dir, e->text, e->number); break; case HUD_ELEM_INVENTORY: { InventoryList *inv = inventory->getList(e->text); @@ -212,38 +212,55 @@ void Hud::drawLuaElements() { } -void Hud::drawStatbar(v2s32 upperleftpos, std::string texture, s32 count) { +void Hud::drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s32 count) { + const video::SColor color(255, 255, 255, 255); + const video::SColor colors[] = {color, color, color, color}; + video::ITexture *stat_texture = gamedef->getTextureSource()->getTextureRaw(texture); if (!stat_texture) return; + + core::dimension2di srcd(stat_texture->getOriginalSize()); - v2s32 p = upperleftpos; + v2s32 p = pos; + if (corner & HUD_CORNER_LOWER) + p -= srcd.Height; + + v2s32 steppos; + switch (drawdir) { + case HUD_DIR_RIGHT_LEFT: + steppos = v2s32(-1, 0); + break; + case HUD_DIR_TOP_BOTTOM: + steppos = v2s32(0, 1); + break; + case HUD_DIR_BOTTOM_TOP: + steppos = v2s32(0, -1); + break; + default: + steppos = v2s32(1, 0); + } + steppos.X *= srcd.Width; + steppos.Y *= srcd.Height; + for (s32 i = 0; i < count / 2; i++) { - core::dimension2di srcd(stat_texture->getOriginalSize()); - const video::SColor color(255, 255, 255, 255); - const video::SColor colors[] = {color, color, color, color}; - core::rect rect(0, 0, srcd.Width, srcd.Height); - rect += p; - driver->draw2DImage(stat_texture, rect, - core::rect(core::position2d(0, 0), srcd), - NULL, colors, true); - p += v2s32(srcd.Width, 0); + core::rect srcrect(0, 0, srcd.Width, srcd.Height); + core::rect dstrect(srcrect); + + dstrect += p; + driver->draw2DImage(stat_texture, dstrect, srcrect, NULL, colors, true); + p += steppos; } if (count % 2 == 1) { - core::dimension2di srcd(stat_texture->getOriginalSize()); - const video::SColor color(255, 255, 255, 255); - const video::SColor colors[] = {color, color, color, color}; - core::rect rect(0, 0, srcd.Width / 2, srcd.Height); - rect += p; - srcd.Width /= 2; - driver->draw2DImage(stat_texture, rect, - core::rect(core::position2d(0, 0), srcd), - NULL, colors, true); - p += v2s32(srcd.Width * 2, 0); + core::rect srcrect(0, 0, srcd.Width / 2, srcd.Height); + core::rect dstrect(srcrect); + + dstrect += p; + driver->draw2DImage(stat_texture, dstrect, srcrect, NULL, colors, true); } } @@ -260,14 +277,15 @@ void Hud::drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem) { v2s32 pos = centerlowerpos - v2s32(width / 2, hotbar_imagesize + padding * 2); drawItem(pos, hotbar_imagesize, hotbar_itemcount, mainlist, playeritem + 1, 0); - drawStatbar(pos + v2s32(0, -20), "heart.png", halfheartcount); + drawStatbar(pos - v2s32(0, 4), HUD_CORNER_LOWER, HUD_DIR_LEFT_RIGHT, + "heart.png", halfheartcount); } void Hud::drawCrosshair() { - driver->draw2DLine(displaycenter - v2s32(10,0), + driver->draw2DLine(displaycenter - v2s32(10, 0), displaycenter + v2s32(10, 0), crosshair_argb); - driver->draw2DLine(displaycenter - v2s32(0,10), + driver->draw2DLine(displaycenter - v2s32(0, 10), displaycenter + v2s32(0, 10), crosshair_argb); } diff --git a/src/hud.h b/src/hud.h index 7e00a94e3..274a669c4 100644 --- a/src/hud.h +++ b/src/hud.h @@ -27,6 +27,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #define HUD_DIR_TOP_BOTTOM 2 #define HUD_DIR_BOTTOM_TOP 3 +#define HUD_CORNER_UPPER 0 +#define HUD_CORNER_LOWER 1 +#define HUD_CORNER_CENTER 2 + class Player; enum HudElementType { @@ -102,7 +106,7 @@ public: void drawItem(v2s32 upperleftpos, s32 imgsize, s32 itemcount, InventoryList *mainlist, u16 selectitem, u16 direction); void drawLuaElements(); - void drawStatbar(v2s32 upperleftpos, std::string texture, s32 count); + void drawStatbar(v2s32 pos, u16 corner, u16 drawdir, std::string texture, s32 count); void drawHotbar(v2s32 centerlowerpos, s32 halfheartcount, u16 playeritem); void resizeHotbar(); diff --git a/src/scriptapi_object.cpp b/src/scriptapi_object.cpp index 531bb7a58..3d56aad29 100644 --- a/src/scriptapi_object.cpp +++ b/src/scriptapi_object.cpp @@ -749,7 +749,7 @@ int ObjectRef::l_hud_add(lua_State *L) elem->text = getstringfield_default(L, 2, "text", ""); elem->number = getintfield_default(L, 2, "number", 0); elem->item = getintfield_default(L, 2, "item", 0); - elem->dir = getintfield_default(L, 2, "dir", 0); + elem->dir = getintfield_default(L, 2, "direction", 0); u32 id = get_server(L)->hudAdd(player, elem); if (id == (u32)-1) {