[笔记]音视频学习之SDL篇《二》 绘制平铺的背景图并居中放置另一图片

简介: [笔记]音视频学习之SDL篇《二》 绘制平铺的背景图并居中放置另一图片

准备工作

背景图和居中图

背景图 320*240

居中图

SDL窗口坐标系

左上角为(0,0)坐标

初始化和创建窗口

//Start up SDL and make sure it went ok
  if (SDL_Init(SDL_INIT_VIDEO) != 0) {
    logSDLError(std::cout, "SDL_Init");
    return 1;
  }
  //Setup our window and renderer
  SDL_Window *window = SDL_CreateWindow("Lesson 2", 100, 100, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
  if (window == nullptr) {
    logSDLError(std::cout, "CreateWindow");
    SDL_Quit();
    return 1;
  }
  SDL_Renderer *renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
  if (renderer == nullptr) {
    logSDLError(std::cout, "CreateRenderer");
    cleanup(window);
    SDL_Quit();
    return 1;
  }

载入两张图片

//The textures we'll be using
  const std::string resPath = getResourcePath("02sdl_learn");
  SDL_Texture *background = loadTexture(resPath + "background.bmp", renderer);
  SDL_Texture *image = loadTexture(resPath + "image.bmp", renderer);
  //Make sure they both loaded ok
  if (background == nullptr || image == nullptr) {
    cleanup(background, image, renderer, window);
    SDL_Quit();
    return 1;
  }

绘制背景图和居中图片

背景图是长320宽240,窗口是长640*宽480,正好可以画4个

执行四次 分别从

(0,0),(320,0),(0,240),(320,240)位置开始绘制。

renderTexture(background, renderer, 0, 0);
renderTexture(background, renderer, bW, 0);
renderTexture(background, renderer, 0, bH);
renderTexture(background, renderer, bW, bH);
A sleepy rendering loop, wait for 3 seconds and render and present the screen each time
  //for (int i = 0; i < 3; ++i) {
    //Clear the window
    SDL_RenderClear(renderer);
    //Get the width and height from the texture so we know how much to move x,y by
    //to tile it correctly
    int bW, bH;
    SDL_QueryTexture(background, NULL, NULL, &bW, &bH);
    //We want to tile our background so draw it 4 times
    renderTexture(background, renderer, 0, 0);
    renderTexture(background, renderer, bW, 0);
    renderTexture(background, renderer, 0, bH);
    renderTexture(background, renderer, bW, bH);
    //Draw our image in the center of the window
    //We need the foreground image's width to properly compute the position
    //of it's top left corner so that the image will be centered
    int iW, iH;
    SDL_QueryTexture(image, NULL, NULL, &iW, &iH);
    int x = SCREEN_WIDTH / 2 - iW / 2;
    int y = SCREEN_HEIGHT / 2 - iH / 2;
    renderTexture(image, renderer, x, y);
    //Update the screen
    SDL_RenderPresent(renderer);
    //Take a quick break after all that hard work
    SDL_Delay(10000);
  /*}*/

退出

cleanup(background, image, renderer, window);
SDL_Quit();

效果图

总结

平铺主要通过计算窗口宽是图片的宽的n = winHeight / picHeight倍,高是m = winWidth / picWidth 倍,

从而确定最终画出n*m个背景图平铺填满.

demo地址

相关文章
|
7月前
[笔记]音视频学习之SDL篇《五》裁剪图片成子图片(裁剪精灵表)
[笔记]音视频学习之SDL篇《五》裁剪图片成子图片(裁剪精灵表)
|
5月前
|
计算机视觉
Markdown编辑器常用颜色背景指南(附颜色与代码展示,cv即可用)
Markdown编辑器常用颜色背景指南(附颜色与代码展示,cv即可用)
|
7月前
|
异构计算
[笔记]音视频学习之SDL篇《十》绘制矩形,线条
[笔记]音视频学习之SDL篇《十》绘制矩形,线条
|
11月前
|
Python 容器
tkinter模块高级操作(二)—— 界面切换效果、立体阴影字效果及gif动图的实现
tkinter模块高级操作(二)—— 界面切换效果、立体阴影字效果及gif动图的实现
176 0
|
12月前
CSS3文本居中显示、圆形圆角绘制、立体阴影效果设置实例演示
CSS3文本居中显示、圆形圆角绘制、立体阴影效果设置实例演示
94 0
|
iOS开发
iOS - 设置图片为背景色,且拉伸到指定大小
iOS - 设置图片为背景色,且拉伸到指定大小
264 0
平铺文理+拉伸按钮图片
平铺文理+拉伸按钮图片
50 0
|
数据可视化 iOS开发
iOS 为图片添加圆角和描边的几种方式
对于习惯使用Storyboard的人来说,设置圆角、描边是一件比较蛋疼的事,因为苹果没有在xcode的Interface Builder上直接提供修改控件的圆角,边框设置。我们来说说如何对某个控件进行圆角、描边处理:
718 0
|
JSON 前端开发 JavaScript
Threejs引入字体,实现3D文字,Canvas画布作为纹理贴图实现滚动字幕
Threejs引入字体,实现3D文字,Canvas画布作为纹理贴图实现滚动字幕
733 0
Threejs引入字体,实现3D文字,Canvas画布作为纹理贴图实现滚动字幕
|
JSON 搜索推荐 Serverless
iOS绘制物理按钮 - 透明圆角渐变边框
iOS绘制物理按钮 - 透明圆角渐变边框
322 0
iOS绘制物理按钮 - 透明圆角渐变边框