SDL2学习

1、绘制矩形框

#include <SDL2/SDL.h>

#define W 1200
#define H 800

#undef main
int main()
{
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
    {
        SDL_Log("Init failed: %s", SDL_GetError());
        return -1;
    }

    SDL_Window* win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }

    // 在窗口上绘制一个矩形
    // 1. 获取与窗口关联的Surface
    SDL_Surface* surf = SDL_GetWindowSurface(win);
    if (NULL == surf)
    {
        SDL_Log("SDL_GetWindowSurface failed: %s", SDL_GetError());
        return -1;
    }

    // 2. 定义一个区域
    SDL_Rect rect = { 200, 200, 50, 50 };

    // 3. 在Surface上进行绘制
    // SDL_FillRect(surf, &rect, SDL_MapRGB(surf->format, 0, 255, 0));
    SDL_FillRect(surf, &rect, 0x00ff00);

    // 4. 将绘制的内容更新到屏幕上
    SDL_UpdateWindowSurface(win);


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

        SDL_FillRect(surf, &rect, 0x000000);
        rect.x += 2;
        rect.y += 1;
        SDL_FillRect(surf, &rect, 0x00ff00);
        SDL_UpdateWindowSurface(win);
        SDL_Delay(10);
    }


    // 4. 释放Surface
    SDL_FreeSurface(surf);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

2、 加载bmp图片

SDL核心库只支持BMP图片的操作。如需操作更多格式的图片,需要SDL2_image库,添加与使用方式与SDL核心库一样。头文件为#include <SDL2/SDL_image.h>,库文件为SDL2_image。 

#include <SDL2/SDL.h>

#define W 1200
#define H 800

#undef main
int main()
{
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
    {
        SDL_Log("Init failed: %s", SDL_GetError());
        return -1;
    }

    SDL_Window* win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }

    // 显示BMP图片
    // 1. 获取与窗口关联的Surface
    SDL_Surface* surf = SDL_GetWindowSurface(win);
    if (NULL == surf)
    {
        SDL_Log("SDL_GetWindowSurface failed: %s", SDL_GetError());
        return -1;
    }


    // 2. 导入BMP图片
    SDL_Surface* img_surf = SDL_LoadBMP(R"(D:\CPlusProject\LearnSDL2\Data\1.bmp)");
    if (NULL == img_surf)
    {
        SDL_Log("SDL_LoadBMP failed: %s", SDL_GetError());
        return -1;
    }



    // 3. 将图片Surface复制到窗口Surface上
    SDL_BlitSurface(img_surf, NULL, surf, NULL);


    // 4. 将绘制的内容更新到屏幕上
    SDL_UpdateWindowSurface(win);

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

    }


    // 4. 释放Surface
    SDL_FreeSurface(img_surf);
    SDL_FreeSurface(surf);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

3、 修改像素点颜色值

#include <SDL2/SDL.h>

#define W 600
#define H 400

#undef main
int main()
{
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
    {
        SDL_Log("Init failed: %s", SDL_GetError());
        return -1;
    }

    SDL_Window* win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }

    // 操作像素点
    // 1. 获取与窗口关联的Surface
    SDL_Surface* surf = SDL_GetWindowSurface(win);
    if (NULL == surf)
    {
        SDL_Log("SDL_GetWindowSurface failed: %s", SDL_GetError());
        return -1;
    }


    // 2. 修改像素点颜色值
    Uint32* px = (Uint32*)surf->pixels;
    px[20000] = 0xffffff;
    px[20001] = 0xffffff;
    px[20002] = 0xffffff;
    px[20003] = 0xffffff;

    // 3. 将绘制的内容更新到屏幕上
    SDL_UpdateWindowSurface(win);

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

    }


    // 4. 释放Surface
    SDL_FreeSurface(surf);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

4、 渲染器创建与清屏

#include <SDL2/SDL.h>

