[我希望这对于SO来说是合适的,我认为对于“程序员”来说它太实用了,而且对于“gamedev”来说太技术化了,但是如果它不合适的话就随意移动。]
基本上我只想快速检查一下微视频引擎的实际设计,它应该能够简单地绘制图像(渲染库无关紧要)和动画精灵。虽然因为我认为渲染应该由我的VideoEngine类完成(因此不在Image中),但是我很难绕过这个任务的好设计,但这导致我被迫使用friend
和{ {1}}我听说这不是好设计。这可能是因为我没有正确编码,但我认为这更像是一个设计问题。
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
内访问Image
,这迫使我使用VideoEngine
和friend
另一种方式(具有渲染功能的图像)只会迫使我使用完全相反的(VideoEngine是Image的朋友,我认为这很丑陋)。
TLDR:这种双重关系是否可以通过任何干净的方式解决?我认为有一件事可能是可行的,但会产生更多的资源检查,每次创建图像时都会以某种方式通知VideoEngine,并将SDL_Surface指针传递给列表存储。这会是更好的设计吗?
答案 0 :(得分:0)
除了加载它之外,你不能对你的Image做任何事情。也许你应该有某种绘图上下文界面。即以便您可以对image->drawTo(x, y, screen)
的某些定义说出screen
?
由于您似乎肯定使用SDL_Surface
s作为最低级别原语,因此使用void Image::drawTo(..., SDL_Surface* )
方法可能是有意义的。这至少会给你一些小程度的封装。
此外,在任何地方拥有静态或全局vector
的{{1}}都会让我感到困惑,等待发生。特别是如果Images
或其内容在初始加载后可能会发生变化。