一个好的面向对象的方式来做这件事(C++)

3
我需要一些建议。我正在制作一个游戏,有两个类:
Graphics Sprite Sprite类包含图像缓冲、偏移量(x,y)以及宽度和高度。Graphics类有一个屏幕缓冲区,可以像Sprite的图像缓冲一样将内容贴到其中。
有没有推荐的方法可以将Sprite的图像缓冲区贴到Graphics屏幕缓冲区?我有两个想法:
在Sprite类中创建一个如下的方法:
```java public void blit_to(buffer) { buffer.blit(this.image_buffer, this.offset) } ```
或者,在Graphics类中创建一个如下的方法:
```java public void blit(sprite) { this.buffer.blit(sprite.image_buffer, sprite.offset) } ```
你有什么建议吗?谢谢!
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等错误的情况下完成这个操作? << 我遇到了这样的错误。


3
请问,“谁负责绘制精灵?” - Mitch Wheat
屏幕需要这样做,但为了实现这一点,我必须将精灵的图像公开,我认为这不是一个好的做法。 - evolon696
2个回答

2

通常的方法是在您的Graphics对象中拥有一个容器,其中包含场景中的所有精灵。您的主循环将调用Graphics::blit(),然后Graphics对象会迭代遍历精灵容器,并对每个精灵调用Sprite::blit(SDL_Surface* screen)函数,将其屏幕缓冲区传递给它。


2
我不知道你的精灵类是否只是一个低级别的渲染元素(基本上只是SDL_Surface*的包装器),还是它已经是你游戏中实际表示生物的表现形式。在后一种情况下,作为你不同解决方案的替代方案,你可以仅在精灵类中保留位图的ID,以及其他属性,如坐标、大小、速度等。而依赖于渲染技术的实际代码则放在另一组类中,例如“Graphics”、“BitmapCollection”等。
因此,一方面,你将拥有一个“干净”的精灵类,具有简单的属性,如位置、大小、速度等;另一方面,则是“肮脏的东西”,包含低级别的SDL_nnn对象和调用。有一天,那个ID将不再代表位图,而是例如3D模型。
这将得到以下结果:
void handleRendering()
{
    graphics.blit( bitmapCollection.Get( sprite.getImageId());
}

我不确定精灵的图像是否必须是私有的或只读的。多个精灵可以共享同一张图片,其他类别如“特效”可以修改精灵位图,交换它们,在屏幕上制作半透明的幽灵等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接