#define W 800
#define H 600

#undef main
int main()
{
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
    {
        SDL_Log("Init failed: %s", SDL_GetError());
        return -1;
    }

    SDL_Window* win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }


    // 创建渲染器与清屏
    // 1. 创建渲染器
    SDL_Renderer* rdr = SDL_CreateRenderer(win, -1, 0);
    // 2. 设置渲染颜色
    SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);

    // 3. 清除屏幕
    SDL_RenderClear(rdr);

    // 4. 渲染呈现 
    SDL_RenderPresent(rdr);



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

    // 5. 销毁渲染器
    SDL_DestroyRenderer(rdr);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

5、 渲染点、线

#include <deque>
#include <SDL2/SDL.h>

#define W 800
#define H 600

#undef main
int main()
{
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
    {
        SDL_Log("Init failed: %s", SDL_GetError());
        return -1;
    }

    SDL_Window* win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }


    // 创建渲染器与清屏
    SDL_Renderer* rdr = SDL_CreateRenderer(win, -1, 0);
    if (NULL == rdr)
    {
        SDL_Log("SDL_CreateRenderer failed: %s", SDL_GetError());
        return -1;
    }
    // 设置渲染颜色
    SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);
    // 清除屏幕
    SDL_RenderClear(rdr);

    //渲染点
    SDL_SetRenderDrawColor(rdr, 0, 0, 0, 255);
    SDL_RenderDrawPoint(rdr, 200, 200);
    for (int i = 200; i < 300; i += 5) {
        SDL_RenderDrawPoint(rdr, i, 200);
    }


    //渲染线
    SDL_RenderDrawLine(rdr, 0, 0, 200, 200);

    SDL_Point pt[5] = { {0,0},{100,100}, {100,300},{200,100},{150,190} };
    SDL_RenderDrawLines(rdr, pt, 5);

    //渲染呈现
    SDL_RenderPresent(rdr);

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

    }


    // 销毁渲染器
    SDL_DestroyRenderer(rdr);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

6、渲染普通矩形

#include <deque>
#include <SDL2/SDL.h>

#define W 800
#define H 600

#undef main
int main()
{
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
    {
        SDL_Log("Init failed: %s", SDL_GetError());
        return -1;
    }

    SDL_Window* win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }


    // 创建渲染器与清屏
    SDL_Renderer* rdr = SDL_CreateRenderer(win, -1, 0);
    if (NULL == rdr)
    {
        SDL_Log("SDL_CreateRenderer failed: %s", SDL_GetError());
        return -1;
    }
    // 设置渲染颜色
    SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);
    // 清除屏幕
    SDL_RenderClear(rdr);
    SDL_SetRenderDrawBlendMode(rdr, SDL_BLENDMODE_BLEND);


    //渲染矩形
    SDL_SetRenderDrawColor(rdr, 0, 0, 0, 255);
    SDL_Rect rect = { 200,200,100,100 };
    SDL_RenderFillRect(rdr, &rect);

    //渲染呈现
    SDL_RenderPresent(rdr);



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

        //设置渲染的颜色
        SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);

        // 清除屏幕
        SDL_RenderClear(rdr);

        rect.x++;
        SDL_SetRenderDrawColor(rdr, 0, 0, 0, 255);
        SDL_RenderFillRect(rdr, &rect);

        //渲染呈现
        SDL_RenderPresent(rdr);
        SDL_Delay(10);

    }


    // 销毁渲染器
    SDL_DestroyRenderer(rdr);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

7、 渲染图片bmp

#include <deque>
#include <SDL2/SDL.h>

#define W 800
#define H 600

