SDL mac(event) 入门1 - 显示图像

废话

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;
   }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值