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