用 SDL2 处理精灵图

上面就是一个精灵图,由多个固定间隔的图标组成。利用精灵图的好处就是不必将图标逐个读入内存进行操作。我们可以将精灵图中需要的部分用一个个矩形截取下来,然后再输出到渲染器上。
环境:SDL2 + VC++2015
下面的代码将打开sprite.png,并对相应的操作做出响应。

sprite.png
#include <stdexcept>
#include <string>
#include <iostream>
#include "SDL.h"
#include "SDL_image.h" //屏幕宽度
const int SCREEN_WIDTH = ;
const int SCREEN_HEIGHT = ; //全局窗口和渲染器
SDL_Window *window = nullptr;
SDL_Renderer *renderer = nullptr; //记录SDL错误
void logSDLError(std::ostream &os, const std::string &msg)
{
os << msg << " error: " << SDL_GetError() << std::endl;
} //加载图像材质
SDL_Texture* loadTexture(const std::string &file, SDL_Renderer *ren)
{
SDL_Texture *texture = IMG_LoadTexture(ren, file.c_str());
if (texture == nullptr) logSDLError(std::cout, "LoadTexture");
return texture;
} //根据坐标生成截取区域并复制输出到渲染器
void renderTexture(SDL_Texture *tex, SDL_Renderer *ren, int x, int y, SDL_Rect *clip = nullptr)
{
//目标截面区域初始化,提供目标在渲染器的坐标
SDL_Rect dst; dst.x = x; dst.y = y;
//源截面区域不为空,将其值赋给目标截面
if (clip != nullptr) { dst.w = clip->w; dst.h = clip->h; }
//将截面输出到渲染器
SDL_RenderCopy(ren, tex, clip, &dst);
} int main(int argc, char** argv)
{
//初始化SDL
if (SDL_Init(SDL_INIT_EVERYTHING) == -)
{
std::cout << SDL_GetError() << std::endl;
return ;
} //创建窗口
window = SDL_CreateWindow("Lesson 5",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN);
if (window == nullptr)
{
std::cout << SDL_GetError() << std::endl;
return ;
} //创建渲染器
renderer = SDL_CreateRenderer(window, -, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == nullptr)
{
std::cout << SDL_GetError() << std::endl;
return ;
} //创建纹理
SDL_Texture *image = nullptr;
try
{
image = loadTexture("sprite.png", renderer);
}
catch (const std::runtime_error &e)
{
std::cout << e.what() << std::endl;
return ;
} //iW,iH 表示截面宽高
int iW = , iH = ;
//x,y 分别为截面在渲染器输出的坐标
int x = SCREEN_WIDTH / - iW / ;
int y = SCREEN_HEIGHT / - iH / ; //为精灵图设置截面
SDL_Rect clips[]; //初始化截面信息
for (int i = ; i < ; ++i)
{
clips[i].x = i / * iW;
clips[i].y = i % * iH;
clips[i].w = iW;
clips[i].h = iH;
} //表示将要输出的截面
int useClip = ; SDL_Event e;
bool quit = false;
//主循环
while (!quit)
{
//事件轮询
while (SDL_PollEvent(&e))
{
//按右上角的X退出
if (e.type == SDL_QUIT) quit = true; //点击鼠标随机输出截面
if (e.type == SDL_MOUSEBUTTONDOWN) useClip = rand() % ; //使用数字键决定输出截面,分别有1,2,3,4
if (e.type == SDL_KEYDOWN)
{
switch (e.key.keysym.sym)
{
case SDLK_1:
case SDLK_KP_1:
useClip = ;
break;
case SDLK_2:
case SDLK_KP_2:
useClip = ;
break;
case SDLK_3:
case SDLK_KP_3:
useClip = ;
break;
case SDLK_4:
case SDLK_KP_4:
useClip = ;
break;
case SDLK_ESCAPE:
quit = true;
break;
default:
break;
}
}
}
//清空渲染器
SDL_RenderClear(renderer);
//绘制材质
renderTexture(image, renderer, x, y, &clips[useClip]);
//呈现渲染器
SDL_RenderPresent(renderer);
} //释放资源
SDL_DestroyTexture(image);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window); SDL_Quit(); return ;
}
用 SDL2 处理精灵图的更多相关文章
- CSS.05 -- 规避脱标 定位的盒子居中、CSS标签规范、溢出隐藏、内容移除(网页优化)、CSS精灵图
规避脱标 定位的盒子居中显示 Margin:0 auto : 只能让标准流的盒子居中对齐 当A是B的父系,B可以使用 margin-left:auto: 来获得相当于定位right:0:的效果 M ...
- 第9天:CSS精灵图
今天重点学习了CSS精灵图. "CSS精灵",英语css sprite,所以也叫做"CSS雪碧"技术.是一种CSS图像合并技术,该方法是将小图标和背景图像合并到 ...
- Uint 7.文本和字体属性,background,精灵图和3种定位
一. 文本属性 CSS 文本属性可定义文本的外观. 通过文本属性,您可以改变文本的颜色.字符间距,对齐文本,装饰文本,对文本进行缩进,等等. <!DOCTYPE html> <htm ...
- H5 40-CSS精灵图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Css - 精灵图
Css - 精灵图css sprite 一个页面文档上总是会有N多的图标小图片,它们都是以背景图的方式嵌入文档,每个小图片需要一个url的css属性,每个url都指向一个服务器地址的链接,每个链接都代 ...
- 盒子总结,文本属性操作,reset操作,高级选择器,高级选择器优先级,边界圆角(了解),a标签的四大伪类,背景图片操作,背景图片之精灵图
盒子总结 ''' block: 设置宽高 1.没有设置宽,宽自适应父级的宽(子级的border+padding+width=父级的width) 2.没有设置高,高由内容撑开 设置了宽高 一定采用设置的 ...
- CSS Spritec下载,精灵图,雪碧图,初探之原理、使用
CSS Spritec下载,精灵图,雪碧图,初探之原理.使用 关于CSS Sprite CSSSprites在国内很多人叫css精灵雪碧图,是一种网页图片应用处理方式.它允许你将一个页面涉及到的所有零 ...
- Gulp命令自动生成精灵图
文件目录说明 gulpfile.js代码 var gulp = require('gulp'); var spritesmith = require('gulp.spritesmith'); var ...
- HTML连载35-背景图片的练习、精灵图
一.背景图片练习 解释:这个例子需要注意的是,我们背景图片嵌套到另一个图片之中.我们设计的注意点在于,怎么定位到我们想定位到的地方. 总结:背景图片就是一块一块的,我们想把块的位置定位好(一般就是宽和 ...
随机推荐
- Dfs学习经验(纸上运行理解DFS)【两道题】
首先我想吐槽的是,在CSDN上搞了好久还是不能发博客,就是点下发表丝毫反应都没有的,我稍微百度了几次还是没有找到解决方法,在CSDN的BBS上也求助过管理员但是没有收到答复真是烦躁,导致我新生入学以来 ...
- 用C++实现约瑟夫环的问题
约瑟夫问题是个有名的问题:N个人围成一圈.从第一个開始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉. 比如N=6,M=5.被杀掉的人的序号为5,4,6.2.3.最后剩下1号. 假定在圈子里前K ...
- c++面试题目(3)
这些东西有点烦,有点无聊.如果要去C++面试就看看吧.几年前网上搜索的.刚才看到,就整理一下,里面有些被我改了,感觉之前说的不对或不完善. 1.求下面函数的返回值( 微软) int func(x) ...
- LA4043 - Ants(二分图完备最佳匹配KM)
option=com_onlinejudge&Itemid=8&page=show_problem&problem=2044">https://icpcarch ...
- SIFT算法中DoG特征点的修正
SIFT算法中,在DoG空间找到极值点后,需要对极值点进行修正,本文主要详细的讲解一下为什么需要修正,以及如何对极值点进行修正. 下图演示了二维函数离散空间得到的极值点与连续空间的极值点之间的差别 利 ...
- C++函数模板例子
//C++函数模板实例 #include <iostream>template <class Any>void Swap(Any &a, Any &b); in ...
- sanic官方文档解析之Exception和Middleware,Listeners
1,异常 异常是从处理请求内部抛出来的,并且通过Sanic自动的被处理异常,,异常用第一个参数携带异常信息,还可以接受在HTTP响应中要传递回的状态代码.引发异常 1.1引发异常 自动触发异常,,简单 ...
- linux杀死进程
http://blog.csdn.net/andy572633/article/details/7211546 ps -ef | grep firefox kill -s 9 1827
- rails用generate为两个模型创建has_and_belongs_to_many中间表
假设 teachers和students具备many-to-many的关系,那么需要一个Join 表,has_and_belongs_to_many默认该表名字为teachers_students,这 ...
- js 时间戳精确值的问题
最近做一个多图上传的功能,通过name + 时间戳命名,结果发现时间戳竟然一样,一直以为是代码逻辑的问题,结果出错在时间戳的获取上了. 关于时间戳的获取方式: 1.Date.parse() var d ...