使用硬件渲染器

本节,我们要介结构体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(渲染器渲染的窗口, 渲染器的索引,-1 表示默认的那个,你也可以填其他数值, 渲染器类型;这里我要得是加速器SDL_RENDERER_ACCELERATED)

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

运行程序

view code

我们来看看使用了切割参数的程序

  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);

运行程序

view code

来个旋转的程序玩玩~

  //旋转中心
  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);

运行程序

view code

函数SDL_RenderCopyEx

提供了三个额外的参数,可以实现旋转,第一个参数是旋转的角度,直接用数值表示多少度即可,第二个是旋转中心,第三个是其他的特效,是否翻转图片。
反馈 上一节 目录 下一节 回到顶部
Copyright © 2014 冯世昌 保留所有权利