微视频引擎与图像类的交互
Micro video engine interactions with Image class
[我希望这适合SO,我认为这对"程序员"来说有点太实用了,对于"gamedev"来说太技术性了,但如果它不适合,请随意移动。
基本上,我只是想快速检查一下我对微型视频引擎的实际设计,该引擎应该能够简单地绘制图像(渲染库无关紧要)和动画精灵。我很难为这项任务设计一个好的设计,因为我认为渲染应该由我的 VideoEngine 类完成(因此不在图像中),但这导致我被迫使用 friend
和 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);
}
}
}
如您所见,我需要从VideoEngine
类访问Image
内部image_surface
的事实迫使我使用friend
和extern
,反之亦然(具有渲染功能的图像)只会迫使我使用完全相反的方法(VideoEngine 是 Image 的朋友,我认为这很丑陋)。
TLDR:这种双重关系可以通过任何干净的方式解决吗?我认为可以做到但需要对资源进行更多检查的一件事是每次创建图像时以某种方式通知 VideoEngine,并向其传递SDL_Surface指针以存储在列表中。这会是更好的设计吗?
令我震惊的是,除了加载图像之外,您实际上无法对图像执行任何操作。 也许你应该有某种绘图上下文界面。 也就是说,这样你就可以对screen
的一些定义说image->drawTo(x, y, screen)
?
由于您似乎肯定使用 SDL_Surface
s 作为最低级别的基元,因此使用void Image::drawTo(..., SDL_Surface* )
方法可能是有意义的。 这至少会给你一些小程度的封装。
此外,在任何地方Images
的静态或全局vector
对我来说是一个等待发生的问题。 特别是如果该vector
或其内容在初始加载后可能会发生变化。
- Qt VTK交互风格的信号到小部件
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- OpenCV EqualizeHist()从彩色图像创建黑白图像
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 平均图像时图像损坏
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- 使用FFMPEG将RGB图像序列保存到.mp4时出现问题
- 将RGB图像保存为PPM格式
- Qt Quick-如何仅从c++代码与qml属性交互
- 将图像添加到资源文件夹UWP C++
- 彩色图像的卤化物处理平均值
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 重新定位图像时如何前进到下一个内存块
- 如何使用按钮更新GTK3图像以使用C++从相机捕获图片
- 为什么 BMP 图像上的 imwrite 会卡住/不返回?
- 微视频引擎与图像类的交互
- 以交互方式将图像从Haskell后端发送到Qt QUI的最佳方法