一个很好的OO方式来做到这一点(c ++)

时间:2011-12-17 06:20:37

标签: c++ performance methods sdl

我需要一些建议。我有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这样的错误? <<我得到这样的错误。

2 个答案:

答案 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)函数。