SDL2.0的加载图片贴图

加载图片贴图,采用了SDL_Window、SDL_Renderer、SDL_Texture和SDL_Image库

实例:

  1 #include <stdio.h>
  2 #include <math.h>
  3 #include <string.h>
  4 #include <SDL2\SDL.h>
  5 #include <SDL2\SDL_image.h>
  6 #include <SDL2\ex\SDL_rectex.h>
  7
  8 SDL_Window *sdlWindow = NULL;
  9 SDL_Renderer *sdlRender = NULL;
 10 SDL_Texture *sdlTexture = NULL;
 11 SDL_Rect srcRect;
 12 SDL_Rect dstRect;
 13 int w = 500;
 14 int h = 500;
 15
 16 bool InitView(int width, int height, const char *iconName)
 17 {
 18     //初始化窗体
 19     SDL_Init(SDL_INIT_VIDEO);
 20
 21     sdlWindow = SDL_CreateWindow(
 22         "The First SDL Program",
 23         SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height,
 24         SDL_WINDOW_RESIZABLE);
 25     if (sdlWindow == NULL) return false;
 26
 27     //加载窗体图标
 28     SDL_Surface *iconSurface = IMG_Load(iconName);
 29     if (iconSurface == NULL) return false;
 30
 31     SDL_SetWindowIcon(sdlWindow, iconSurface);
 32
 33     return true;
 34 }
 35
 36 bool InitDraw(const char *imgName)
 37 {
 38     //加载渲染器
 39     sdlRender = SDL_CreateRenderer(sdlWindow, -1, 0);
 40     if (sdlRender == NULL) return false;
 41     SDL_SetRenderDrawColor(sdlRender, 255, 255, 255, 255);
 42
 43     //加载绘画图片
 44     SDL_Surface *sdlSurface = IMG_Load(imgName);
 45     if (sdlSurface == NULL) return false;
 46
 47     //加载绘画纹理
 48     sdlTexture = SDL_CreateTextureFromSurface(sdlRender, sdlSurface);
 49     if (sdlTexture == NULL) return false;
 50
 51     SDL_FreeSurface(sdlSurface);
 52     return true;
 53 }
 54
 55 void UpdateDraw()
 56 {
 57     SDL_RenderClear(sdlRender);
 58
 59     //分X宫格
 60     const int count = 9;
 61     const int sqrtCount = (int)sqrt((double)count);
 62     for (int i = 0; i < sqrtCount; i++)    {
 63         srcRect = SDL_RectMake(0, 0, (w-sqrtCount)/sqrtCount, (h-sqrtCount)/sqrtCount);
 64         for (int j = 0; j < sqrtCount; j++) {
 65             srcRect.x = srcRect.w*j+(j?1*j:0);
 66             srcRect.y = srcRect.h*i+(i?1*i:0);
 67
 68             //SDL_RectPrint("srcRect", srcRect);
 69             SDL_RectCopy(&srcRect, &dstRect);
 70             //SDL_RectPrint("dstRect", dstRect);
 71             SDL_RenderCopy(sdlRender, sdlTexture, &srcRect, &dstRect);
 72         }
 73     }
 74
 75     SDL_RenderPresent(sdlRender);
 76 }
 77
 78 void Quit(int code)
 79 {
 80     const char *errMsg = SDL_GetError();
 81     if (errMsg && strlen(errMsg)) {
 82         SDL_Log("Error : %s\n", errMsg);
 83     }
 84
 85     //销毁窗口、渲染器、纹理
 86     if (sdlWindow) SDL_DestroyWindow(sdlWindow);
 87     if (sdlRender) SDL_DestroyRenderer(sdlRender);
 88     if (sdlTexture) SDL_DestroyTexture(sdlTexture);
 89     SDL_Quit();
 90     exit(code);
 91 }
 92
 93 void HandleKeyEvent(const SDL_Keysym* keysym)
 94 {
 95     int key = keysym->sym;
 96     switch(key)
 97     {
 98     case SDLK_ESCAPE:
 99         Quit(0);
100         break;
101     case SDLK_SPACE:
102         break;
103     case SDLK_UP:
104     case SDLK_DOWN:
105     case SDLK_LEFT:
106     case SDLK_RIGHT:
107         int x, y;
108         SDL_GetWindowPosition(sdlWindow, &x, &y);
109         x = (key == SDLK_LEFT ? x-2 : (key == SDLK_RIGHT ? x+2 : x));
110         y = (key == SDLK_UP ? y-2 : (key == SDLK_DOWN ? y+2 : y));
111         SDL_SetWindowPosition(sdlWindow, x, y);
112         SDL_Log("x=%d, y=%d\n", x, y);
113         break;
114     case SDLK_KP_PLUS:
115     case SDLK_KP_MINUS:
116         w = (key == SDLK_KP_PLUS ? w+2 : w-2);
117         h = (key == SDLK_KP_PLUS ? h+2 : h-2);
118         SDL_SetWindowSize(sdlWindow, w, h);
119         SDL_Log("w=%d, h=%d\n", w, h);
120         break;
121     default:
122         break;
123     }
124 }
125
126 void HandleEvents()
127 {
128     //Our SDL event placeholder.
129     SDL_Event event;
130     //Grab all the events off the queue.
131     while(SDL_PollEvent(&event)) {
132         switch(event.type) {
133         case SDL_KEYDOWN:
134             //Handle key Event
135             HandleKeyEvent(&event.key.keysym);
136             break;
137         case SDL_QUIT:
138             //Handle quit requests (like Ctrl-c).
139             Quit(0);
140             break;
141         }
142     }
143 }
144
145 int main(int argc, char* argv[])
146 {
147     printf("可以通过↑↓←→+ -按键控制移动和大小\n");
148     if (InitView(w, h, "yp.ico") == false) {
149         SDL_Log("sdlWindow is null @[email protected]\n");
150         Quit(0);
151         return -1;
152     }
153
154     char *imgName = "gril.jpg";
155     if (InitDraw(imgName) == false) {
156         SDL_Log("Init Fail @[email protected]\n");
157         Quit(0);
158         return -1;
159     }
160
161     //配置客户区大小
162     SDL_QueryTexture(sdlTexture,NULL, NULL, &w, &h);
163     SDL_SetWindowSize(sdlWindow, w, h);
164     SDL_Log("w=%d, h=%d\n", w, h);
165
166     while (1) {
167         HandleEvents();
168         UpdateDraw();
169     }
170
171     SDL_DestroyWindow(sdlWindow);
172     SDL_Quit();
173     return 0;
174 }

