02-SDL2使用(一)

1. 新建一个窗体并添加事件监听与响应

  • SDL_Init(),首先是按照需求对SDL相关子系统进行初始化,在程序最后退出之前需要使用SDL_Quit()清理所有初始化的子系统。
  • SDL_CreateWindow()创建一个窗体,SDL_DestroyWindow()销毁窗体。
  • SDL_Event定于一个事件,SDL_PollEvent()当前挂起事件的轮询。
  • SDL_Delay(),延时指定的ms时间长度。
#include <stdio.h>
#include <SDL.h>

#undef main

int main()
{
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        SDL_Log("init failed : %s", SDL_GetError());
        return -1;
    }

    SDL_Window * win = SDL_CreateWindow("sdl window", 
                                        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 
                                        640, 480, 
                                        SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
    if (win == NULL)
    {
        SDL_Log("create window failed : %s", SDL_GetError());
        SDL_Quit();
        return -1;
    }

    SDL_Event event;

    while(1)
    {
        if (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT)
            {
                break;
            }
        }

        SDL_Delay(10);
    }

    SDL_DestroyWindow(win);
    SDL_Quit();

    return 0;
}

2.新建窗体并获取与窗体相关的Surface并绘制一个矩形

  • 新建窗体、添加事件监听与响应,参考上述1中的操作。
  • SDL_GetWindowSurface()获取与窗口关联的SDL表面,使用完成后调用SDL_FreeSurface()释放Surface资源。
  • SDL_Rect定义一个矩形,使用SDL_FillRect()对矩形进行填充,填充时需要指定像素颜色,可以使用Uint32类型数指定,也可以使用SDL_MapRGB()来指定。
  • 使用SDL_UpdateWindowSurface()将窗口表面复制到屏幕上。
#include <stdio.h>
#include <SDL.h>

#undef main

int main()
{
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        SDL_Log("init failed : %s", SDL_GetError());
        return -1;
    }

    SDL_Window * win = SDL_CreateWindow("sdl window", 
                                        SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 
                                        640, 480, 
                                        SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
    if (win == NULL)
    {
        SDL_Log("create window failed : %s", SDL_GetError());
        SDL_Quit();
        return -1;
    }
    
    SDL_Surface *surface = SDL_GetWindowSurface(win);
    if (surface == NULL)
    {
        SDL_Log("init failed : %s", SDL_GetError());
        SDL_DestroyWindow(win);
        SDL_Quit();
        return -1;
    }
    SDL_Rect rect = {0, 190, 100, 100};
    // 使用SDL_FillRect(surface, &rect, 0x00ff0000)替代下面一行代码,同样的效果
    SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, 255, 0, 0));
    SDL_UpdateWindowSurface(win);

    SDL_Event event;

    while(1)
    {
        if (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT)
            {
                break;
            }
        }
        
        SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, 0, 0, 0));
        rect.x += 1;
        SDL_FillRect(surface, &rect, SDL_MapRGB(surface->format, 255, 0, 0));
        SDL_UpdateWindowSurface(win);

        SDL_Delay(10);
    }

    SDL_FreeSurface(surface);
    SDL_DestroyWindow(win);
    SDL_Quit();

    return 0;
}

3.获取新建窗体的Surface并显示BMP格式图片

  • SDL核心库只支持BMP格式的图片显示,其他格式的显示需要加SDL_image模块。
  • SDL_loadBMP()打开一张BMP图片,之后返回SDL_Surface指针,所以也需要在结束时使用SDL_FreeSurface()释放。
  • SDL_BlitSurface()执行从源表面到位置表面的位块传输。
  • SDL_UpdateWindowSurface()
SDL_Surface *surface_bmp = SDL_LoadBMP("image.bmp");
if (surface_bmp == NULL)
{
    SDL_Log("load BMP image failed : %s", SDL_GetError());
    return -1;
}
SDL_BlitSurface(surface_bmp, NULL, surface, NULL);
SDL_UpdateWindowSurface(win);

4.渲染器

  • SDL_CreateRenderer()创建一个2D渲染器上下文,需要指定显示呈现的窗口,要初始化的渲染驱动程序索引(可以使用-1初始化支持请求标志的第一个驱动程序),创建时指定的flag。在结束时需要使用SDL_DestroyRenderer()释放资源。
  • SDL_SetRendererDrawColor()设置用于绘图操作的颜色(矩形、直线和清屏)。
  • SDL_RenderClear()用绘图颜色清除当前渲染目标。
  • SDL_RenderPresent()更新已执行渲染的屏幕。
SDL_Renderer *renderer = SDL_CreateRenderer(win, -1, 0);
if (renderer == NULL)
{
    SDL_Log("SDL create renderer fialed: %s", SDL_GetError());
    return -1;
}
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 0);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);

SDL_DestroyRenderer(renderer);
posted @ 2024-11-26 16:22  SKILL-RABBIT  阅读(6)  评论(0编辑  收藏  举报