我對繼承有點困惑。我創建了一個敵人類并用這樣的向量呼叫敵人:
class enemy
{
public:
sf::RectangleShape rect;
float bottom, left, right, top;
sf::Texture enemytexture;
sf::Sprite enemysprite;
enemy(sf::Vector2f position, sf::Vector2f size, sf::Color color)
{
rect.setPosition(position);
rect.setSize(size);
rect.setFillColor(color);
enemytexture.loadFromFile("npc1.png");
enemysprite.setTexture(enemytexture);
}
void update(){
//////}
};
class goblin : public enemy
{
public:
goblin(sf::Vector2f position, sf::Vector2f size, sf::Color color);
void update()
{
enemytexture.loadFromFile("npc2.png");
enemysprite.setTexture(enemytexture);
};
};
std::vector<std::unique_ptr<enemy>> enemies1;
enemies1.emplace_back(std::unique_ptr<enemy>(
new enemy(sf::Vector2f(100, 100), sf::Vector2f(15, 10), sf::Color(255, 255, 255, 255))));
enemies1.emplace_back(std::unique_ptr<enemy>(new goblin::enemy(
sf::Vector2f(100, 100), sf::Vector2f(15, 10), sf::Color(255, 255, 255, 255))));
但我想繪制不同的敵人和精靈,如妖精等。在這個示例中,我只為敵人和妖精類繪制 npc1.png。有可能這樣做還是我需要創建另一個類?我搜索了一些關于繼承的教程,但我無法解決我的問題。請我將不勝感激每一個建議或幫助。
uj5u.com熱心網友回復:
添加virtualveforevoid update的enemy; 在零開銷原則下,C 不會實作動態調度,除非你要求它。
還要添加virtual ~enemy()=default;以便正確清理派生類資料。
uj5u.com熱心網友回復:
class enemy
{
public:
/* snip */
// add a virtual dtor to the base class
virtual ~enemy() {}
// declare your base class methods as virtual
virtual void draw() {}
virtual void update() {}
};
class goblin : public enemy
{
public:
// and now in the derived class, you can overload
// the methods for that type
void draw() override {
// code to draw goblin
}
void update() override {
// code to update goblin
}
};
// all of your games enemies
std::vector<std::unique_ptr<enemy>> enemies1;
// now you can draw all of your enemies in one go
void drawAll() {
for(const auto& ptr : enemies1) {
ptr->draw();
}
}
// of update your enemies in one go
void updateAll() {
for(const auto& ptr : enemies1) {
ptr->update();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/353731.html
上一篇:0xe foo是如何決議的?
