2014-03-24 41 views
0

首先,我爲標題感到抱歉,無法想出一些簡短的內容來描述我的問題。在運行時將主類對象的類型更改爲子類

我所擁有的是「基於文本的冒險遊戲」。我有一個叫做Game的主類,我有遊戲循環等,我也有一個叫Screen的類,還有一個叫Screen_One和Screen_Two等的Screen類的子類,用於我想要的許多不同的「屏幕」遊戲。

所以我在屏幕裏面有一個sf :: Texture和sf :: Sprite。 Screen_One和Two都使用不同的值初始化它們各自的構造函數中的值(在這種情況下,它只是一個背景紋理)。

我的問題在於,我的Game類有一個類型爲Screen的對象,我想根據遊戲中的位置來更改它,所以基本上我想將Screen作爲Screen_One對象初始化爲Game構造函數,當我在遊戲中進展到Screen_Two時,我想將該屏幕對象更改爲Screen_Two對象,並因此爲我當前所在的屏幕獲取正確的背景。

我有什麼現在(不工作是這樣的)

Screen_One的構造

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

遊戲類中:

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

在這段代碼

sc = Screen_One(); 

正在發生的事情是,Screen_One的屏幕部分被複制到SC,而不是整個對象,如SC沒有足夠的空間吧。這假設你沒有覆蓋=運算符。

要解決您的問題,sc應該是一個指向屏幕的指針。該聲明將

Screen *sc; 

再在遊戲的構造函數,指針初始化類型Screen_One的新對象:

sc = new Screen_One(); 

當你想改變屏幕,刪除舊的屏幕,並在SC點到Screen_Two的新實例:

delete sc; 
sc = new Screen_Two(); 
+0

試過這個,並得到mWindow.draw(sc.Sprite)的錯誤;說「表達式必須有類型」爲什麼? – Jacco

+0

sc現在是一個指針,所以你需要說'sc-> Sprite' –

+0

啊,當然!非常感謝。 – Jacco