#undef main
int main()
{
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0)
    {
        SDL_Log("Init failed: %s", SDL_GetError());
        return -1;
    }

    SDL_Window* win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }


    // 创建渲染器与清屏
    SDL_Renderer* rdr = SDL_CreateRenderer(win, -1, 0);
    if (NULL == rdr)
    {
        SDL_Log("SDL_CreateRenderer failed: %s", SDL_GetError());
        return -1;
    }
    // 设置渲染颜色
    SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);
    // 清除屏幕
    SDL_RenderClear(rdr);
    
    //渲染图片
    //1.导入图片
    SDL_Surface* img_surf = SDL_LoadBMP(R"(D:\CPlusProject\LearnSDL2\Data\1.bmp)");

    if (NULL == img_surf) {
        SDL_Log("SDL_loadBMP failed:%s", SDL_GetError());
        return -1;
    }
    SDL_SetWindowSize(win, img_surf->w, img_surf->h);

    //2.创建Texture
    SDL_Texture* texture = SDL_CreateTextureFromSurface(rdr, img_surf);
    if (NULL == texture) {
        SDL_Log("SDL_CreateTextureFromSurface failed: %s", SDL_GetError());
        return -1;
    }
    SDL_Rect rect = { 100,100,1000,1000 };

    //3.复制Texture
    SDL_RenderCopy(rdr, texture, NULL, &rect);

    //渲染呈现
    SDL_RenderPresent(rdr);


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


    }


    // 销毁渲染器
    SDL_DestroyRenderer(rdr);
    SDL_DestroyWindow(win);
    SDL_Quit();
    return 0;
}

 8、结构梳理

#include <SDL2/SDL.h>

#define W 720
#define H 640

SDL_Window* win = NULL;
SDL_Renderer* rdr = NULL;
SDL_Rect rect = { 100, 100, 200, 100 };


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

    win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }


    // 创建渲染器
    rdr = SDL_CreateRenderer(win, -1, 0);
    if (NULL == rdr)
    {
        SDL_Log("SDL_CreateRenderer failed: %s", SDL_GetError());
        return -1;
    }

    return 0;
}


void deinit()
{
    // 销毁

    SDL_DestroyRenderer(rdr);
    SDL_DestroyWindow(win);
    SDL_Quit();
}

int draw()
{
    // 设置渲染颜色
    SDL_SetRenderDrawColor(rdr, 100, 100, 100, 100);
    // 清除屏幕
    SDL_RenderClear(rdr);

    SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);
    SDL_RenderFillRect(rdr, &rect);

    // 渲染呈现
    SDL_RenderPresent(rdr);
    return 0;
}


void event_loop()
{
    SDL_Event event;
    while (true)
    {
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_QUIT:
                return;

            default:
                break;
            }
        }
    }
}


#undef main
int main()
{
    if (init() < 0)
    {
        return -1;
    }

    draw();

    event_loop();

    deinit();
    return 0;
}

9、屏幕变化回调函数

#include <SDL2/SDL.h>
#include <iostream>
#define W 720
#define H 640

SDL_Window* win = NULL;
SDL_Renderer* rdr = NULL;
SDL_Rect rect = { 100, 100, 200, 100 };


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

    win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }


    // 创建渲染器
    rdr = SDL_CreateRenderer(win, -1, 0);
    if (NULL == rdr)
    {
        SDL_Log("SDL_CreateRenderer failed: %s", SDL_GetError());
        return -1;
    }

    return 0;
}


void deinit()
{
    // 销毁

    SDL_DestroyRenderer(rdr);
    SDL_DestroyWindow(win);
    SDL_Quit();
}

int draw()
{
    // 设置渲染颜色
    SDL_SetRenderDrawColor(rdr, 100, 100, 100, 100);
    // 清除屏幕
    SDL_RenderClear(rdr);

    SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);
    SDL_RenderFillRect(rdr, &rect);

    // 渲染呈现
    SDL_RenderPresent(rdr);
    return 0;
}


void event_loop()
{
    SDL_Event event;
    while (true)
    {
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_QUIT:
                return;
            case SDL_WINDOWEVENT:
                if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
                {
                    std::cout << "1" << std::endl;

                    draw();
                }
                break;

            default:
                break;
            }
        }
    }
}


