本节,我们要介结构体SDL_Renderer和SDL_Texture,不要问我他们是啥,一个叫渲染器,一个我称它为贴图(直译为纹理),这两个东西也是用来绘图的,有人会问,与Surface绘图有啥区别?答案是快,好,Surface绘图靠CPU,Renderer绘图靠的是专门处理图形的处理器(叫啥来着忘了……),干活还是用专业的好,嘿嘿。好咯,先说说怎么绘图的(常规的):加载图片为Surface,通过函数转换为Texture再用Renderer绘制到屏幕上。我们来通过代码一步一步解说,先看全局变量部分。
//渲染器 SDL_Renderer *Renderer = NULL; //纹理贴图 SDL_Texture *Texture = NULL;
这里我加了一个Renderer和Texture,Texture是与Surface一样,用来绘制窗口的,不同的是用Renderer来操作Texture,比用Surface来Blit要快,要好……
//创建渲染器 Renderer = SDL_CreateRenderer(Window, -1, SDL_RENDERER_ACCELERATED);
为窗口创建一个渲染器(只能创建一个哦~),这样我们就可以通过这个渲染(画……)我们的窗口,来看看参数……SDL_CreateRenderer(
Texture = SDL_CreateTextureFromSurface(Renderer, Surface);用Renderer渲染器通过一个Surface创建Texture
//清理渲染器 SDL_RenderClear(Renderer); //复制绘图后的表面至渲染器 SDL_RenderCopy(Renderer, Texture, NULL, NULL);绘图,和BlitScaled函数使用方式差不多,第一个参数填用来绘图的渲染器,第二个是它的一个Texture,最后两个参数,第一个用来指定渲染屏幕的区域,第二个是指定渲染Texture的哪一区域。
//刷新 SDL_RenderPresent(Renderer);刷新渲染器,类似
SDL_UpdateWindowSurface
运行程序
我们来看看使用了切割参数的程序
SDL_Rect Cut, Box; //切割表面的区域 Cut.x = 0; Cut.y = 0; Cut.w = 28; Cut.h = 28; //粘贴表面的盒子 Box.x = 50; Box.y = 50; Box.w = 100; Box.h = 100; //从表面创建贴图 Texture = SDL_CreateTextureFromSurface(Renderer, Surface); //清理渲染器 SDL_RenderClear(Renderer); //复制绘图后的表面至渲染器 SDL_RenderCopy(Renderer, Texture, &Cut, &Box); //刷新 SDL_RenderPresent(Renderer);
运行程序
来个旋转的程序玩玩~
//旋转中心 SDL_Point center; center.x = 0; center.y = 0; //旋转角度 30度 int angel = 30; //切割和粘贴用的矩形参数 SDL_Rect Cut, Box; //切割表面的区域 Cut.x = 0; Cut.y = 0; Cut.w = 28; Cut.h = 28; //粘贴表面的盒子 Box.x = 50; Box.y = 50; Box.w = 100; Box.h = 100; //从表面创建贴图 Texture = SDL_CreateTextureFromSurface(Renderer, Surface); //清理渲染器 SDL_RenderClear(Renderer); //复制绘图后的表面至渲染器 SDL_RenderCopyEx(Renderer, Texture, &Cut, &Box, angel, ¢er, SDL_FLIP_NONE); // SDL_FLIP_HORIZONTAL 水平翻转 // SDL_FLIP_VERTICAL 垂直翻转 // SDL_FLIP_NONE 无 //刷新 SDL_RenderPresent(Renderer);
运行程序
函数SDL_RenderCopyEx