结果:

时间: 2024-11-05 06:10:16

SDL2.0的加载图片贴图的相关文章

Android9.0无法加载图片及访问不了服务器问题

当在安卓9.0加载网络请求数据时,如果抛出如下异常: Cause (1 of 1): class java.io.IOException: Cleartext HTTP traffic to xxxx.xxxx.xxxx not permitted 这是因为Android 9.0 版本系统默认支持一个网络访问协议:Https协议的网络,所以不支持网络访问:Http协议的网络面对这样的问题,解决办法: 第一种办法在AndroidMainfast.xml清单文件 Application里增加代码::

Android开发解决加载图片OOM问题(非常全面 兼顾4.0以下系统)(by 星空武哥)

转载请标明:http://blog.csdn.net/lsyz0021/article/details/51295402 我们项目中经常会加载图片,有时候如果加载图片过多的话,小则导致程序很卡,重则OOM导致App挂了,今天翻译https://developer.Android.com/training/displaying-bitmaps/index.html,学习Google高效加载大图片的方法. 图片有各种形状和大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库

在QtCreator 2.1.0 下使用opencv231库加载图片并显示

在.pro中库连接如上图,具体规则正在学习,注意debug下连接*d.lib.release下链接.lib.没有d的. 如果出现imread不可以加载图片,cvloadImage却可以,则是上面说的连接库名字的问题.具体看http://blog.csdn.net/wangyaninglm/article/details/38958915

Android:ViewPager扩展详解——带有导航的ViewPagerIndicator(附带图片缓存,异步加载图片)

大家都用过viewpager了, github上有对viewpager进行扩展,导航风格更加丰富,这个开源项目是ViewPagerIndicator,很好用,但是例子比较简单,实际用起来要进行很多扩展,比如在fragment里进行图片缓存和图片异步加载. 下面是ViewPagerIndicator源码运行后的效果,大家也都看过了,我多此一举截几张图: 下载源码请点击这里 ===========================================华丽的分割线==============

Android加载图片导致内存溢出(Out of Memory异常)

Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证):  方案一.读取图片时注意方法的调用,适当压缩  尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗

[原创]cocos2dx加载网络图片&amp;异步加载图片

[动机] 之前看到一款卡牌游戏,当你要看全屏高清卡牌的时候,游戏会单独从网络上下载,本地只存了非高清的,这样可以省点包大小,所以我萌生了实现一个读取网络图片的类. [联想] 之前浏览网页的时候经常看到一张图片渐进(由模糊变清晰)的显示,如果在游戏中,诸如像显示高清卡牌的时候,使用有这种方式去显示一张图片,这样的体验应该会稍微好些 [相关知识] png interlaced:png图片在导出的时候是可以选择 interlaced (Adam7)的,这样的存储的png在网页上显示会渐进显示, 这种i

Android中的Glide加载图片

注意:在Android Studio的项目的build.gradle中添加: compile 'com.github.bumptech.glide:glide:3.6.1' 然后同步一下 目录: 使用Glide结合列表的样式进行图片加载 如果使用的是RecyclerView,可以在Adapter的onBindViewHolder方法中使用 当加载网络图片时,由于加载过程中图片未能及时显示,此时可能需要设置等待时的图片,通过placeHolder()方法 当加载图片失败时,通过error(Draw

图片--Android加载图片导致内存溢出(Out of Memory异常)

Android在加载大背景图或者大量图片时,经常导致内存溢出(Out of Memory  Error),本文根据我处理这些问题的经历及其它开发者的经验,整理解决方案如下(部分代码及文字出处无法考证):  方案一.读取图片时注意方法的调用,适当压缩  尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗

用javascript预加载图片、css、js的方法研究

预加载的好处可以让网页更快的呈现给用户,缺点就是可能会增加无用的请求(但图片.css.js这些静态文件可以被缓存),如果用户访问的页面里面的css.js.图片被预加载了,用户打开页面的速度会快很多,提升用户体验.在用到一些大图片展示的时候,预加载大图是很不错的方法,图片更快的被呈现给用户.不多说了,作为一个前端攻城师都懂的,下面分享我做的测试和得到的结果. 先说需要知道的服务器返回的status code:status-code: 200 - 客户端请求成功status-code: 304 -