在运行时将mainclass对象的类型更改为子类

时间:2014-03-24 22:44:07

标签: c++ sfml

首先,我很抱歉这个头衔,无法想出一些简短的描述我的问题。

我所拥有的是基于文本的冒险游戏"。我有一个名为Game的主要类,我有游戏循环等,我还有一个名为Screen的类,还有一个名为Screen_One的Screen子类,以及Screen_Two等等,用于多个不同的&#34 ;屏幕"我想要在我的游戏中。

所以我在Screen中有的是sf :: Texture和sf :: Sprite。 Screen_One和Two都使用不同的值初始化它们各自构造函数中的值(在这种情况下它只是一个背景纹理)。

这就是我的问题,我的Game类有一个Screen类型的对象,我想根据我在游戏中的位置进行更改,所以基本上我想将Screen初始化为Game构造函数中的Screen_One对象,并且当我在游戏中进展到Screen_Two时,我想将该Screen对象更改为Screen_Two对象,从而为我当前所在的屏幕获得正确的背景。

我现在拥有的东西(不起作用的是这样的)

Screen_One的构造函数

Screen_One::Screen_One(void)
{
    Texture.loadFromFile("filename.png"); // background for screen_one
    Sprite.setTexture(Texture);
}

在Game类中:

Game::Game(void) : mWindow(sf::VideoMode(640, 480), "Game") // Game constructor
{
    sc = Screen_One(); // sc is a declared like "Screen sc" in Game.h
}

void Game::render() // this function runs inside the game loop
{
    //draw some stuff
    mWindow.draw(this->sc.Sprite);
}

此代码运行,但它只是给我一个白色背景(所以基本上它什么都没画)。所以这种做法显然不起作用,但我希望你能理解我想做什么,也许可以修复或给我另一种方法来实现同样的目的。

编辑:tl; dr我可以有一个Screen类型的对象,然后在运行时将Screen对象分配给Screen_One或Screen_Two,以便例如更改背景。

1 个答案:

答案 0 :(得分:1)

在此代码中

sc = Screen_One();

正在发生的事情是Screen_One的Screen部分被复制到sc中,而不是整个对象,因为sc没有足够的空间。这假设您没有覆盖=运算符。

要解决您的问题,sc应该是指向Screen的指针。宣言将是

Screen *sc;

然后在Game构造函数中,初始化指向Screen_One类型的新对象的指针:

sc = new Screen_One();

如果要更改屏幕,请删除旧屏幕并使sc指向Screen_Two的新实例:

delete sc;
sc = new Screen_Two();