TowerDefense buff area implementacja

0

Cześć. Mam dwa rodzaje wieżyczek ( buff i attack) dziedziczące po tower.
Wszystkie na mapie mam zebrane w jeden std::vector<tower> towers.
Nie wiem jak zaimplementować interfejs w ten sposób, że gdy dostawiamy na mapke buffTower, wieże attackTower łapały tego buffa ( o ile są w jej zasięgu).
I oczywiście jak zaimplementować sprzedaż takiej wieżyczki, żeby odjąć te buffy.

1

Dodaj metody obsługujące eventy i wykorzystaj te metody w odpowiednim czasie.

Np. OnCreate(), OnCreateOtherTowerInRange(), OnSell().

W OnCreate buffTowera, przypisujemy go do wszystkich attackTower w zasięgu. Każdy attackTower będzie miał listę buffów (żeby nie zmieniać wartości bazowych). Przy każdym ataku itp. attackTower będzie przepuszczał swoje statsy przez listę buffów.

W OnSell usuwamy buffa z wszystkich attackTowerów. Dodatkowo, zwracamy odpowiednią ilość kasy graczowi itp.

0

To chyba źle zrobiłem dodając wszystkie wieże ( buff, attack) w jeden vector, bo w metodzie OnCreate() będę przeszukiwał wszystkie wieżyczki, w tym buffTower'y, a tych nie chcę ulepszać.
Poza tym mam zrobić jakiś pojemnik na wskaźniki wieżyczek, które zostały ulepszone ? Bo w OnSell() mogę właśnie przez wskaznik odjąć buffa, albo znowu przeszukiwać wszystkie wieżyczki w zasięgu ? Pomysł mi się nawet podoba.

0
Munvik napisał(a):

To chyba źle zrobiłem dodając wszystkie wieże ( buff, attack) w jeden vector, bo w metodzie OnCreate() będę przeszukiwał wszystkie wieżyczki, w tym buffTower'y, a tych nie chcę ulepszać.

Można trochę namodzić ;) klasa rodzic może mieć metodę wirtualną, która służy do dodawania buffów do wieżyczki. Attack tower może sobie dodać buffa tą metodą, a buff tower może nic nie robić tą metodą.

Poza tym mam zrobić jakiś pojemnik na wskaźniki wieżyczek, które zostały ulepszone ? Bo w OnSell() mogę właśnie przez wskaznik odjąć buffa, albo znowu przeszukiwać wszystkie wieżyczki w zasięgu ? Pomysł mi się nawet podoba.

Można tak zrobić, ale co zrobisz jeśli ktoś sprzeda wieżyczkę, która została ulepszona przez buffa? Lepiej, żeby tych powiązań było jak najmniej.

W C++ chyba wskaźnik do obiektu, który został usunięty, nie staje się automatycznie nullem :(

0

W chwili postawienia buffTower w metodzie onCreate() przeszukujemy i dodajemy buffa. A w chwili postawienia attackTower co ma ona zrobić , żeby znaleźć buffa który jest w zasięgu ?

0

attackTower musi w swoim OnCreate wywołać na sobie metodę innych wieżyczek: OnCreateOtherTowerInRange(this).
Metoda OnCreateOtherTowerInRange może sprawdzać, czy this jest w zasięgu.

0

Ok dzięki wielkie, nie zamykam jeszcze :)

1

Zasieg jest latwo sprawdzic - bierzesz wzor na metryke euklidesowa i jazda (jesli wykrywamy w okregu, oczywiscie mozemy inna jak chcemy np. kwadrat).

A ten buff jak dziala? Zakladam ze jak repeater, wiec jesli to przedluzenie to tak samo sprawdzasz ktorego buffa masz w zasiegu i potem liczysz dla niego w co moze strzelac.
Pytanie czy buff przedluza zasieg buffa? Jesli tak to zrobilbym pod spodem graf polaczen (oczywiscie trzeba go aktualizowac) i pozniej przeszukiwal wg. potrzeby.

0
To chyba źle zrobiłem dodając wszystkie wieże ( buff, attack) w jeden vector, bo w metodzie OnCreate() będę przeszukiwał wszystkie wieżyczki, w tym buffTower'y, a tych nie chcę ulepszać.

Zawsze możesz wprowadzić sprawdzanie jakiego typu jest wieżyczka, np wprowadzając nową zmienną do klasy rodzica przechowującą informację o typie wieżyczki, np 0 - buffTower, 1 - attackTower i przy przeszukiwaniu pętli wieżyczek sprawdzać co to za typ. Pewnie są i inne sposoby sprawdzania typu klasy potomnej (typeid? : http://en.cppreference.com/w/cpp/language/typeid) - ale nie stosowałem tych metod więc nie wiem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1