SDL2.0的几何图行绘画

SDL2.0的几何图形绘画

通过SDL_Window、SDL_Renderer、SDL_Texture三者实现了简单的几何图形绘画。

包括了SDL_RenderDrawPoint、SDL_RenderFillRect、SDL_RenderDrawLine、SDL_SetRenderDrawColor等。

具体看代码吧(VS2012运行):

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <time.h>
  4 #include <SDL2\SDL.h>
  5 #include <SDL2\SDL_image.h>
  6 #include <SDL2\ex\SDLex.h>
  7
  8 SDL_Window *sdlWindow = NULL;
  9 SDL_Renderer *sdlRender = NULL;
 10 SDL_Texture *sdlTexture = NULL;
 11 SDL srcRect;
 12 int w = 500;
 13 int h = 500;
 14
 15 void DrawCircle(SDL_Renderer *ren,int radius){
 16     int st=clock(),tx=0,ty=radius,d=3-(radius<<1),x=radius,y=radius;
 17     while(tx<ty){
 18         for (int i=x-ty;i<=x+ty;++i){
 19             SDL_RenderDrawPoint(ren,i,y-tx);
 20             if (tx)
 21                 SDL_RenderDrawPoint(ren,i,y+tx);
 22         }
 23         if (d<0)
 24             d+=(tx<<2)+6;
 25         else{
 26             for (int i=x-tx;i<=x+tx;++i){
 27                 SDL_RenderDrawPoint(ren,i,y-ty);
 28                 SDL_RenderDrawPoint(ren,i,y+ty);
 29             }
 30             d+=((tx - ty)<<2)+10,ty--;
 31         }
 32         tx++;
 33     }
 34     if (tx==ty)
 35         for (int i=x-ty;i<=x+ty;++i){
 36                 SDL_RenderDrawPoint(ren,i,y-tx);
 37                 SDL_RenderDrawPoint(ren,i,y+tx);
 38         }
 39     int en=clock();
 40 }
 41
 42 bool InitView(int width, int height, const char *iconName)
 43 {
 44     //初始化窗体
 45     SDL_Init(SDL_INIT_VIDEO);
 46
 47     sdlWindow = SDL_CreateWindow(
 48         "The First SDL Program",
 49         SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, width, height,
 50         SDL_WINDOW_RESIZABLE);
 51     if (sdlWindow == NULL) return false;
 52
 53     //加载窗体图标
 54     SDL_Surface *iconSurface = IMG_Load(iconName);
 55     if (iconSurface == NULL) return false;
 56
 57     SDL_SetWindowIcon(sdlWindow, iconSurface);
 58
 59     return true;
 60 }
 61
 62 bool InitDraw()
 63 {
 64     //加载渲染器
 65     sdlRender = SDL_CreateRenderer(sdlWindow, -1, 0);
 66     if (sdlRender == NULL) return false;
 67
 68     sdlTexture = SDL_CreateTexture(sdlRender, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, w, h);
 69     if (sdlTexture == NULL) return false;
 70     //SDL_SetTextureBlendMode(sdlTexture, SDL_BLENDMODE_BLEND);
 71     //SDL_SetRenderTarget(sdlRender, sdlTexture);
 72
 73     return true;
 74 }
 75
 76 void UpdateDraw()
 77 {
 78     //设置背景颜色
 79     SDL_SetRenderDrawColor(sdlRender, 255, 153, 153, 0xFF);
 80     SDL_RenderClear(sdlRender);
 81
 82     //左眼
 83     SDL_SetRenderDrawColor(sdlRender, 0x00, 0xFF, 0xFF, 0xFF);
 84     srcRect = SDLMake(w/7*2, h/7, w/8, h/8);
 85     SDL_RenderFillRect(sdlRender, &srcRect);
 86
 87     //左眉毛
 88     SDL_SetRenderDrawColor(sdlRender, 0x00, 0x00, 0x00, 0xFF);
 89     SDL_RenderDrawLine(sdlRender, srcRect.x, srcRect.y - 10, SDLMaxX(srcRect), srcRect.y - 10);
 90
 91     //右眼
 92     SDL_SetRenderDrawColor(sdlRender, 0xFF, 0x00, 0xFF, 0xFF);
 93     srcRect = SDLMake(w/7*4, srcRect.y, srcRect.w, srcRect.h);
 94     SDL_RenderDrawRect(sdlRender, &srcRect);
 95
 96     //右眉毛
 97     SDL_SetRenderDrawColor(sdlRender, 0x00, 0x00, 0x00, 0xFF);
 98     SDL_RenderDrawLine(sdlRender, srcRect.x, srcRect.y - 10, SDLMaxX(srcRect), srcRect.y - 10);
 99
100     //嘴巴
101     SDL_SetRenderDrawColor(sdlRender, 0xFF, 0xFF, 0x00, 0xFF);
102     srcRect = SDLMake(w/8*3, h/7*3, w/8*2, h/8);
103     SDL_RenderFillRect(sdlRender, &srcRect);
104
105     SDL_SetRenderDrawColor(sdlRender, 0xFF, 0x00, 0x00, 0xFF);
106     DrawCircle(sdlRender, 10);
107
108     SDL_RenderPresent(sdlRender);
109 }
110
111 void Quit(int code)
112 {
113     const char *errMsg = SDL_GetError();
114     if (errMsg && strlen(errMsg)) {
115         SDL_Log("Error : %s\n", errMsg);
116     }
117
118     //销毁窗口、渲染器、纹理
119     if (sdlWindow) SDL_DestroyWindow(sdlWindow);
120     if (sdlRender) SDL_DestroyRenderer(sdlRender);
121     if (sdlTexture) SDL_DestroyTexture(sdlTexture);
122     SDL_Quit();
123     exit(code);
124 }
125
126 void HandleKeyEvent(const SDL_Keysym* keysym)
127 {
128     int key = keysym->sym;
129     switch(key)
130     {
131     case SDLK_ESCAPE:
132         Quit(0);
133         break;
134     case SDLK_SPACE:
135         break;
136     case SDLK_UP:
137     case SDLK_DOWN:
138     case SDLK_LEFT:
139     case SDLK_RIGHT:
140         int x, y;
141         SDL_GetWindowPosition(sdlWindow, &x, &y);
142         x = (key == SDLK_LEFT ? x-2 : (key == SDLK_RIGHT ? x+2 : x));
143         y = (key == SDLK_UP ? y-2 : (key == SDLK_DOWN ? y+2 : y));
144         SDL_SetWindowPosition(sdlWindow, x, y);
145         SDL_Log("x=%d, y=%d\n", x, y);
146         break;
147     case SDLK_KP_PLUS:
148     case SDLK_KP_MINUS:
149         w = (key == SDLK_KP_PLUS ? w+2 : w-2);
150         h = (key == SDLK_KP_PLUS ? h+2 : h-2);
151         SDL_SetWindowSize(sdlWindow, w, h);
152         SDL_Log("w=%d, h=%d\n", w, h);
153         break;
154     default:
155         break;
156     }
157 }
158
159 void HandleEvents()
160 {
161     //Our SDL event placeholder.
162     SDL_Event event;
163     //Grab all the events off the queue.
164     while(SDL_PollEvent(&event)) {
165         switch(event.type) {
166         case SDL_KEYDOWN:
167             //Handle key Event
168             HandleKeyEvent(&event.key.keysym);
169             break;
170         case SDL_QUIT:
171             //Handle quit requests (like Ctrl-c).
172             Quit(0);
173             break;
174         }
175     }
176 }
177
178 int main(int argc, char* argv[])
179 {
180     printf("可以通过↑↓←→+ -按键控制移动和大小\n");
181     if (InitView(w, h, "yp.ico") == false) {
182         SDL_Log("sdlWindow is null @[email protected]\n");
183         Quit(0);
184         return -1;
185     }
186
187     if (InitDraw() == false) {
188         SDL_Log("Init Fail @[email protected]\n");
189         Quit(0);
190         return -1;
191     }
192
193     //配置客户区大小
194     SDL_QueryTexture(sdlTexture,NULL, NULL, &w, &h);
195     SDL_SetWindowSize(sdlWindow, w + 2, h);
196     SDL_Log("w=%d, h=%d\n", w, h);
197
198     while (1) {
199         HandleEvents();
200         UpdateDraw();
201     }
202
203     SDL_DestroyWindow(sdlWindow);
204     SDL_Quit();
205     return 0;
206 }

