SDL多功能渲染

时间:2015-10-30 01:02:38

标签: c++ textures rendering sdl game-engine

我希望我的游戏引擎整洁而不是编码一堆冗余线,我宁愿包含为我这样做的功能。

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。

1 个答案:

答案 0 :(得分:0)

您可能希望将指向先前创建的渲染器(可能在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);
//   ...
}

然后,在您创建窗口后的main()中,您将创建渲染器:

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

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

draw::image(renderer);

或者如果堆栈中有对象:

myDrawObject.image(renderer);

或者如果你有一个指向draw个对象的指针:

myDrawPtr->image(renderer);

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

更有可能的是,更好的方法是将一些资源存储在draw类中的成员变量中。但这是基本的C ++内容,所以你可能想要围绕课程主题做更多的阅读和教程。