• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wzorce projektowe - obserwator - ekwipunek w grach

Ultraszybki serwer VPS NVMe BIZNES
+3 głosów
221 wizyt
pytanie zadane 1 stycznia 2017 w C i C++ przez GameProgrammer Obywatel (1,160 p.)
zmienione kategorie 1 stycznia 2017 przez GameProgrammer
Temat wzorców projektowy to dla mnie taka kolejna poprzeczka po programowaniu obiektowym. Nie umiem się w tym połapać, o ile w książkach mniej więcej jeszcze łapię budowę wzorców to nie wiem gdzie w grach mógłbym dany wzorzec wykorzystać. Jeżeli robię np. GUI w grze z HP, ekwipunkiem itd. i wydaje mi się że tutaj mógłbym wykorzystać wzorzec obserwator, to czy dobrze rozumuję?

-Gracz jest obserwowany przez GUI hp_bar i wyświetla graficznie hp gracza.

-Tak samo ekwipunek wyświetla graficznie to co gracz posiada. Jednak przy użyciu kursora jak operuję na ekwipunku i wyrzucam jakiś przedmiot z GUI to muszę przekazać info do gracza żeby wyrzucił z tablicy inv te przedmioty. Więc obserwacja musi być w 2 strony.

Macie jakieś porady nt. komunikacji między klasami w takich przypadkach?
komentarz 1 stycznia 2017 przez VirtualMember Gaduła (3,050 p.)
zła kategoria, wzorce są ogólnie, nie tylko dla C/C++

1 odpowiedź

+2 głosów
odpowiedź 1 stycznia 2017 przez Ehlert VIP (118,130 p.)

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. 

komentarz 2 stycznia 2017 przez Ehlert VIP (118,130 p.)

Nie zależy mi jakoś specjalnie na upvoteach, ale dostałem 3 downvotey i zero komentarza. Trochę żenujące. frown

Podobne pytania

+1 głos
1 odpowiedź 174 wizyt
pytanie zadane 9 września 2016 w C i C++ przez CortezjuszPospolity Obywatel (1,130 p.)
0 głosów
0 odpowiedzi 88 wizyt
pytanie zadane 30 stycznia 2017 w Python, Django przez Macek Kolo Mądrala (5,220 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.
Ciekawy innych porad? Odwiedź tę stronę!

44,323 zapytań

84,160 odpowiedzi

167,561 komentarzy

21,229 pasjonatów

Przeglądających: 325
Pasjonatów: 22 Gości: 303

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...