效果图:

时间: 2024-10-15 19:41:45

SDL2.0的几何图行绘画的相关文章

[原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图

关于如何移植SDL2.0到安卓上面来参考我的上一篇文章:[原]零基础学习SDL开发之移植SDL2.0到Android 在一篇文章我们主要使用SDL2.0来加载一张BMP图来渲染显示. 博主的开发环境:Ubuntu 14.04 64位,Eclipse + CDT + ADT+NDK 博主曾经自己使用NDK编译出了libSDL2.so,然后使用共享库的方式来调用libSDL2中的函数,结果发现SDL\src\core\android\SDL_android.c 这个jni函数写的实在是不够自己另外做

[原]零基础学习SDL开发之在Android使用SDL2.0显示BMP叠加图

关于如何移植在android上使用SDL,可以参考[原]零基础学习SDL开发之移植SDL2.0到Android 和 [原]零基础学习SDL开发之在Android使用SDL2.0显示BMP图 . 在一篇文章我们主要使用SDL2.0来加载一张BMP图来渲染显示,同时叠加一张图作为背景图. 博主的开发环境:Ubuntu 14.04 64位,Eclipse + CDT + ADT+NDK 在前面两篇文章我们知道了如何移植SDL2.0到android上面来,并且可以在Android上面来显示一张图片,这篇

最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0)

