Cześć!
Pisząc projekt spotkałem się z kompletnie niezrozumiałym problemem.
Odwołując się do metody pochodnej wyskakują mi takie błędy:
Błąd C2228 po lewej ".aktualizujPolozenie" musi być typ struct/union
Błąd C2228 po lewej ".aktualizujAnimacje" musi być typ struct/union
Błąd C2664 „void sf::draw(const sf::Vertex *,::size_t,sf::PrimitiveType,const sf::RenderStates &)”: nie można dokonać konwersji argumentu 1 z „cKupacz (__cdecl *)(sf::Vector2u)” do „const sf::Drawable &”
Jest to gra w której dziedziczenie wygląda następująco :
cAnimacja -> cPostac -> cKupacz / cWrog
Wcześniej używałem konstruktora domyślnego ale potrzebuję rozmiaru ekranu w każdej klasie dlatego zdecydowałem się dodać argument do konstruktora.
Po dodaniu konstruktorów, wywaliło mi takie błędy(up) Znalazłem taki temat: most vexing parse.
Mimo wszystko nie rozumiem tego :(
Mógłby mi to ktoś przybliżyć ?
Fragmenty kodów :
//Main.cpp
...
int main()
{
...
//----objekty----//
cKupacz* Kupacz(sf::Vector2u rozmiarOknaGry);
std::vector<cPostac*> Wrogowie;
...
//---konfiguracja---//
for (int i = 0; i < 1; i++)
{
std::unique_ptr<cWrog> w = std::make_unique<cWrog>();
Wrogowie.reserve(1);
Wrogowie.emplace_back(w);
}
//----petla gry----//
while (oknoGry.isOpen())
{
...
//----update postaci----//
Kupacz->aktualizujPolozenie(timer1.getElapsedTime().asSeconds()); // błąd, podkreśla słowo Kupacz - wyrażenie musi mieć typ wskaźnika do klasy
Kupacz->aktualizujAnimacje(timer1.getElapsedTime().asSeconds());// błąd, podkreśla słowo Kupacz - wyrażenie musi mieć typ wskaźnika do klasy
for (auto& i : Wrogowie)
{
i->aktualizujPolozenie(timer1.getElapsedTime().asSeconds()); // <- nie wiem czemu tutaj błędu akurat nie pokazuje skoro u gory pokazuje
i->aktualizujAnimacje(timer1.getElapsedTime().asSeconds()); // <-
}
//----rysowanie----//
oknoGry.clear();
oknoGry.draw(mapa);
oknoGry.draw(*Kupacz); // błąd, podkreśla kropkę - żadne wystąpienie elementu funkcja przeciążona "sf::RenderWindow::draw" nie jest zgodne z listą argumentów
// typy argumentów: (cKupacz *(sf::Vector2u rozmiarOknaGry))
// typ obiektu to: sf::RenderWindow
for (auto const & i : Wrogowie)
oknoGry.draw(*i);
oknoGry.display();
}
}
//cPostac.h
class cPostac
: public sf::Drawable, public cAnimacja
{
public:
cPostac(sf::Vector2u rozmiarOknaGry);
~cPostac() = default;
...
public:
void ustawPozycje(sf::Vector2f wspolrzedne);
virtual void aktualizujPolozenie(double pobranyCzas) = 0;
virtual void aktualizujAnimacje(double pobranyCzas) = 0;
virtual void draw(sf::RenderTarget &target, sf::RenderStates state) const = 0;
};
//cPostac.cpp
cPostac::cPostac(sf::Vector2u rozmiarOknaGry)
: rozmiarOknaGry(rozmiarOknaGry) {}
//cKupacz.h
class cKupacz
: public cPostac
{
public:
cKupacz(sf::Vector2u rozmiarOknaGry);
~cKupacz() = default;
...
public:
void draw(sf::RenderTarget &target, sf::RenderStates state) const override;
void aktualizujPolozenie(double pobranyCzas) override;
void aktualizujAnimacje(double pobranyCzas) override;
};
//cKupacz.cpp
cKupacz::cKupacz(sf::Vector2u rozmiarOknaGry)
: cPostac::cPostac(rozmiarOknaGry)
{
...
}
//cWrog.h
class cWrog
: public cPostac
{
public:
cWrog(sf::Vector2u rozmiarOknaGry);
~cWrog() = default;
...
public:
void draw(sf::RenderTarget &target, sf::RenderStates state) const override; // ovveride informujmy, że nadpisalismy draw
void aktualizujPolozenie(double pobranyCzas) override;
void aktualizujAnimacje(double pobranyCzas) override;
};
//cWrog.cpp
cWrog::cWrog(sf::Vector2u rozmiarOknaGry)
: cPostac::cPostac(rozmiarOknaGry)
{
...
}