Permalänk

rita ut 2 objekt c++ SFML

Hej försöker ha 1 klass där objekt ska ritas ut/uppdateras. Nu när jag försöker skriva ut dessa 2 objekt som kommer from olika klasser så kraschar programmet. Det fungerar rita ut dom var för sig, men när båda ska ritas ut samtidigt så kraschar det.

class Object { private: Alien * alien; Player *player; public: void upDate(float); void draw(sf::RenderWindow &WINDOW); Object(float newRow, int type); Object(float xPos, float yPos); ~Object(); };

Object::Object(float xPos, float yPos) { this->player = new Player(xPos, 860); } Object::Object(float newRow, int type) { this->alien = new Alien(newRow, type); } void Object::draw(sf::RenderWindow &WINDOW) { WINDOW.clear(); this->player->draw(WINDOW); this->alien->draw(WINDOW); }

Någon som vet vad för fel som görs?

Visa signatur

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Permalänk
Medlem

Du måste instansiera både player och alien i konstruktorn som används. Nu är antingen den ena eller den andra null beroende på vilken konstruktor som används.

Skickades från m.sweclockers.com

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Skrivet av RiJo:

Du måste instansiera både player och alien i konstruktorn som används. Nu är antingen den ena eller den andra null beroende på vilken konstruktor som används.

Skickades från m.sweclockers.com

Hur ska det gå till om man vill skicka med olika paramatrar till de olika objekten då? För parameter listorna skiljer mellan objekten.

Visa signatur

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Permalänk
Medlem

Antingen får du lägga in en null-check för player och alien i draw(), eller så skapar du en klass per objekt-typ (och då kanske använda Object-klassen som basklass). Min rekommendation är det senare.

Skickades från m.sweclockers.com

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Skrivet av RiJo:

Antingen får du lägga in en null-check för player och alien i draw(), eller så skapar du en klass per objekt-typ (och då kanske använda Object-klassen som basklass). Min rekommendation är det senare.

Skickades från m.sweclockers.com

Men när det gäller basklass, är det inte så att subklasserna får tillgång till basklassen och inte basklassen till subklasserna? Eller fungerar det på båda hållen?

Visa signatur

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |

Permalänk
Medlem
Skrivet av turbogeten:

Men när det gäller basklass, är det inte så att subklasserna får tillgång till basklassen och inte basklassen till subklasserna? Eller fungerar det på båda hållen?

Jo, det är så det fungerar (om man bortser från private, protected, etc). Men basklassen kan deklarera funktioner som definieras i subklasserna:

class Object { public: virtual void draw(const sf::RenderWindow &WINDOW) = 0; }; class Alien : public Object { private: SFML::xx *x; public: Alien(float newRow, int type) { ... } virtual void draw(const sf::RenderWindow &WINDOW) override { x->draw(WINDOW); } }; class Player : public Object { private: SFML::yy *y; public: Player(float xPos, float yPos) { ... } virtual void draw(const sf::RenderWindow &WINDOW) override { y->draw(WINDOW); } };

Vilket leder till att man använda polymorfism (generalisera hantering av objekt genom gemensam basklass) för att göra följande:

std::vector<Object *> foo; foo.push_back(new Alien(a, b)); foo.push_back(new Player(c, d)); ... sf::RenderWindow win; ... win.clear(); // Notera: loopen är C++11 syntax for (auto object: foo) object->draw(win);

Vad var anledningen till att du slog ihop klasserna (antar alien och player) i första hand?

Edit: fixade lite slarvfel i koden.

Visa signatur

..:: RiJo ::..
Computer: Lenovo X300
Platform: Gentoo

Permalänk
Skrivet av RiJo:

Jo, det är så det fungerar (om man bortser från private, protected, etc). Men basklassen kan deklarera funktioner som definieras i subklasserna:

class Object { public: virtual void draw(const sf::RenderWindow &WINDOW) = 0; }; class Alien : public Object { private: SFML::xx *x; public: Alien(float newRow, int type) { ... } virtual void draw(const sf::RenderWindow &WINDOW) override { x->draw(WINDOW); } }; class Player : public Object { private: SFML::yy *y; public: Player(float xPos, float yPos) { ... } virtual void draw(const sf::RenderWindow &WINDOW) override { y->draw(WINDOW); } };

Vilket leder till att man använda polymorfism (generalisera hantering av objekt genom gemensam basklass) för att göra följande:

std::vector<Object *> foo; foo.push_back(new Alien(a, b)); foo.push_back(new Player(c, d)); ... sf::RenderWindow win; ... win.clear(); // Notera: loopen är C++11 syntax for (auto object: foo) object->draw(win);

Vad var anledningen till att du slog ihop klasserna (antar alien och player) i första hand?

Edit: fixade lite slarvfel i koden.

Okej tack. Har ett UML att följa och sen så vill jag kolla kollisioner med alien, spelare och skott som finns inuti player. Antar det är lättast att kontrollera allt sådant här i en gemensam update.

Visa signatur

CPU: Intel core i5 3450 | GPU: Asus Radeon HD 7870 | PSU: Corsair GS 600W | Moderkort: MSI b75a-g43 | HDD WD blue 500 GB | RAM: Crucial ballistiX 2x4gb DDR3 1600MHz | Ljudkort: Asus Xonar DG |