#undef main
int main()
{
    if (init() < 0)
    {
        return -1;
    }

    draw();

    event_loop();

    deinit();
    return 0;
}

10、鼠标移动事件

            case SDL_MOUSEMOTION:
                SDL_Log("x = %d, y = %d", event.motion.x, event.motion.y);
                rect.x = event.motion.x - 100;
                rect.y = event.motion.y - 50;
                draw();
                break;

11、鼠标点击事件

#include <SDL2/SDL.h>

#define W 720
#define H 640

SDL_Window* win = NULL;
SDL_Renderer* rdr = NULL;
SDL_Rect rect = { 100, 100, 200, 100 };


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

    win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }


    // 创建渲染器
    rdr = SDL_CreateRenderer(win, -1, 0);
    if (NULL == rdr)
    {
        SDL_Log("SDL_CreateRenderer failed: %s", SDL_GetError());
        return -1;
    }

    return 0;
}


void deinit()
{
    // 销毁

    SDL_DestroyRenderer(rdr);
    SDL_DestroyWindow(win);
    SDL_Quit();
}

int draw()
{
    // 设置渲染颜色
    SDL_SetRenderDrawColor(rdr, 100, 100, 100, 100);
    // 清除屏幕
    SDL_RenderClear(rdr);

    SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);
    SDL_RenderFillRect(rdr, &rect);

    // 渲染呈现
    SDL_RenderPresent(rdr);
    return 0;
}


void event_loop()
{
    SDL_Event event;
    while (true)
    {
        while (SDL_PollEvent(&event))
        {
            SDL_Point pt;
            switch (event.type)
            {
            case SDL_QUIT:
                return;
            case SDL_WINDOWEVENT:
                if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
                {
                    draw();
                }
                break;
            case SDL_MOUSEMOTION:
                // SDL_Log("x = %d, y = %d", event.motion.x, event.motion.y);
                // rect.x = event.motion.x - 100;
                // rect.y = event.motion.y - 50;
                // draw();
                break;
            case SDL_MOUSEBUTTONDOWN:
                SDL_Log("SDL_MOUSEBUTTONDOWN x = %d, y = %d, button = %d, clicks = %d",
                    event.button.x, event.button.y, event.button.button, event.button.clicks);
                pt = { event.button.x, event.button.y };
                if (SDL_PointInRect(&pt, &rect))
                {
                    SDL_SetRenderDrawColor(rdr, 0, 200, 0, 255);
                    SDL_RenderFillRect(rdr, &rect);

                    // 渲染呈现
                    SDL_RenderPresent(rdr);
                }


                break;
            case SDL_MOUSEBUTTONUP:
                SDL_Log("SDL_MOUSEBUTTONUP x = %d, y = %d, button = %d, clicks = %d",
                    event.button.x, event.button.y, event.button.button, event.button.clicks);
                pt = { event.button.x, event.button.y };
                if (SDL_PointInRect(&pt, &rect))
                {
                    SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);
                    SDL_RenderFillRect(rdr, &rect);

                    // 渲染呈现
                    SDL_RenderPresent(rdr);
                }
                break;

            default:
                break;
            }
        }
    }
}


#undef main
int main()
{
    if (init() < 0)
    {
        return -1;
    }

    draw();

    event_loop();

    deinit();
    return 0;
}

12、键盘事件

#include <SDL2/SDL.h>

#define W 720
#define H 640

SDL_Window* win = NULL;
SDL_Renderer* rdr = NULL;
SDL_Rect rect = { 100, 100, 200, 100 };

int dx = 1;
int dy = 0;


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

    win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }


    // 创建渲染器
    rdr = SDL_CreateRenderer(win, -1, 0);
    if (NULL == rdr)
    {
        SDL_Log("SDL_CreateRenderer failed: %s", SDL_GetError());
        return -1;
    }

    return 0;
}


