SDL 多功能渲染

SDL Multiple Function Rendering

我希望我的游戏引擎漂亮整洁,而不是编写一堆冗余行,我宁愿包括为我做这件事的函数。

void draw::image(){
    SDL_Surface *bmp = SDL_LoadBMP("C:\Users\Joe\Documents\Visual Studio 2013\Projects\SDL_APP1\map1.bmp");
    SDL_Texture*bmptx;
    SDL_Renderer * renderer = SDL_CreateRenderer(_window, -1, 0);
    bmptx = SDL_CreateTextureFromSurface(renderer, bmp);
    SDL_FreeSurface(bmp);
    SDL_RenderCopy(renderer, bmptx, NULL, NULL);
    SDL_RenderPresent(renderer);
}

void draw::text(string q, float x, float y, float w, float h){
    SDL_SetRenderDrawColor(renderer, 64, 64, 64, 255);
    SDL_RenderDrawLine(renderer, x, y, w, h);
    SDL_RenderPresent(renderer);
    }

我的问题是我不知道如何格式化 text() 函数,以便它绘制到与 image() 函数相同的渲染器。我想要它,以便在我的主循环中,我可以同时调用文本和图像函数,它们将同时绘制到同一个渲染器。这样我就不必将它们直接编码到我的主循环中。附注我正在使用 SDL 2.

您可能希望将指向您之前创建的渲染器(可能在 main() 中)的指针传递给每个绘图函数。为您绘制的每个对象创建一个新的渲染器是非常低效的。

void draw::image(SDL_Renderer *renderer)
{
//  ...
}

void draw::text(SDL_Renderer *renderer, string q, float x, float y, float w, float h)
{
    SDL_SetRenderDrawColor(renderer, 64, 64, 64, 255);
//   ...
}

然后,在创建 window 之后,在 main() 中创建渲染器:

renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);

然后将其传递给您的绘图函数。假设您的方法是静态的,那么:

draw::image(renderer);

或者如果堆栈中有一个对象:

myDrawObject.image(renderer);

或者如果您有指向您的 draw 对象之一的指针:

myDrawPtr->image(renderer);

此外,您可能需要多考虑一下这种方法。据推测,您希望每一帧都绘制这些东西,因此使用您当前的方法,您需要 SDL 从磁盘(或磁盘缓存)加载 BMP 文件,并将其转换为纹理所需的任何内部格式,每一帧。这不太可能为您提供可接受的性能,尤其是当您希望每帧渲染多个图像时。

很有可能,更好的方法是将其中一些资源存储在 draw class 的成员变量中。但这是基本的 C++ 内容,因此您可能需要围绕 classes.

的主题进行更多阅读和教程。