微视频引擎与Image类的交互

时间:2012-07-03 03:01:22

标签: c++ sdl sprite game-engine

[我希望这对于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,这迫使我使用VideoEnginefriend另一种方式(具有渲染功能的图像)只会迫使我使用完全相反的(VideoEngine是Image的朋友,我认为这很丑陋)。

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

1 个答案:

答案 0 :(得分:0)

除了加载它之外,你不能对你的Image做任何事情。也许你应该有某种绘图上下文界面。即以便您可以对image->drawTo(x, y, screen)的某些定义说出screen

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

此外,在任何地方拥有静态或全局vector的{​​{1}}都会让我感到困惑,等待发生。特别是如果Images或其内容在初始加载后可能会发生变化。