我希望我的游戏引擎整洁而不是编码一堆冗余线,我宁愿包含为我这样做的功能。
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。
答案 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 ++内容,所以你可能想要围绕课程主题做更多的阅读和教程。