SDL设置画布背景,通过捕获鼠标按键位置,把鼠标按键的位置连接成图
时间: 2024-05-05 19:20:57 浏览: 13
要设置画布背景,可以使用SDL提供的SDL_FillRect函数,具体如下:
```c
// 创建一个窗口
SDL_Window* window = SDL_CreateWindow("My Window",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640, 480,
SDL_WINDOW_SHOWN);
// 创建渲染器
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
// 创建画布
SDL_Texture* canvas = SDL_CreateTexture(renderer,
SDL_PIXELFORMAT_RGBA8888,
SDL_TEXTUREACCESS_TARGET,
640, 480);
// 设置渲染目标为画布
SDL_SetRenderTarget(renderer, canvas);
// 填充画布背景
SDL_Rect rect = {0, 0, 640, 480};
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); // 设置颜色为白色
SDL_RenderFillRect(renderer, &rect);
// 恢复渲染目标为窗口
SDL_SetRenderTarget(renderer, NULL);
// 将画布渲染到窗口
SDL_RenderCopy(renderer, canvas, NULL, NULL);
SDL_RenderPresent(renderer);
```
接下来,我们需要捕获鼠标按键位置,并将其连接成图。可以使用SDL提供的事件循环来捕获鼠标事件,具体如下:
```c
// 事件循环
SDL_Event event;
bool quit = false;
bool mouse_down = false;
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
while (!quit) {
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
quit = true;
break;
case SDL_MOUSEBUTTONDOWN:
mouse_down = true;
x1 = event.button.x;
y1 = event.button.y;
break;
case SDL_MOUSEBUTTONUP:
mouse_down = false;
x2 = event.button.x;
y2 = event.button.y;
// 绘制线段
SDL_SetRenderTarget(renderer, canvas);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 设置颜色为黑色
SDL_RenderDrawLine(renderer, x1, y1, x2, y2);
SDL_SetRenderTarget(renderer, NULL);
break;
}
}
SDL_RenderCopy(renderer, canvas, NULL, NULL);
SDL_RenderPresent(renderer);
}
```
这段代码中,我们使用了变量`mouse_down`来记录鼠标左键是否按下,当鼠标左键按下时,记录当前的鼠标坐标`(x1, y1)`,当鼠标左键释放时,记录释放时的鼠标坐标`(x2, y2)`,并绘制一条从`(x1, y1)`到`(x2, y2)`的直线段。绘制直线段时,我们需要将渲染目标设置为画布,绘制完后再恢复渲染目标为窗口。
完整的代码如下:
```c
#include <SDL2/SDL.h>
int main(int argc, char* argv[]) {
SDL_Init(SDL_INIT_VIDEO);
// 创建一个窗口
SDL_Window* window = SDL_CreateWindow("My Window",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640, 480,
SDL_WINDOW_SHOWN);
// 创建渲染器
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
// 创建画布
SDL_Texture* canvas = SDL_CreateTexture(renderer,
SDL_PIXELFORMAT_RGBA8888,
SDL_TEXTUREACCESS_TARGET,
640, 480);
// 设置渲染目标为画布
SDL_SetRenderTarget(renderer, canvas);
// 填充画布背景
SDL_Rect rect = {0, 0, 640, 480};
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); // 设置颜色为白色
SDL_RenderFillRect(renderer, &rect);
// 恢复渲染目标为窗口
SDL_SetRenderTarget(renderer, NULL);
// 将画布渲染到窗口
SDL_RenderCopy(renderer, canvas, NULL, NULL);
SDL_RenderPresent(renderer);
// 事件循环
SDL_Event event;
bool quit = false;
bool mouse_down = false;
int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
while (!quit) {
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
quit = true;
break;
case SDL_MOUSEBUTTONDOWN:
mouse_down = true;
x1 = event.button.x;
y1 = event.button.y;
break;
case SDL_MOUSEBUTTONUP:
mouse_down = false;
x2 = event.button.x;
y2 = event.button.y;
// 绘制线段
SDL_SetRenderTarget(renderer, canvas);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // 设置颜色为黑色
SDL_RenderDrawLine(renderer, x1, y1, x2, y2);
SDL_SetRenderTarget(renderer, NULL);
break;
}
}
SDL_RenderCopy(renderer, canvas, NULL, NULL);
SDL_RenderPresent(renderer);
}
// 销毁资源
SDL_DestroyTexture(canvas);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
```
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)