From 20a09d5edee690f86e7d0bae343086f6a46ffed4 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Mon, 14 Feb 2011 17:41:49 +0200 Subject: [PATCH] new hotbar, more minecraft-like --- src/guiInventoryMenu.cpp | 54 ++++++++++------ src/guiInventoryMenu.h | 5 +- src/main.cpp | 129 ++++++++++++++++++++++++++++++--------- 3 files changed, 137 insertions(+), 51 deletions(-) diff --git a/src/guiInventoryMenu.cpp b/src/guiInventoryMenu.cpp index 102a0ae72..ef795a5f4 100644 --- a/src/guiInventoryMenu.cpp +++ b/src/guiInventoryMenu.cpp @@ -21,21 +21,16 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "guiInventoryMenu.h" #include "constants.h" -void drawInventoryItem(gui::IGUIEnvironment* env, +void drawInventoryItem(video::IVideoDriver *driver, + gui::IGUIFont *font, InventoryItem *item, core::rect rect, const core::rect *clip) { - gui::IGUISkin* skin = env->getSkin(); - if (!skin) + if(item == NULL) return; - video::IVideoDriver* driver = env->getVideoDriver(); video::ITexture *texture = NULL; - - if(item != NULL) - { - texture = item->getImage(); - } + texture = item->getImage(); if(texture != NULL) { @@ -48,22 +43,28 @@ void drawInventoryItem(gui::IGUIEnvironment* env, } else { - video::SColor bgcolor(128,128,128,128); + video::SColor bgcolor(255,50,50,128); driver->draw2DRectangle(bgcolor, rect, clip); } - if(item != NULL) + if(font != NULL) { - gui::IGUIFont *font = skin->getFont(); std::string text = item->getText(); if(font && text != "") { - core::rect rect2(rect.UpperLeftCorner, - (core::dimension2d(rect.getWidth(), 15))); + v2u32 dim = font->getDimension(narrow_to_wide(text).c_str()); + v2s32 sdim(dim.X,dim.Y); + + core::rect rect2( + /*rect.UpperLeftCorner, + core::dimension2d(rect.getWidth(), 15)*/ + rect.LowerRightCorner - sdim, + sdim + ); video::SColor bgcolor(128,0,0,0); driver->draw2DRectangle(bgcolor, rect2, clip); - + font->draw(text.c_str(), rect2, video::SColor(255,255,255,255), false, false, clip); @@ -184,10 +185,16 @@ void GUIInventoryMenu::drawList(const ListDrawSpec &s) { video::IVideoDriver* driver = Environment->getVideoDriver(); + // Get font + gui::IGUIFont *font = NULL; + gui::IGUISkin* skin = Environment->getSkin(); + if (skin) + font = skin->getFont(); + InventoryList *ilist = m_inventory->getList(s.listname); core::rect imgrect(0,0,imgsize.X,imgsize.Y); - + for(s32 i=0; idraw2DRectangle(video::SColor(255,255,0,0), core::rect(rect.UpperLeftCorner - v2s32(2,2), rect.LowerRightCorner + v2s32(2,2)), - &AbsoluteClippingRect); + &AbsoluteClippingRect); + } + + if(item) + { + drawInventoryItem(driver, font, item, + rect, &AbsoluteClippingRect); + } + else + { + video::SColor bgcolor(255,128,128,128); + driver->draw2DRectangle(bgcolor, rect, &AbsoluteClippingRect); } - drawInventoryItem(Environment, item, - rect, &AbsoluteClippingRect); } } diff --git a/src/guiInventoryMenu.h b/src/guiInventoryMenu.h index 6211bb24b..45a5e236a 100644 --- a/src/guiInventoryMenu.h +++ b/src/guiInventoryMenu.h @@ -26,9 +26,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "utility.h" #include "modalMenu.h" -void drawInventoryItem(gui::IGUIEnvironment* env, +void drawInventoryItem(video::IVideoDriver *driver, + gui::IGUIFont *font, InventoryItem *item, core::rect rect, - const core::rect *clip=0); + const core::rect *clip); class GUIInventoryMenu : public GUIModalMenu { diff --git a/src/main.cpp b/src/main.cpp index 1f8091a7f..bcc8dc446 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -399,11 +399,14 @@ extern void set_default_settings(); IrrlichtDevice *g_device = NULL; Client *g_client = NULL; -//const s16 quickinv_size = 48; -//const s16 quickinv_spacing = 64; -const s16 quickinv_size = 32; -const s16 quickinv_spacing = 40; -const s16 quickinv_itemcount = 8; +/*const s16 quickinv_size = 40; +const s16 quickinv_padding = 8; +const s16 quickinv_spacing = quickinv_size + quickinv_padding; +const s16 quickinv_outer_padding = 4; +const s16 quickinv_itemcount = 8;*/ + +const s32 hotbar_itemcount = 8; +const s32 hotbar_imagesize = 36; /* GUI Stuff @@ -629,24 +632,14 @@ public: } } - // Material selection - /*if(event.KeyInput.Key == irr::KEY_KEY_F) - { - if(g_selected_item < PLAYER_INVENTORY_SIZE-1) - g_selected_item++; - else - g_selected_item = 0; - dstream<= irr::KEY_KEY_0 && event.KeyInput.Key <= irr::KEY_KEY_9) { u16 s1 = event.KeyInput.Key - irr::KEY_KEY_0; if(event.KeyInput.Key == irr::KEY_KEY_0) s1 = 10; - if(s1 < PLAYER_INVENTORY_SIZE) + if(s1 < PLAYER_INVENTORY_SIZE && s1 < hotbar_itemcount) g_selected_item = s1-1; dstream<(0,0,1,1), false, false); + bgtext->setBackgroundColor( + video::SColor(128,0,0,0)); for(s32 i=0; iaddImage( @@ -1224,6 +1225,7 @@ public: { m_images[i]->remove(); } + bgtext->remove(); } void updatePosition(v2s32 pos) @@ -1234,6 +1236,10 @@ public: m_images[i]->setRelativePosition(pos + spacing*i); m_texts[i]->setRelativePosition(pos + spacing*i); } + core::rect bgrect(-quickinv_outer_padding,-quickinv_outer_padding, + (quickinv_itemcount-1)*quickinv_spacing+quickinv_size+quickinv_outer_padding, + quickinv_size+quickinv_outer_padding); + bgtext->setRelativePosition(bgrect+pos); } void setSelection(s32 i) @@ -1265,7 +1271,7 @@ public: m_images[i]->setImage(NULL); if(m_selection == j) - m_texts[i]->setText(L"<-"); + m_texts[i]->setText(L"->"); else m_texts[i]->setText(L""); @@ -1277,9 +1283,9 @@ public: m_images[i]->setImage(item->getImage()); std::ostringstream os; - os<getText(); if(m_selection == j) - os<<" <-"; + os<<"-> "; + os<getText(); m_texts[i]->setText(narrow_to_wide(os.str()).c_str()); /*wchar_t t[10]; @@ -1293,11 +1299,66 @@ public: private: s32 m_itemcount; + gui::IGUIStaticText *bgtext; core::array m_texts; core::array m_images; Inventory *m_inventory; s32 m_selection; }; +#endif + +void draw_hotbar(video::IVideoDriver *driver, gui::IGUIFont *font, + v2s32 centerlowerpos, s32 imgsize, s32 itemcount, + Inventory *inventory) +{ + InventoryList *mainlist = inventory->getList("main"); + if(mainlist == NULL) + { + dstream<<"WARNING: draw_hotbar(): mainlist == NULL"< barrect(0,0,width,height); + barrect += pos; + video::SColor bgcolor(255,128,128,128); + driver->draw2DRectangle(bgcolor, barrect, NULL);*/ + + core::rect imgrect(0,0,imgsize,imgsize); + + for(s32 i=0; igetItem(i); + + core::rect rect = imgrect + pos + + v2s32(padding+i*(imgsize+padding*2), padding); + + if(g_selected_item == i) + { + driver->draw2DRectangle(video::SColor(255,255,0,0), + core::rect(rect.UpperLeftCorner - v2s32(1,1)*padding, + rect.LowerRightCorner + v2s32(1,1)*padding), + NULL); + } + else + { + video::SColor bgcolor2(128,0,0,0); + driver->draw2DRectangle(bgcolor2, rect, NULL); + } + + if(item != NULL) + { + drawInventoryItem(driver, font, item, rect, NULL); + } + } +} // Chat data struct ChatLine @@ -2047,8 +2108,8 @@ int main(int argc, char *argv[]) /*GUIQuickInventory *quick_inventory = new GUIQuickInventory (guienv, NULL, v2s32(10, 70), 5, &local_inventory);*/ - GUIQuickInventory *quick_inventory = new GUIQuickInventory - (guienv, NULL, v2s32(0, 0), quickinv_itemcount, &local_inventory); + /*GUIQuickInventory *quick_inventory = new GUIQuickInventory + (guienv, NULL, v2s32(0, 0), quickinv_itemcount, &local_inventory);*/ // Test the text input system /*(new GUITextInputMenu(guienv, guiroot, -1, &g_menumgr, @@ -2121,7 +2182,7 @@ int main(int argc, char *argv[]) last_screensize = screensize; screensize = driver->getScreenSize(); v2s32 displaycenter(screensize.X/2,screensize.Y/2); - bool screensize_changed = screensize != last_screensize; + //bool screensize_changed = screensize != last_screensize; // Hilight boxes collected during the loop and displayed core::list< core::aabbox3d > hilightboxes; @@ -2130,11 +2191,11 @@ int main(int argc, char *argv[]) std::wstring infotext; // When screen size changes, update positions and sizes of stuff - if(screensize_changed) + /*if(screensize_changed) { v2s32 pos(displaycenter.X-((quickinv_itemcount-1)*quickinv_spacing+quickinv_size)/2, screensize.Y-quickinv_spacing); quick_inventory->updatePosition(pos); - } + }*/ //TimeTaker //timer1("//timer1"); @@ -2985,8 +3046,8 @@ int main(int argc, char *argv[]) old_selected_item = g_selected_item; //std::cout<<"Updating local inventory"<setSelection(g_selected_item); - quick_inventory->update(); + /*quick_inventory->setSelection(g_selected_item); + quick_inventory->update();*/ } /* @@ -3089,6 +3150,14 @@ int main(int argc, char *argv[]) */ // 0-1ms guienv->drawAll(); + + /* + Draw hotbar + */ + { + draw_hotbar(driver, font, v2s32(displaycenter.X, screensize.Y), + hotbar_imagesize, hotbar_itemcount, &local_inventory); + } // End drawing { @@ -3123,7 +3192,7 @@ int main(int argc, char *argv[]) device->yield();*/ } - delete quick_inventory; + //delete quick_inventory; /* Disable texture fetches and other stuff that is queued