void deinit()
{
    // 销毁

    SDL_DestroyRenderer(rdr);
    SDL_DestroyWindow(win);
    SDL_Quit();
}

int draw()
{
    // 设置渲染颜色
    SDL_SetRenderDrawColor(rdr, 100, 100, 100, 100);
    // 清除屏幕
    SDL_RenderClear(rdr);

    SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);
    SDL_RenderFillRect(rdr, &rect);

    // 渲染呈现
    SDL_RenderPresent(rdr);
    return 0;
}


void event_loop()
{
    SDL_Event event;
    while (true)
    {
        while (SDL_PollEvent(&event))
        {
            SDL_Point pt;
            switch (event.type)
            {
            case SDL_QUIT:
                return;
            case SDL_WINDOWEVENT:
                if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
                {
                    draw();
                }
                break;
            case SDL_MOUSEMOTION:
                // SDL_Log("x = %d, y = %d", event.motion.x, event.motion.y);
                // rect.x = event.motion.x - 100;
                // rect.y = event.motion.y - 50;
                // draw();
                break;
            case SDL_MOUSEBUTTONDOWN:
                SDL_Log("SDL_MOUSEBUTTONDOWN x = %d, y = %d, button = %d, clicks = %d",
                    event.button.x, event.button.y, event.button.button, event.button.clicks);
                pt = { event.button.x, event.button.y };
                if (SDL_PointInRect(&pt, &rect))
                {
                    SDL_SetRenderDrawColor(rdr, 0, 200, 0, 255);
                    SDL_RenderFillRect(rdr, &rect);

                    // 渲染呈现
                    SDL_RenderPresent(rdr);
                }


                break;
            case SDL_MOUSEBUTTONUP:
                SDL_Log("SDL_MOUSEBUTTONUP x = %d, y = %d, button = %d, clicks = %d",
                    event.button.x, event.button.y, event.button.button, event.button.clicks);
                pt = { event.button.x, event.button.y };
                if (SDL_PointInRect(&pt, &rect))
                {
                    SDL_SetRenderDrawColor(rdr, 0, 255, 0, 255);
                    SDL_RenderFillRect(rdr, &rect);

                    // 渲染呈现
                    SDL_RenderPresent(rdr);
                }
                break;
            case SDL_KEYDOWN:
                if (event.key.keysym.sym == SDLK_UP)
                {
                    SDL_Log("UP");
                    dy = -1;
                    dx = 0;
                }
                if (event.key.keysym.sym == SDLK_DOWN)
                {
                    SDL_Log("DOWN");
                    dy = 1;
                    dx = 0;
                }
                if (event.key.keysym.sym == SDLK_LEFT)
                {
                    SDL_Log("LEFT");
                    dx = -1;
                    dy = 0;
                }
                if (event.key.keysym.sym == SDLK_RIGHT)
                {
                    SDL_Log("RIGHT");
                    dx = 1;
                    dy = 0;
                }

                break;
            case SDL_KEYUP:
                break;
            case SDL_TEXTEDITING:
                SDL_Log("Edit %s", event.edit.text);
                break;

            case SDL_TEXTINPUT:
                SDL_Log("Input %s", event.text.text);
                break;

            default:
                break;
            }
        }

        rect.x += dx;
        rect.y += dy;
        draw();
        SDL_Delay(10);
    }
}


#undef main
int main()
{
    if (init() < 0)
    {
        return -1;
    }

    draw();

    event_loop();

    deinit();
    return 0;
}

13、加载音频

#include <SDL2/SDL.h>

#define W 1027
#define H 761

SDL_Window* win = NULL;
SDL_Renderer* rdr = NULL;
SDL_Rect rect = { 100, 100, 50, 50 };

