我需要一些建议。我有2个课程,我正在制作一个游戏,那些课程是:
图形 精灵
sprite类由图像的图像缓冲区,(x,y)偏移量,宽度和高度组成。图形类有一个屏幕缓冲区。屏幕缓冲区可以像精灵的图像缓冲区一样对它进行blitting。
有没有推荐的方法将精灵的图像缓冲区blitting到图形屏幕缓冲区?我有两个想法:
有这样的方法(在sprite类中):
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到非const这样的错误? <<我得到这样的错误。
答案 0 :(得分:2)
我不知道你的精灵类是否只是一个低级渲染元素(因此,基本上只是SDL_Surface *的包装),或者它是否已经是游戏中生物的实际表示。在后一种情况下,作为不同解决方案的替代方案,您只能在精灵类中保留位图的id,以及坐标,大小,速度等其他属性......以及依赖于渲染技术的实际代码。单独的一组类,如“Graphics”,“BitmapCollection”......
所以一方面,你会有一个“干净”的sprite类,它具有简单的属性,如位置,大小,速度......另一方面,“脏东西”,具有低级SDL_nnn对象和调用。有一天,该ID不代表位图,而是例如3D模型。
那会有类似的东西:
void handleRendering()
{
graphics.blit( bitmapCollection.Get( sprite.getImageId());
}
我不知道精灵的图像是真的必须是私有的还是只读的。几个精灵可以共享相同的图像,其他类如“SpecialEffects”可以修改精灵位图,交换它们,在屏幕上制作半透明跟随鬼等等。
答案 1 :(得分:2)
执行此操作的常用方法是在Graphics对象中包含一个容器,该容器包含场景中的所有精灵。您的主循环将调用Graphics::blit()
,并且Graphics对象将遍历sprite的容器并在每个传递其屏幕缓冲区的函数上调用Sprite::blit(SDL_Surface* screen)
函数。