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

标签 c++ performance methods sdl

我需要一些建议。我正在制作的游戏有 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/

相关文章:

Java性能: private static final String vs local String ?堆空间中创建的对象数量

java - JSP - 具有大量 HTML 代码的 Scriptlet 性能

java - 对类中的多个设置方法使用扫描仪方法

algorithm - 寻路的扩展 - 最少转弯的路径

c++ - 用指针替换循环索引器有什么好处吗?

c++ - 我可以有一个 std::vector 的模板函数指针吗?

python - Python 的 difflib 中的 SequenceMatcher 是否有可能提供一种更有效的方法来计算 Levenshtein 距离?

methods - 如何在 Rust 中将对象用作其自身方法的参数?

c++ - 访问链表中的数据成员

c++ - 如何使用CreateProcess在cmd中执行命令?