Uint8* audio_buf;
Uint32 audio_len;
Uint32 audio_pos = 0;
SDL_AudioDeviceID device_id;


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

    win = SDL_CreateWindow("Hello", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
        W, H, SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN);
    if (NULL == win)
    {
        SDL_Log("SDL_CreateWindow failed: %s", SDL_GetError());
        return -1;
    }


    // 创建渲染器
    rdr = SDL_CreateRenderer(win, -1, 0);
    if (NULL == rdr)
    {
        SDL_Log("SDL_CreateRenderer failed: %s", SDL_GetError());
        return -1;
    }

    return 0;
}

void deinit()
{
    // 销毁
    SDL_CloseAudioDevice(device_id);
    SDL_FreeWAV(audio_buf);
    SDL_DestroyRenderer(rdr);
    SDL_DestroyWindow(win);
    SDL_Quit();
}

int draw()
{
    // 设置渲染颜色
    SDL_SetRenderDrawColor(rdr, 100, 100, 100, 100);
    // 清除屏幕
    SDL_RenderClear(rdr);

    SDL_Surface* surf = SDL_LoadBMP("10.bmp");
    SDL_Texture* texture = SDL_CreateTextureFromSurface(rdr, surf);
    SDL_RenderCopy(rdr, texture, NULL, NULL);

    // 渲染呈现
    SDL_RenderPresent(rdr);
    SDL_DestroyTexture(texture);
    SDL_FreeSurface(surf);
    return 0;
}

void event_loop()
{
    SDL_Event event;
    while (true)
    {
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_QUIT:
                return;
            }
        }

        SDL_Delay(10);
    }
}



void callback(void* userdata, Uint8* stream, int len)
{
    int remain = audio_len - audio_pos;
    if (remain > len)
    {
        SDL_memcpy(stream, audio_buf + audio_pos, len);
        audio_pos += len;
    }
    else
    {
        SDL_memcpy(stream, audio_buf + audio_pos, remain);
        audio_pos = 0;
    }

}


void play_wav()
{
    SDL_AudioSpec audio_spec;


    // 1. 导入WAV文件
    SDL_LoadWAV(R"(D:\CPlusProject\LearnSDL2\Data\warning.wav)", &audio_spec, &audio_buf, &audio_len);

    // 2. 定义播放回调函数
    audio_spec.userdata = (void*)"这是外部传进来的数据";
    audio_spec.callback = callback;

    // 3. 打开音频设备
    device_id = SDL_OpenAudioDevice(NULL, 0, &audio_spec, NULL, 0);

    // 4. 开始播放
    SDL_PauseAudioDevice(device_id, 0);

    // 5. 释放资源 关闭设备
}


#undef main
int main()
{
    if (init() < 0)
    {
        return -1;
    }

    play_wav();

    event_loop();

    deinit();
    return 0;
}

相关推荐

  1. UniswapV2周边合约学习(五)-- ExampleFlashSwap.sol

    2024-03-25 06:32:05       44 阅读
  2. <span style='color:red;'>SQL</span>-<span style='color:red;'>2</span>

    SQL-2

    2024-03-25 06:32:05      51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 06:32:05       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 06:32:05       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 06:32:05       87 阅读
  4. Python语言-面向对象

    2024-03-25 06:32:05       96 阅读

热门阅读

  1. 维吉尼亚(Vigenere)密码

    2024-03-25 06:32:05       39 阅读
  2. python | yield用法详解

    2024-03-25 06:32:05       43 阅读
  3. Spring自定义注解

    2024-03-25 06:32:05       36 阅读
  4. torch中根据矩阵对应元素抽取矩阵中的值

    2024-03-25 06:32:05       45 阅读
  5. leetCode209.长度最小的子数组

    2024-03-25 06:32:05       42 阅读
  6. LeetCode 1877.数组中最大数对和的最小值

    2024-03-25 06:32:05       46 阅读
  7. k8s的volumn解析

    2024-03-25 06:32:05       46 阅读