我有一个要在渲染循环中渲染的纹理array.当我遍历数组时,我没有得到任何实际显示在窗口上的纹理.

以下是我如何初始化我想使用的纹理:

SDL_Texture* tracks[5];
SDL_Rect trackRects[5];
for (int i = 1; i < 6; i++) {
    char buf[20];
    snprintf(buf, 20, ".\\assets\\track%d.png", i);
        
    tracks[i-1] = IMG_LoadTexture(appRenderer, buf);
        
    trackRects[i-1].x = 15;
    trackRects[i-1].y = 28*(i-1) + 150;
}

为了呈现所有这些内容,我try 这样做:

for (int i = 0; i < 5; i++) {
    res = SDL_RenderCopy(appRenderer, tracks[i], NULL, &trackRects[i]);
    if (res < 0) printError();
}

这不会返回任何错误,它会编译,但当我启动我的程序时,它不会显示任何图像.

完整代码:

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <stdio.h>

int running = 1;
SDL_Window* appWindow = NULL;
SDL_Surface* appSurface = NULL;
SDL_Renderer* appRenderer = NULL;

int res;

int main(int argc, char* argv[]) {
    int videoerror = SDL_Init(SDL_INIT_VIDEO);
    if (videoerror < 0) printError();
    SDL_Window* appWindow = SDL_CreateWindow("name", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1000, 800, SDL_WINDOW_SHOWN);
    
    int imgerror = IMG_Init(IMG_INIT_PNG);
    if (imgerror < 0) printError();
    
    SDL_Renderer* appRenderer = SDL_CreateRenderer(appWindow, -1, SDL_RENDERER_SOFTWARE);
    
    SDL_Texture* tracks[5];
    SDL_Rect trackRects[5];
    for (int i = 1; i < 6; i++) {
        char buf[20];
        snprintf(buf, 20, ".\\assets\\track%d.png", i);
        
        tracks[i-1] = IMG_LoadTexture(appRenderer, buf);
        
        trackRects[i-1].x = 15;
        trackRects[i-1].y = 28*(i-1) + 150;
    }

    while (running == 1) {
        SDL_Event event;
        while (SDL_PollEvent(&event) != 0) {
            if (event.type == SDL_QUIT) {
                running = 0;
            }
        }
        
        SDL_RenderClear(appRenderer);
        
        for (int i = 0; i < 5; i++) {
            res = SDL_RenderCopy(appRenderer, tracks[i], NULL, &trackRects[i]);
            if (res < 0) printError();
        }
        SDL_RenderPresent(appRenderer);
        
        SDL_Delay(100);
    }
    
    SDL_DestroyWindow(appWindow);
    appWindow = NULL;

    IMG_Quit();
    SDL_Quit();
    
    return 0;
}

推荐答案

以我最热门的 comments 为序.

我添加了.w.h的设置,并添加了一个[粗略的]位置:

#include <SDL2/SDL.h>
#include <SDL2/SDL_image.h>
#include <stdio.h>

#define WID     1000
#define HGT     800

int running = 1;
SDL_Window *appWindow = NULL;
SDL_Surface *appSurface = NULL;
SDL_Renderer *appRenderer = NULL;

int res;

void
printError(void)
{
    exit(9);
}

int
main(int argc, char *argv[])
{
    int videoerror = SDL_Init(SDL_INIT_VIDEO);

    if (videoerror < 0)
        printError();
    SDL_Window *appWindow = SDL_CreateWindow("name", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WID, HGT, SDL_WINDOW_SHOWN);

    int imgerror = IMG_Init(IMG_INIT_PNG);

    if (imgerror < 0)
        printError();

    SDL_Renderer *appRenderer = SDL_CreateRenderer(appWindow, -1, SDL_RENDERER_SOFTWARE);

    SDL_Texture *tracks[5];
    SDL_Rect trackRects[5];

    int abs_y = 0;
    int abs_x = 0;
    int max_h = 0;

    for (int i = 0; i < 5; i++) {
        char buf[20];

        snprintf(buf, 20, "assets/track%d.png", i + 1);

        SDL_Texture *track = IMG_LoadTexture(appRenderer, buf);
        tracks[i] = track;

        SDL_Rect *rect = &trackRects[i];

        int w;
        int h;
        Uint32 fmt;
        int access;
        SDL_QueryTexture(track,&fmt,&access,&w,&h);

#if 0
        rect->x = 15;
        rect->y = 28 * (i - 1) + 150;

        rect->w = 512;
        rect->h = 512;
#else
        if ((abs_x + w) > WID) {
            abs_x = 0;
            abs_y += max_h;
            max_h = 0;
        }

        rect->x = abs_x;
        rect->y = abs_y;
        rect->w = w;
        rect->h = h;

        abs_x += w;
#endif

        if (h > max_h)
            max_h = h;
    }

    while (running == 1) {
        SDL_Event event;

        while (SDL_PollEvent(&event) != 0) {
            if (event.type == SDL_QUIT) {
                running = 0;
            }
        }

        SDL_RenderClear(appRenderer);

        for (int i = 0; i < 5; i++) {
            res = SDL_RenderCopy(appRenderer, tracks[i], NULL, &trackRects[i]);
            if (res < 0)
                printError();
        }
        SDL_RenderPresent(appRenderer);

        SDL_Delay(100);
    }

    SDL_DestroyWindow(appWindow);
    appWindow = NULL;

    IMG_Quit();
    SDL_Quit();

    return 0;
}

在上面的代码中,我使用了cpp个条件句来表示旧代码和新代码:

#if 0
// old code
#else
// new code
#endif

#if 1
// new code
#endif

注意:这可以通过运行文件到unifdef -k来清除


I used random images on my system. Here is the output: enter image description here

C++相关问答推荐

C strlen on char array

手动矢量化性能差异较大

从组播组地址了解收到的数据包长度

Can函数指针指向C++中具有不同参数连续性的函数

二进制计算器与gmp

如何使用指向 struct 数组的指针并访问数组中特定索引处的 struct

使用%f格式说明符打印整数值

为什么这个分配做得不好呢?

为什么WcrTomb只支持ASCII?

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

如何修复我的qsort()算法?它每次都给出不同的结果

C23标准是否向后兼容?

在下面的C程序中,.Ap0是如何解释的?

如何使用calloc和snprintf

强制GCC始终加载常量(即只读),即使启用了优化

为什么GCC 13没有显示正确的二进制表示法?

未使用sem_open正确初始化信号量

在C中打印指针本身

从系统派生线程调用CRT

定义 int a = 0, b = a++, c = a++;在 C 中定义了行为吗?