0

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

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

// 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);
        }
    }
}

正如你所看到的,我需要从类image_surface中访问的事实迫使我使用和做相反的事情(图像具有渲染功能)只会迫使我使用完全相反的(VideoEngine 是图像的朋友,我认为这很丑陋)。ImageVideoEnginefriendextern

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

4

1 回答 1

0

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

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

此外,在任何地方都有一个静态的或全局vectorImages让我觉得这是一个等待发生的问题。特别是如果它vector或其内容在初始加载后会发生变化。

于 2012-07-03T04:10:18.083 回答