SDL 简单画板

2021-06-08  本文已影响0人  wjundong
#define SDL_MAIN_HANDLED 

#include <stdio.h>
#include <SDL2/SDL.h>
#include <time.h>



#define WINDOWS_HEIGHT  480
#define WINDOWS_WIDTH   720

typedef struct
{
    SDL_Window *window;
    SDL_Renderer *renderer;
    SDL_Texture *texture;

    int sdl_quit;
} mysdl_t;



/**
 * \brief mysdl 窗口创建
 */
void mysdl_windows_create(mysdl_t *m)
{
    /* 创建窗口 */
    m->window = SDL_CreateWindow("TEST", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
                                 WINDOWS_WIDTH, WINDOWS_HEIGHT, SDL_WINDOW_SHOWN);

    /* 为窗口中创建 renderer */
    m->renderer = SDL_CreateRenderer(m->window, -1, SDL_RENDERER_SOFTWARE);

    /* 创建 texture */
    m->texture = SDL_CreateTexture(m->renderer, SDL_PIXELFORMAT_ARGB8888,
                                   SDL_TEXTUREACCESS_STATIC, WINDOWS_WIDTH, WINDOWS_HEIGHT);

    SDL_SetTextureBlendMode(m->texture, SDL_BLENDMODE_BLEND);
}



/**
 * \brief sdl 退出
 * \param 
 */
void mysdl_quit(mysdl_t *m)
{
    SDL_DestroyTexture(m->texture);
    SDL_DestroyRenderer(m->renderer);
    SDL_DestroyWindow(m->window);

    SDL_Quit();
}


/**
 * \brief 窗口事件处理
 * 
 */
void widows_event_handler(SDL_Event *event, mysdl_t *m)
{
    switch (event->window.event)
    {
    case SDL_WINDOWEVENT_TAKE_FOCUS:
        printf("SDL_WINDOWEVENT_EXPOSED\n");
        break;
    case SDL_WINDOWEVENT_EXPOSED:
        printf("SDL_WINDOWEVENT_EXPOSED\n");
        break;
    default:
        break;
    }
}


/**
 * \brief 绘制区域
 */
void draw_point_area(mysdl_t *m, int x, int y, int draw_size)
{
    int x0 = x - draw_size < 0 ? 0 : x - draw_size;
    int y0 = y - draw_size < 0 ? 0 : y - draw_size;

    int x1 = x + draw_size > WINDOWS_WIDTH ? WINDOWS_WIDTH : x + draw_size;
    int y1 = y + draw_size > WINDOWS_HEIGHT ? WINDOWS_HEIGHT : y + draw_size;


    for ( y = y0; y < y1; y++)
    {
        for ( x = x0; x < x1; x++)
        {
            SDL_RenderDrawPoint(m->renderer, x, y);
        }   
    }
}

/**
 * \brief 鼠标移动相关事件
 */
void mouse_event_handler(SDL_Event *event, mysdl_t *m)
{

    static int r = 0, g = 0, b = 0, a = 0, s = 2;

    /* 鼠标左键按下 */
    if (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(1))
    {
        /* 设置画笔颜色: 红色*/
        SDL_SetRenderDrawColor(m->renderer, r, g, b, a);
    
        /* 在  renderer 上画点 */
        // SDL_RenderDrawPoint(m->renderer, event->motion.x, event->motion.y);
        draw_point_area(m, event->motion.x, event->motion.y, s);
    }

    else  if (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(3))
    {
        srand(time(NULL));

        r = rand() % 255;
        g = rand() % 255;
        b = rand() % 255;
        a = rand() % 255;
        s = rand() % 10 + 1;
    }
}


/**
 * \brief SDL 事件处理
 */
void sdl_event_handler(mysdl_t *m)
{
    SDL_Event event;

    while (SDL_PollEvent(&event))
    {
        switch (event.type)
        {
        /* 窗口事件 */
        case SDL_WINDOWEVENT:
            widows_event_handler(&event, m);
            break;

        /* 鼠标移动 */
        case SDL_MOUSEMOTION:
            mouse_event_handler(&event, m);
            break;

        /* 退出 sdl */
        case SDL_QUIT:
            m->sdl_quit = 1;
            break;

        default:
            break;
        }
    }
}


/**
 * \brief 更新窗口
 * 
 * \param 
 */
void update_window(mysdl_t *m)
{
    SDL_RenderPresent(m->renderer);
}



/**
 * \brief mysdl 初始化
 */
void mysdl_init(mysdl_t *m)
{
    SDL_Init(SDL_INIT_VIDEO);
    mysdl_windows_create(m);

    /* 将 renderer 清空成白色 */
    SDL_SetRenderDrawColor(m->renderer, 255, 255, 255, 255);
    SDL_RenderClear(m->renderer);

    m->sdl_quit = 0;
}



int main(int argc, char const *argv[])
{
    mysdl_t mysdl;

    mysdl_init(&mysdl);

    while (mysdl.sdl_quit == 0)
    {
        sdl_event_handler(&mysdl);

        update_window(&mysdl);
    }

    /* sdl 退出 */
    mysdl_quit(&mysdl);

    printf("Done\n");
}

cmake


cmake_minimum_required(VERSION 3.10)
project(demo)


INCLUDE_DIRECTORIES("./src/libfuck")

file(GLOB_RECURSE SRCS
    "./src/libfuck/*.c"
)


find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})


add_executable(demo ./src/main.c ${SRCS})
target_link_libraries(demo SDL2)
上一篇 下一篇

猜你喜欢

热点阅读