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.
的主题进行更多阅读和教程。
我希望我的游戏引擎漂亮整洁,而不是编写一堆冗余行,我宁愿包括为我做这件事的函数。
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.