微视频引擎与图像类的交互

Micro video engine interactions with Image class

本文关键字:交互 图像 视频 引擎      更新时间:2023-10-16

[我希望这适合SO,我认为这对"程序员"来说有点太实用了,对于"gamedev"来说太技术性了,但如果它不适合,请随意移动。

基本上,我只是想快速检查一下我对微型视频引擎的实际设计,该引擎应该能够简单地绘制图像(渲染库无关紧要)和动画精灵。我很难为这项任务设计一个好的设计,因为我认为渲染应该由我的 VideoEngine 类完成(因此不在图像中),但这导致我被迫使用 friendextern 正如我所听到的那样,这不是好的设计。这可能是因为我没有正确编码,但我认为这更像是一个设计问题。

// Sprite.h
class Image
{
public:
    Image();
    Image(std::string path);
    ~Image();
    bool IsDisplayable() { return displayed; }
    void LoadImage(std::string path);
    static std::vector<Image*> image_list;
private:
    SDL_Surface*    image_surface;
    bool            displayed;
    friend class    VideoEngine;
};
// VideoEngine.h
extern class Image;
class VideoEngine
{
public:
    VideoEngine();
    VideoEngine(int width, int height);
    ~ VideoEngine();
    void Initialize(int width, int height);
    void RenderImages();
    void ShutdownVE();
private:
    SDL_Surface*    main_display;
    SDL_Rect        main_display_area;
};
// VideoEngine.cpp
void VideoEngine::RenderImages()
{
    std::vector<Image*>::const_iterator ci;
    for(ci = Image::image_list.cbegin(); ci != Image::image_list.cend(); ci++)
    {
        if((*ci) != 0 && (*ci)->IsDisplayable())
        {
            SDL_BlitSurface((*ci)->image_surface, 0, main_display, 0);
            SDL_Flip(main_display);
        }
    }
}

如您所见,我需要从VideoEngine类访问Image内部image_surface的事实迫使我使用friendextern,反之亦然(具有渲染功能的图像)只会迫使我使用完全相反的方法(VideoEngine 是 Image 的朋友,我认为这很丑陋)。

TLDR:这种双重关系可以通过任何干净的方式解决吗?我认为可以做到但需要对资源进行更多检查的一件事是每次创建图像时以某种方式通知 VideoEngine,并向其传递SDL_Surface指针以存储在列表中。这会是更好的设计吗?

令我震惊的是,除了加载图像之外,您实际上无法对图像执行任何操作。 也许你应该有某种绘图上下文界面。 也就是说,这样你就可以对screen的一些定义说image->drawTo(x, y, screen)

由于您似乎肯定使用 SDL_Surface s 作为最低级别的基元,因此使用void Image::drawTo(..., SDL_Surface* )方法可能是有意义的。 这至少会给你一些小程度的封装。

此外,在任何地方Images的静态或全局vector对我来说是一个等待发生的问题。 特别是如果该vector或其内容在初始加载后可能会发生变化。