我需要一些建议。我正在制作的游戏有 2 个类(class),这些类(class)是:
图形 Sprite
Sprite 类由图像的图像缓冲区、(x, y) 偏移量以及宽度和高度组成。图形类有一个屏幕缓冲区。屏幕缓冲区可以像 Sprite 的图像缓冲区一样将内容写入它。
是否有任何推荐的方法可以将 Sprite 的图像缓冲区传输到图形屏幕缓冲区?我有两个想法:
有一个像这样的方法(在 Sprite 类中):
void Sprite::blit(SDL_Surface* screen)
{
// code goes here
}
或者这个(在图形类中):
void Graphics::blit(Sprite sprite)
{
// code
}
甚至这个(也在图形类中):
void Graphics::blit(SDL_Surface* aSpritesImageBuffer)
{
// code
}
所有这些都存在问题。在这两个类中,我都使用封装来隐藏 Sprite 的图像缓冲区和图形组件的屏幕缓冲区。它们作为常量返回,因此没有人可以在不使用类中提供的函数的情况下操纵它们。我是这样做的:
class Graphics
{
public:
const getScreenBuffer() const {return screenBuffer;}
private:
screenBuffer;
};
^ 与 Sprite 的图像缓冲区相同。
所以如果我尝试(在我的主课上)
void handleRendering()
{
graphics.blit(sprite.getImageBuffer());
}
那不是很好吗?
甚至:
void handleRendering()
{
graphics.blit(sprite);
}
我觉得这不好:
void handleRendering()
{
sprite.blit(graphics.getScreenBuffer());
}
有没有更好的方法可以做到这一点而不会出现诸如 const 到 non-const 之类的错误? << 我收到这样的错误。
最佳答案
我不知道您的 sprite 类是否只是一个低级渲染元素(因此,基本上只是 SDL_Surface* 的包装器),或者它是否已经是您游戏中生物的实际表示。在后一种情况下,作为不同解决方案的替代方案,您只能在 sprite 类中保留位图的 id,以及其他属性,如坐标、大小、速度……以及依赖于渲染技术的实际代码单独的一组类,例如“Graphics”、“BitmapCollection”...
因此,一方面,您将拥有一个“干净”的 Sprite 类,具有简单的属性,如位置、大小、速度……而另一方面,“肮脏的东西”,具有低级 SDL_nnn 对象和调用。有一天,该 ID 将不再代表位图,而是代表 3D 模型。
那会给出类似的东西:
void handleRendering()
{
graphics.blit( bitmapCollection.Get( sprite.getImageId());
}
我不知道 Sprite 的图像是否真的必须是私有(private)的或只读的。多个 sprite 可以共享相同的图像,其他类(如“SpecialEffects”)可以修改 sprite 位图、交换它们、在屏幕上使半透明跟随重影等等。
关于c++ - 一个很好的 OO 方法来做到这一点 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8543036/