• 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

+2 głosów
302 wizyt
pytanie zadane 1 stycznia 2017 w C i C++ przez GameProgrammer Obywatel (1,150 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 Pasjonat (15,810 p.)
zła kategoria, wzorce są ogólnie, nie tylko dla C/C++

1 odpowiedź

+1 głos
odpowiedź 1 stycznia 2017 przez Ehlert Ekspert (207,410 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 Ekspert (207,410 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ź 312 wizyt
pytanie zadane 9 września 2016 w C i C++ przez CortezjuszPospolity Obywatel (1,130 p.)
0 głosów
1 odpowiedź 105 wizyt
0 głosów
0 odpowiedzi 59 wizyt
pytanie zadane 18 listopada 2021 w C# przez Zaba096 Początkujący (260 p.)

88,667 zapytań

137,277 odpowiedzi

306,616 komentarzy

58,867 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

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

...