2011-12-17 70 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)函数。

相关问题