Co do paska HP. Zrób graczowi publiczną metodę zwracającą liczbę z przedziału <0,1> na temat HP. To będzie skalar wskazujący na zapełnienie.
class Hero{
private:
unsigned maxHp, currentHp;
//...
public:
double getHpScalar(){
return currentHp / maxHp;
}
};
class HpBar{
public:
void draw(Hero* hero) {
double scalar = hero->getHpScalar();
//już wiesz w ilu %ma być zapełniony pasek;
//teraz w zaleznosci od jego długości w tej klasie manipulujesz jego kolorem.
}
};
Co do dropnięcia przedmiotów ja wykorzystałbym wskaźnik polimorficzny którym posługiwałoby się GUI.
class Item;
class ItemManageable{
public:
virtual void dropItem(Item item) = 0;
};
class Human : public ItemManageable{
private:
std::vector<Item> items;
//...
public:
void dropItem(Item item) {
//usuwasz item podany jako argument z vectora
}
};
class GUIEquipment{
private:
ItemManageable* effector;
public:
GUIEquipment(ItemManageable* wsk) : effector (wsk){}
void drop(Item item) {
//tutaj wykryłeś że gracz wywalił w gui item. jest on podany jako argument.
effector->dropItem(item);
}
};
Taki pseudokod. Moje spojrzenie na Twój problem. Btw nie próbuj na siłę pchać gdzieś wzorców.