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)