[笔记]音视频学习之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地址

相关文章
|
算法 数据处理 开发者
FFmpeg库的使用与深度解析:解码音频流流程
FFmpeg库的使用与深度解析:解码音频流流程
250 0
|
11月前
SDL基础使用01(QtCreator)
如何在Qt Creator中创建一个C项目并使用SDL库来创建和显示一个简单的窗口。
207 1
SDL基础使用01(QtCreator)
|
11月前
SDL基础使用04(SDL_image与SDL_mixer扩展库)
本文介绍了如何使用SDL_image和SDL_mixer扩展库在SDL项目中加载和显示图片以及播放音频文件。
503 1
|
前端开发 JavaScript 搜索推荐
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)
261 1
webgl canvas系列——animation中基本旋转、平移、缩放(模拟冒泡排序过程)
|
Unix Linux API
深入探索 Linux 命令:curl
`curl` 是 Linux 中用于多功能数据传输的命令行工具,支持 HTTP、HTTPS 等协议。它可以用来获取网页内容、保存文件、发送 POST 请求及处理重定向。高级特性包括自定义请求头、显示响应头、管理 Cookie、进行认证和使用代理。通过 `curl` 的各种选项,用户可以方便地进行网络交互和调试。学习和掌握 `curl` 可以提升在终端中的工作效率。
|
Linux API C++
音视频windows安装ffmpeg6.0并使用vs调试源码笔记
音视频windows安装ffmpeg6.0并使用vs调试源码笔记
486 0
|
C++ Windows
CMake中的find_package(xxx REQUIRED)在windows平台怎么解
CMake中的find_package(xxx REQUIRED)在windows平台怎么解
680 0
|
Linux 网络安全
1、Linux下搭建研究live555的开发环境
1、Linux下搭建研究live555的开发环境
539 0
[笔记]音视频学习之SDL篇《六》使用SDL_ttf绘制True Type字体
[笔记]音视频学习之SDL篇《六》使用SDL_ttf绘制True Type字体
181 0
|
JSON 5G 数据格式
阿里云云剪辑最佳实践-批量混剪去重策略
背景进入5G时代,越来越多的商家选择短视频平台做营销推广,将广告制作成短视频投放在多个KOL或营销号。由于各大短视频平台有去重机制(防止视频盗用),内容相同的营销视频会被做屏蔽处理,这就要求投放在不同账号的视频,在内容、结构上要有差别。之前写过一些实践案例,帮大家搭建自己的混剪服务,这回我们主要来讲去重策略,帮助大家批量生产出有效的不重复的短视频。阿里云智能媒体服务IMS(Intelligent 
2671 0