SDL2之SDL_RenderCopy

发布时间 2024-01-08 16:08:49作者: flxx

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. 坐标和尺寸

理解并正确设置srcrectdstrect 参数。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应用程序提供灵活的图形渲染能力。