Cześć!
Pisząc grę napotkałem problem. Dziedziczenie wygląda tak : cPostac->cGracz/cWrog
Chcę przekazać wrogowi pozycję gracza, żeby mógł w niego wycelować.
cPostac ma metodę : virtual void aktualizuj(float pobranyCzas);
, cGracz nie ma potrzeby przekazywania czegoś innego niż czas więc nic nie nadpisywałem.
metoda aktualizuj aktualizuje następująco : poruszanie, animację i strzelanie. Strzelanie wymaga pozycji gracza więc wygląda to tak:
wrogów mam zapisanych w
std::vector<std::unique_ptr<cPostac>> Wrogowie;
//main.cpp
for (auto const& i : Wrogowie)
i->aktualizuj(timer1.getElapsedTime().asSeconds(), Gracz->zwrocPozycje());
void cWrog::aktualizuj(float pobranyCzas, sf::Vector2f pozcyjaGracza)
{
aktualizujAnimacje(pobranyCzas);
if (oddawanieStrzalu == false)
aktualizujPolozenie(pobranyCzas);
aktualizujStrzelanie(pobranyCzas, pozcyjaGracza);
}
->
void cWrog::aktualizujStrzelanie(float pobranyCzas, sf::Vector2f pozycjaGracza)
{
//...
wycelujStrzelba(pozycjaGracza);
//...
}
->
void cWrog::wycelujStrzelba(sf::Vector2f pozycjaGracza)
{
//algorytm celowania
}
Wiem, że to może być bez sensu takie przekazywanie ale chcę rozbijać te funkcje na jak najprostsze no i nie chcę w mainie wywoływać każdej funkcji (aktualizuj polozenie, animacje strzelanie) bo nie zawsze aktualizuje je na raz w logice gry.
Korzystając z tego tematu zbudowałem podobny program, który obrazuje moją sytuację:
#include <iostream>
#include <vector>
#include <memory>
struct A {
virtual void Show() const { std::cout << __FUNCTION__ << '\n'; }
};
struct B : public A {
virtual void Show(int a) const { std::cout << __FUNCTION__ << a << '\n'; }
};
struct C : public A {
virtual void Show(int a, int b) const { std::cout << __FUNCTION__ << a << b << '\n'; }
};
int main() {
std::vector<A> objects;
objects.push_back(B{});
objects.push_back(C{});
std::vector<std::unique_ptr<A>> ptrs;
ptrs.push_back(std::make_unique<B>());
ptrs.push_back(std::make_unique<C>());
std::cout << "Kontener objects: \n";
objects[0].Show();
objects[1].Show(1);
objects[2].Show(1, 2);
std::cout << "Kontener ptrs: \n";
ptrs[0]->Show();
ptrs[1]->Show(1);
ptrs[2]->Show(1, 2);
std::cin.get();
}
w przekazywaniu Show() intów wywala błąd, bez wartości działa poprawnie. Jak mogę rozwiązać ten problem ?