===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG+SDL的视频播放器(SDL1.x) 最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0) 最简单的基于FFmpeg的解码器-纯净版(不包括libavformat) 最简单的基于FFMPEG+SDL的视频播放器:拆分-解码器和播放器 最简单的基于FFMPEG的Hellowor

最简单的基于FFMPEG+SDL的视频播放器 ver2 (采用SDL2.0)

简介 之前做过一个FFMPEG+SDL的简单播放器:<100行代码实现最简单的基于FFMPEG+SDL的视频播放器>.该播放器采用SDL1.2显示视频.最近有不少人反映SDL已经升级到2.0版本了,甚至官网的Wiki上都只有SDL2.0的文档了,因此下载了SDL 2.0 并且进行了简单的研究.随后对此前的播放器进行了修改,将SDL1.2换成了SDL2.0. 注:<100行代码实现最简单的基于FFMPEG+SDL的视频播放器>文章中提到的很多知识这里不再重复.本文重点记录SDL1.2

[原]零基础学习SDL开发之在Android使用SDL2.0加载字体

在上一篇文章我们知道了如何在android使用SDL2.0来渲染显示一张png图,而且在上上一篇我们知道如何使用sdl来渲染输出bmp图,那么sdl是否可以渲染输出自己喜爱的字体库的字体呢?答案是当然可以. 我们需要移植SDL_ttf字体库来支持相应的字体的渲染输出. 一.移植SDL_ttf库: 使用如下命令,从SDL Mercurial获取SDL_image的源码: hg clone https://hg.libsdl.org/SDL_ttf/ 将SDL_ttf拷贝到在上一篇文章中的andro

(转)SDL 1.2 to 2.0 Migration Guide--SDL1.2更新到SDL2.0指南

SDL 1.2 to 2.0 Migration Guide 目录 SDL 1.2 to 2.0 Migration Guide Translations Introduction Overview of new features Looking for more information Moving from SDL 1.2 to 2.0 Some general truths Video Setting up a game with the new video API If your gam

FFMPEG+SDL2.0流媒体开发3---简易MP4视频播放器,提取MP4的H264视频序列解码并且显示

简介 之前写了一遍提取MP4中的音视频并且解码,这一篇引入SDL2.0来显示解码后的视频序列 实现一个简易的 视频播放器. 我这里用的FFMPEG和SDL2.0都是最新版的 可能网上的资料不是很多,API接口也变了很多,不过大体的思路还是一样的. 分析几个FFMPEG函数 在这之前我们分析几个代码中可能引起疑问的FFMPEG几个函数的源代码,我已经尽我的能力添加了注释,因为实在没有文档可能有的地方也不是很详尽  不过大体还是能看懂的 av_image_alloc (分配图片缓冲区) 我们在FFM

SDL2.0.4+VS2015+win10 环境配置

SDL2.0.4+VS2015+win10 环境配置 第一个是源码 第二个就是配置windows 所需要的东西 将这两个下载下来,分别解压出来,放到你想放的目录,如下图,我这里放到了Program File文件夹中 我们可以看看里面的东西 配置vs2015所需要的东西我主要有个 一:include文件夹 二:lib文件夹 有了想要的东西下面就可以开始配置vs2015了 1.新建一个工程,工程名随便叫 这里就不截图了,配置请看图 这里就是指定include的目录 这里就是指定lib的目录 在依赖库

SDL2.0例子代码分析-----CheckKeys Project

SDL简介 SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成.SDL提供了数种控制图像.声音.输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux.Windows.Mac OS X等)的应用软件.目前SDL多用于开发游戏.模拟器.媒体播放器等多媒体应用领域. SDL1.2和SDL2的差别 SDK1.2和SDL2.1系列的API接口变动的不小,当然功能也大大增强,支持多线程窗口. 具体的change 请看 h