2011-12-17 73 views
3

我需要一些建議。我有2類遊戲,我想提出,這些類別是:一個很好的OO方式來做到這一點(C++)

圖形 精靈

精靈類由圖像緩衝器的用於圖像中,(X,Y)偏移,以及寬度和高度。圖形類有一個屏幕緩衝區。屏幕緩衝區可能會讓事情發生,像精靈的圖像緩衝區。

有沒有推薦的方法將精靈的圖像緩衝區傳輸到圖形屏幕緩衝區?我有2種思路:

有這樣的方法(在子畫面類):

void Sprite::blit(SDL_Surface* screen) 
{ 
    // code goes here 
} 

或此(在圖形類):

void Graphics::blit(Sprite sprite) 
{ 
    // code 
} 

或甚至本(也以圖形類):

void Graphics::blit(SDL_Surface* aSpritesImageBuffer) 
{ 
    // code 
} 

所有這些問題都存在。在這兩個類中,我使用封裝來隱藏精靈的圖像緩衝區和圖形組件的屏幕緩衝區。它們會作爲一個常量返回,因此如果不使用類中提供的函數,就不能操縱它們。這是我怎麼做的:

class Graphics 
{ 
public: 
    const getScreenBuffer() const {return screenBuffer;} 
private: 
    screenBuffer; 
}; 

^與精靈的圖像緩衝區相同。

所以,如果我試圖(在我的主類)

void handleRendering() 
{ 
    graphics.blit(sprite.getImageBuffer()); 
} 

那會不會是很好?

甚至:

void handleRendering() 
{ 
    graphics.blit(sprite); 
} 

,我不認爲這是件好事:

void handleRendering() 
{ 
    sprite.blit(graphics.getScreenBuffer()); 
}    

都沒有這樣做沒有得到這樣的錯誤常量到非const的任何更好的方法? < <我得到這樣的錯誤。

+3

問問自己「誰來負責繪製精靈?」 – 2011-12-17 06:24:10

回答

2

我不知道你的精靈類是否只是一個低級渲染元素(所以,基本上只是SDL_Surface *的包裝),或者它已經是你遊戲中生物的實際表示。在後一種情況下,作爲您不同解決方案的替代方案,您只能在精靈類中保留一個位圖id,以及座標,大小,速度等其他屬性......並且實際的代碼依賴於渲染技術單獨的一組類,如「圖形」,「BitmapCollection」... ...

因此,一方面,你將有一個「乾淨」的精靈類與簡單的屬性,如位置,大小,速度...和另一方方面,「髒東西」,低級SDL_nnn對象和調用。有一天,該ID不會代表位圖,而是例如3D模型。

這將使這樣的事情:

void handleRendering() 
{ 
    graphics.blit(bitmapCollection.Get(sprite.getImageId()); 
} 

我不知道精靈的形象真的必須是私人或只讀。幾個精靈可以共享相同的圖像,像「SpecialEffects」這樣的其他類可以修改精靈位圖,交換它們,在屏幕上製作半透明的重影,等等。

2

這樣做的一種常見方法是在Graphics對象中放置一個容器,該容器包含場景中的所有精靈。您的主循環將調用Graphics::blit(),Graphics對象將遍歷精靈容器,並在每個傳遞其屏幕緩衝區的函數上調用Sprite::blit(SDL_Surface* screen)函數。

相關問題