SDL2之SDL_RenderCopy
SDL_RenderCopy函数的用途与用法
用途:
SDL_RenderCopy
用于将纹理复制到渲染器的目标上。这是在实际渲染中最常用的函数之一。通过该函数,你可以在屏幕上呈现图像、精灵、文字等。
用法:
SDL_RenderCopy的函数原型如下:
int SDL_RenderCopy(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrect, const SDL_Rect* dstrect);
renderer
: 渲染器,用于目标绘制。texture
: 要复制的纹理。srcrect
: 源纹理矩形,指定纹理上要复制的区域,如果为NULL,则复制整个纹理。dstrect
: 目标矩形,指定纹理要绘制到渲染目标上的位置和大小。
以下是一个简单的示例代码,演示如何使用SDL_RenderCopy
将纹理绘制到渲染器上:
#include <SDL.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
// 初始化SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "SDL initialization failed: %s\n", SDL_GetError());
return -1;
}
// 创建窗口
SDL_Window* window = SDL_CreateWindow("SDL2 Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
if (window == NULL) {
fprintf(stderr, "Window creation failed: %s\n", SDL_GetError());
SDL_Quit();
return -1;
}
// 创建渲染器
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (renderer == NULL) {
fprintf(stderr, "Renderer creation failed: %s\n", SDL_GetError());
SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
// 加载图像为纹理
SDL_Surface* surface = SDL_LoadBMP("image.bmp");
if (surface == NULL) {
fprintf(stderr, "Image loading failed: %s\n", SDL_GetError());
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_FreeSurface(surface);
if (texture == NULL) {
fprintf(stderr, "Texture creation failed: %s\n", SDL_GetError());
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
// 清空渲染器
SDL_RenderClear(renderer);
// 复制纹理到渲染器
SDL_Rect srcrect = {0, 0, 100, 100}; // 源纹理矩形
SDL_Rect dstrect = {50, 50, 100, 100}; // 目标矩形
SDL_RenderCopy(renderer, texture, &srcrect, &dstrect);
// 更新窗口
SDL_RenderPresent(renderer);
// 等待用户退出
SDL_Delay(3000);
// 销毁纹理、渲染器和窗口
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
// 退出SDL
SDL_Quit();
return 0;
}
使用注意事项
1. 资源管理
确保在使用完纹理后,调用SDL_DestroyTexture
销毁纹理,以释放相关资源。
2. 确认纹理加载成功
在调用SDL_CreateTextureFromSurface
时,确保图像文件成功加载为表面,以免导致纹理创建失败。
3. 坐标和尺寸
理解并正确设置srcrect
和 dstrect
参数。srcrect
表示源纹理矩形,dstrect
表示目标矩形。确保它们的坐标和尺寸都合理。
完整示例代码
#include <SDL.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
// 初始化SDL
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "SDL initialization failed: %s\n", SDL_GetError());
return -1;
}
// 创建窗口
SDL_Window* window = SDL_CreateWindow("SDL2 Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN);
if (window == NULL) {
fprintf(stderr, "Window creation failed: %s\n", SDL_GetError());
SDL_Quit();
return -1;
}
// 创建渲染器
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (renderer == NULL) {
fprintf(stderr, "Renderer creation failed: %s\n", SDL_GetError());
SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
// 加载图像为纹理
SDL_Surface* surface = SDL_LoadBMP("image.bmp");
if (surface == NULL) {
fprintf(stderr, "Image loading failed: %s\n", SDL_GetError());
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
SDL_Texture* texture = SDL_CreateTextureFromSurface(renderer, surface);
SDL_FreeSurface(surface);
if (texture == NULL) {
fprintf(stderr, "Texture creation failed: %s\n", SDL_GetError());
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
// 清空渲染器
SDL_RenderClear(renderer);
//
复制纹理到渲染器
SDL_Rect srcrect = {0, 0, 100, 100}; // 源纹理矩形
SDL_Rect dstrect = {50, 50, 100, 100}; // 目标矩形
SDL_RenderCopy(renderer, texture, &srcrect, &dstrect);
// 更新窗口
SDL_RenderPresent(renderer);
// 等待用户退出
SDL_Delay(3000);
// 销毁纹理、渲染器和窗口
SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
// 退出SDL
SDL_Quit();
return 0;
}
通过遵循上述用法和注意事项,你可以有效地使用 SDL_RenderCopy
函数将纹理绘制到渲染器上,为你的SDL应用程序提供灵活的图形渲染能力。
本文来自博客园,作者:flxx,转载请注明原文链接:https://www.cnblogs.com/faithlocus/p/17952656