一个很好的OO方式来做到这一点(C++)
我需要一些建议。我有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的任何更好的方法? < <我得到这样的错误。
我不知道你的精灵类是否只是一个低级渲染元素(所以,基本上只是SDL_Surface *的包装),或者它已经是你游戏中生物的实际表示。在后一种情况下,作为您不同解决方案的替代方案,您只能在精灵类中保留一个位图id,以及坐标,大小,速度等其他属性......并且实际的代码依赖于渲染技术单独的一组类,如“图形”,“BitmapCollection”... ...
因此,一方面,你将有一个“干净”的精灵类与简单的属性,如位置,大小,速度...和另一方方面,“脏东西”,低级SDL_nnn对象和调用。有一天,该ID不会代表位图,而是例如3D模型。
这将使这样的事情:
void handleRendering()
{
graphics.blit(bitmapCollection.Get(sprite.getImageId());
}
我不知道精灵的形象真的必须是私人或只读。几个精灵可以共享相同的图像,像“SpecialEffects”这样的其他类可以修改精灵位图,交换它们,在屏幕上制作半透明的重影,等等。
这样做的一种常见方法是在Graphics对象中放置一个容器,该容器包含场景中的所有精灵。您的主循环将调用Graphics::blit()
,Graphics对象将遍历精灵容器,并在每个传递其屏幕缓冲区的函数上调用Sprite::blit(SDL_Surface* screen)
函数。
问问自己“谁来负责绘制精灵?” – 2011-12-17 06:24:10