用 SDL2 加载PNG平铺背景并显示前景

上一篇中加载的是BMP,这次可以引用 SDL2_image.lib,加载更多格式的图像。

LoadImage函数做了改动,区别在于不用将surface转换成texture了。

环境:SDL2 + VC++2015

下面的代码将打开background.png和image.png,将background平铺背景,将image作为前景呈现。

  1 #include <stdexcept>
  2 #include <string>
  3 #include <iostream>
  4 #include "SDL.h"
  5 #include "SDL_image.h"
  6
  7 //屏幕宽度
  8 const int SCREEN_WIDTH = 1600;
  9 const int SCREEN_HEIGHT = 900;
 10
 11 //全局窗口和渲染器
 12 SDL_Window *window = nullptr;
 13 SDL_Renderer *renderer = nullptr;
 14
 15 //加载图片
 16 SDL_Texture* LoadImage(std::string file)
 17 {
 18     SDL_Texture* tex = nullptr;
 19     tex = IMG_LoadTexture(renderer, file.c_str());
 20     if (tex == nullptr)
 21         throw std::runtime_error("Failed to load image: " + file + IMG_GetError());
 22     return tex;
 23 }
 24
 25 //将表面应用到渲染器
 26 void ApplySurface(int x, int y, SDL_Texture *tex, SDL_Renderer *rend)
 27 {
 28     SDL_Rect pos;
 29     pos.x = x;
 30     pos.y = y;
 31     SDL_QueryTexture(tex, NULL, NULL, &pos.w, &pos.h);
 32     SDL_RenderCopy(rend, tex, NULL, &pos);
 33 }
 34
 35 int main(int argc, char** argv)
 36 {
 37     //初始化SDL
 38     if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
 39     {
 40         std::cout << SDL_GetError() << std::endl;
 41         return 1;
 42     }
 43
 44     //创建窗口
 45     window = SDL_CreateWindow("Lesson 3",
 46         SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
 47         SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
 48     if (window == nullptr)
 49     {
 50         std::cout << SDL_GetError() << std::endl;
 51         return 2;
 52     }
 53
 54     //创建渲染器
 55     renderer = SDL_CreateRenderer(window, -1,
 56         SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
 57     if (renderer == nullptr)
 58     {
 59         std::cout << SDL_GetError() << std::endl;
 60         return 3;
 61     }
 62
 63     //创建背景和前景纹理
 64     SDL_Texture *background = nullptr, *image = nullptr;
 65     try {
 66         background = LoadImage("background.png");
 67         image = LoadImage("image.png");
 68     }
 69     catch (const std::runtime_error &e) {
 70         std::cout << e.what() << std::endl;
 71         return 4;
 72     }
 73
 74     //清空渲染器
 75     SDL_RenderClear(renderer);
 76
 77     //在渲染器内平铺背景
 78     int bW, bH;
 79     SDL_QueryTexture(background, NULL, NULL, &bW, &bH);
 80     for (int y = 0; y <= SCREEN_HEIGHT; y += bH)
 81         for (int x = 0; x <= SCREEN_WIDTH; x += bW)
 82             ApplySurface(x, y, background, renderer);
 83
 84
 85     //在渲染器中央放置前景
 86     int iW, iH;
 87     SDL_QueryTexture(image, NULL, NULL, &iW, &iH);
 88     int x = SCREEN_WIDTH / 2 - iW / 2;
 89     int y = SCREEN_HEIGHT / 2 - iH / 2;
 90     ApplySurface(x, y, image, renderer);
 91
 92     //呈现渲染器
 93     SDL_RenderPresent(renderer);
 94     SDL_Delay(2000);
 95
 96     //释放资源
 97     SDL_DestroyTexture(background);
 98     SDL_DestroyTexture(image);
 99     SDL_DestroyRenderer(renderer);
100     SDL_DestroyWindow(window);
101
102     SDL_Quit();
103
104     return 0;
105 }
时间: 2024-08-11 03:24:47

用 SDL2 加载PNG平铺背景并显示前景的相关文章

用 SDL2 平铺背景并显示前景

环境:SDL2 + VC++2015 下面的代码将打开background.bmp和image.bmp,将background平铺背景,将image作为前景呈现 1 #include <iostream> 2 #include "SDL.h" 3 4 //屏幕宽度 5 const int SCREEN_WIDTH = 640; 6 const int SCREEN_HEIGHT = 480; 7 8 //全局窗口和渲染器 9 SDL_Window *window = nul

代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到合意的,所以根据网上找的一段代码,进行了较大改动. 需引用 zepto 或 jquery. 我这个是应用于手机上的,两列瀑布流,图片高度未知——等图片的onloaded事件触发后,才对容器进行计算和定位. 大容器是 $("#imgList"),容器格子是$(".pin"

Android 加载gif图片强大框架(支持预加载、缓存,还支持显示静态图片,一行代码全搞定)

之前项目中没有涉及到显示gif图片的功能,也没有着重研究过,最近项目中要用到显示gif图片,于是就在网上一顿搜,用过之后发现如下几个缺点. 1.加载大的gif图片会出现oom. 2.没有预加载和缓存功能,比较消耗内存. 3.功能比较单一,显示gif了但是不能显示静态图片. 最后无意间发现了一个强大的gif加载框架,能够满足上面的所有缺陷,支持预加载和缓存,同时支持显示静态图片和gif图片.下面是一些源代码: //xml布局就是一个ImageView //在需要的地方直接调用 Glide.with

jQuery:实现图片按需加载的方法,当要显示内容的高度超过了页面的高度,按需加载,根据滚动条的位置来判断页面显示的内容

实现图片按需加载的方法,当要显示内容的高度超过了页面的高度,按需加载,根据滚动条的位置来判断页面显示的内容 这个类似于京东或淘宝页面,根绝页面的滚动,显示下面的内容 如下图所示,一开始并不是所有的图片都显示,当滚动条移动到页面最下面的时候,再显示下面的内容 解决思路:通过判断滚动条是否滚动到了页面的最下面,如果滚动到了页面的最下面,则重新加载图片 知识点:1.offset() 方法返回或设置匹配元素相对于文档的偏移(位置) 返回第一个匹配元素的偏移坐标. 该方法返回的对象包含两个整型属性:top

android 加载数据或提交数据时显示转圈的提示页面

提前声明一下,本博客全是自己的理解,如果内容中有理解错误的地方,欢迎指正.另外,博客内容有参考其他博客,本博客只用来学习. 当我们进入到一个页面时,通常先会出现一个转圈的dialog,这是因为这个页面需要加载数据,为了防止数据加载完成前空白的页面,通常会先显示转圈的dialog,直到数据加载完成,圈消失.那么,这个转圈的dialog是怎么实现的呢? 首先,先写 显示转圈的layout:progress_hud.xml <span style="font-size:14px;"&g

使用SDwebImage去加载含有逗号的url 时候会无法加载,但是在浏览器上显示正常

这是因为缺少User-Agent  用户代理 用户代理 User Agent,是指浏览器,它的信息包括硬件平台.系统软件.应用软件和用户个人偏好. 自定义 #define USERAGENT @"Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3" 并且使用    [

图片路径加载失败,火狐浏览器默认显示断裂图片

在谷歌.IE浏览器中,如果图片路径加载失败,会显示一个默认的断裂图片,像这个样子 而在火狐浏览器中,则图片不会有任何占位,这样就会导致布局上的混乱,用户体验也不好,如何让火狐浏览器显示出断裂图片效果呢? 只需在样式文件css中加入这行代码就可以啦 @-moz-document url-prefix(http), url-prefix(file) { img:-moz-broken { -moz-force-broken-image-icon: 1; width:24px; height:24px

u3d 异步加载场景以及进度条的显示

1.先建立两个场景 2.把两个场景在在build setting 中添加两个建好的两个场景 3.在第一个场景中建立一个button和slider组件 4.代码处理 using UnityEngine;using System.Collections;using UnityEngine.UI;using UnityEngine.SceneManagement;public class ButtonTest : MonoBehaviour { public Button ButtonTestTran

Skeleton Screen加载占位图(内容出现前显示灰色占位图)的分析与实现

今天有几个好友问了这个叫加载占位图的实现方法,我还在此问题下做了个回答.由于国内对这个的名词是各有各的叫法,所以这里直接用加载占位图来解释.相信很多人都看到过图中这样的加载方式: 这个图是一个国内知名站点的,相比以往的loading圈圈,看起来是不是美观了许多.据说这个Idea是一个谷歌工程师在2013年时想到的.我不喜欢去讨论概念之类.直接用知名站点来通俗易懂的解释: 以往:发起ajax-loading.gif/svg-ajax结果.现在:发起ajax-具有css3动感(比如闪烁)的灰色布局d