这是一种很好的OO方法(c++)



我需要一些建议。对于我正在制作的游戏,我有两个类别,它们是:

图形雪碧

Sprite类由图像缓冲区、(x, y)偏移量、宽度和高度组成。图形类有一个屏幕缓冲区。屏幕缓冲区可以像精灵的图像缓冲区那样被比特化。

是否有任何推荐的方法将精灵的图像缓冲区比特化到图形屏幕缓冲区?我有两个想法:

有一个这样的方法(在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到non-const这样的错误?& lt; & lt;我得到了这样的错误

我不知道你的精灵类是否只是一个低级渲染元素(所以,基本上只是SDL_Surface*的包装),或者它是否已经是游戏中生物的实际代表。在后一种情况下,作为不同解决方案的替代方案,你只能在精灵类中保留位图的id,以及其他属性,如坐标、大小、速度……而实际的代码依赖于渲染技术在一组单独的类中,如"Graphics","BitmapCollection"…

所以一方面,你将拥有一个带有简单属性的"干净"精灵类,如位置、大小、速度……另一边是"脏东西",使用低级SDL_nnn对象和调用。有一天,这个id将不再代表位图,而是代表3D模型。

会得到这样的结果:

void handleRendering()
{
    graphics.blit( bitmapCollection.Get( sprite.getImageId());
}

我不知道一个精灵的图像是否真的必须是私有的或只读的。多个精灵可以共享相同的图像,其他类如"SpecialEffects"可以修改精灵位图,交换它们,在屏幕上制作半透明的跟随鬼等等。

一种常见的方法是在你的图形对象中设置一个容器来保存场景中的所有精灵。你的主循环将调用Graphics::blit(),而Graphics对象将遍历精灵容器,并在每个经过屏幕缓冲区的精灵上调用Sprite::blit(SDL_Surface* screen)函数。

最新更新