废话
SDL(Simple DirectMedia Layer)是一套开放源代码
的跨平台多媒体开发库,使用C语言写成。SDL提供
了数种控制图像、声音、输出入的函数,让开发者只
要用相同或是相似的代码就可以开发出跨多个平台
(Linux、Windows、Mac OS X等)的应用软件。目
前SDL多用于开发游戏、模拟器、媒体播放器等多媒
体应用领域。
常用子系统
◼ SDL_INIT_TIMER:定时器
◼ SDL_INIT_AUDIO:音频
◼ SDL_INIT_VIDEO:视频
◼ SDL_INIT_EVENTS:事件
windows 常用过程
◼ SDL_Init():初始化SDL系统
◼ SDL_CreateWindow():创建窗口SDL_Window
◼ SDL_CreateRenderer():创建渲染器SDL_Renderer
◼ SDL_CreateTexture():创建纹理SDL_Texture
◼ SDL_UpdateTexture():设置纹理的数据
◼ SDL_RenderCopy():将纹理的数据拷贝给渲染器
◼ SDL_RenderPresent():显示
◼ SDL_Delay():工具函数,用于延时
◼ SDL_Quit():退出SDL系统
SDL事件
◼ 函数
• SDL_WaitEvent():等待一个事件
• SDL_PushEvent():发送一个事件
• SDL_PumpEvents():将硬件设备产生的事件放入事件队列,用于
读取事件,在调用该函数之前,必须调用SDL_PumpEvents搜集
键盘等事件
• SDL_PeepEvents():从事件队列提取一个事件
◼ 数据结构
• SDL_Event:代表一个事件
MAC 的操作系统对于SDL 窗口显示 前提是必须有事件控制 才可以可视化显示 也就是必须在有或者是在Event 内去构建window 或者渲染图形,否则无法可视化,但是进程中可以显示出来
SDL 绘制窗口中随机矩形 并且键盘控制退出
#include <stdio.h>
#include "SDL2/SDL.h"
#define FF_QUIT_EVENT (SDL_USEREVENT + 2) // 用户自定义事件
SDL_USEREVENT 是SDL api为用户定义的一个自定义事件的key 可以+1 +2 代表不同的时间 最高+ ffff
int main(int argc, char* argv[])
{
int run = 1;
SDL_Window *window = NULL; //一个窗口
SDL_Renderer *renderer = NULL; //一个渲染器
SDL_Texture *texture = NULL; // 一个纹理
SDL_Event event; // 一个事件
SDL_Rect rect;
rect.w = 50;
rect.h = 50;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("2333",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
1280,
960,
SDL_WINDOW_OPENGL|SDL_WINDOW_RESIZABLE);
if(!window){
printf("create window error \n");
return -1;
}
renderer = SDL_CreateRenderer(window,-1,0);
if(!renderer){
printf("creater renderer error \n");
return -1;
}
texture = SDL_CreateTexture(renderer,SDL_PIXELFORMAT_RGB888,SDL_TEXTUREACCESS_TARGET,1280,960);
if (!texture)
{
return -1;
}
int show_count = 0 ;
int b_exit = 0;
for(;;){
// 事件控制
switch (event.type) /判断事件 {
case SDL_KEYDOWN: // 键盘监视
switch (event.key.keysym.sym) {
case SDLK_a:
printf("key down a\n");
break;
case SDLK_s:
printf("key down s\n");
break;
case SDLK_d:
printf("key down d\n");
break;
case SDLK_q:
printf("quit event\n");
SDL_Event event_q; //创建一个新事件
event_q.type = FF_QUIT_EVENT ; //引入用户自定义key
SDL_PushEvent(&event_q); //往消息队列中发送一个事件
default:
printf("key down 0x%x\n", event.key.keysym.sym);
break;
}
break;
case FF_QUIT_EVENT:{
printf("receive quit event\n");
b_exit = 1;
break;
}
}
SDL_WaitEvent(&event);
rect.x = rand()%1280;
rect.y = rand()%960;
SDL_SetRenderTarget(renderer,texture);// 设置渲染目标为纹理
SDL_SetRenderDrawColor(renderer,0,255,255,255);
SDL_RenderClear(renderer);
SDL_RenderDrawRect(renderer, &rect); //绘制一个长方形
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); //长方形为白色
SDL_RenderFillRect(renderer, &rect);
/ 前面为渲染纹理 后面为窗口
SDL_SetRenderTarget(renderer, NULL); //恢复默认,渲染目标为窗口
SDL_RenderCopy(renderer, texture, NULL, NULL); //将纹理数据复制给渲染目标
SDL_RenderPresent(renderer);
SDL_Delay(300);
if(b_exit)
break;
}
//destory renderer
if (renderer)
SDL_DestroyRenderer(renderer);
// Close and destroy the window
if (window)
SDL_DestroyWindow(window);
// Clean up
SDL_Quit();
return 0;
}