Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在C中的SDL2中绘制正方形数组_C_Sdl_Sdl 2 - Fatal编程技术网

无法在C中的SDL2中绘制正方形数组

无法在C中的SDL2中绘制正方形数组,c,sdl,sdl-2,C,Sdl,Sdl 2,我使用SDL2forC根据数组(地形[某物][某物])绘制不同颜色的正方形。但当我运行它时,会出现一个红色的方块画在左上角,然后窗口停止响应 基本上,我所做的是使用几个for循环遍历数组,根据给定元素的值,每次在不同的位置绘制一个不同颜色的正方形。实际上,我不确定当我使用相同的rect结构绘制下一个时,我绘制的内容是否会自动清除 int terrain_print() { if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { prin

我使用SDL2forC根据数组(地形[某物][某物])绘制不同颜色的正方形。但当我运行它时,会出现一个红色的方块画在左上角,然后窗口停止响应

基本上,我所做的是使用几个for循环遍历数组,根据给定元素的值,每次在不同的位置绘制一个不同颜色的正方形。实际上,我不确定当我使用相同的rect结构绘制下一个时,我绘制的内容是否会自动清除

int terrain_print()
{
    if (SDL_Init(SDL_INIT_EVERYTHING) != 0)
    {
        printf("Error initializing SDL: %s\n", SDL_GetError());
        return 0;
    }
    SDL_Window* wind = SDL_CreateWindow("Terrain Generator",
        SDL_WINDOWPOS_CENTERED,
        SDL_WINDOWPOS_CENTERED,
        WIDTH, HEIGHT, 0);
    if (!wind)
    {
        printf("Error creating window: %s\n", SDL_GetError());
        SDL_Quit();
        return 0;
    }
    Uint32 render_flags = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC;
    SDL_Renderer* rend = SDL_CreateRenderer(wind, -1, render_flags);
    if (!rend)
    {
        printf("Error creating renderer: %s\n", SDL_GetError());
        SDL_DestroyWindow(wind);
        SDL_Quit();
        return 0;
    }
    bool running = true;
    float x_pos = 0, y_pos = 0;
    SDL_Rect rect = { (int)x_pos, (int)y_pos, PIXELSIZE, PIXELSIZE };
    SDL_Event event;
    while (running)
    {
        while (SDL_PollEvent(&event))
        {
            switch (event.type)
            {
                case SDL_QUIT:
                    running = false;
                    break;
            }
        }
        for (int i = ARRAYH - 1; i >= 0; i--)
        {
            for (int j = 0; j < ARRAYW; j++)
            {
                switch (terrain[i][j])
                {
                    case air:
                        SDL_SetRenderDrawColor(rend, 75, 163, 255, 255);
                    case grass:
                        SDL_SetRenderDrawColor(rend, 0, 181, 16, 255);
                    case dirt:
                        SDL_SetRenderDrawColor(rend, 74, 26, 0, 255);
                    case stone:
                        SDL_SetRenderDrawColor(rend, 85, 85, 85, 255);
                }
                SDL_SetRenderDrawColor(rend, 255, 0, 0, 255);
                SDL_RenderFillRect(rend, &rect);
                SDL_RenderPresent(rend);
                SDL_Delay(1000 / FPS);
                x_pos += PIXELSIZE;
            }
            y_pos += PIXELSIZE;
        }
    }
    SDL_DestroyRenderer(rend);
    SDL_DestroyWindow(wind);
    SDL_Quit();
    return 0;
}
int-terrain_-print()
{
if(SDL_Init(SDL_Init_EVERYTHING)!=0)
{
printf(“初始化SDL时出错:%s\n”,SDL_GetError());
返回0;
}
SDL_Window*wind=SDL_CreateWindow(“地形生成器”,
SDL_窗口位置居中,
SDL_窗口位置居中,
宽度,高度,0);
如果(!风)
{
printf(“创建窗口时出错:%s\n”,SDL_GetError());
SDL_退出();
返回0;
}
Uint32 render_flags=SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC;
SDL_渲染器*rend=SDL_CreateRenderer(风,-1,渲染标志);
如果(!rend)
{
printf(“创建呈现程序时出错:%s\n”,SDL_GetError());
SDL_(风);
SDL_退出();
返回0;
}
bool running=true;
浮动x_pos=0,y_pos=0;
SDL_Rect Rect={(int)x_pos,(int)y_pos,PIXELSIZE,PIXELSIZE};
SDL_事件;
(跑步时)
{
while(SDL_事件和事件))
{
开关(事件类型)
{
案例SDL_退出:
运行=错误;
打破
}
}
对于(int i=ARRAYH-1;i>=0;i--)
{
对于(int j=0;j
正如其他人在评论部分指出的,您的一个
开关
语句中可能缺少
break
语句。但是,即使您有这些
break
语句,整个
switch
语句的内容也会被覆盖,方法是将以下行中的颜色改回红色:

SDL_SetRenderDrawColor(rend,255,0,0,255)

此外,您必须更新
rect.x
rect.y
,而不是更新
x\u pos
y\u pos
。否则,您将始终覆盖相同的矩形

另一个问题可能是,根据上的官方文件,建议在开始绘制每个新框架之前调用。文档说明,在开始绘制下一帧时,不应依赖backbuffer中仍然存在的上一帧内容。然而,您似乎依赖于此。即使您的程序在计算机上运行时未调用
SDL\u RenderClear
,当您更改配置或在其他平台上运行程序时,它也可能停止工作。我认为这个警告被放在文档中是有充分理由的。因此,您可能希望更改算法以在一个帧中渲染所有内容,或者,如果希望保持在一个帧中添加的新矩形的外观,请在新帧中渲染前一帧中的所有矩形。或者,您可以使用渲染到
SDL_纹理
,而不是直接渲染到屏幕,以便确保内容不会丢失


然后窗口停止响应

这并不奇怪。您正在调用
SDL\u RenderPresent
SDL\u Delay
每个
terrain
元素一次,即每个最里面的循环迭代一次。在渲染每帧之间有
1000/FPS
毫秒的暂停。根据
地形
阵列的大小(您在发布的代码中没有显示),渲染所有这些帧的总时间可能是几秒。在此期间,您不会处理事件。只要您不处理事件,您的窗口就会无响应。只有在渲染完整个
地形
阵列后,才能在外部循环中再次开始处理事件

我建议您不要使用
SDL\u Delay
。这样,在渲染下一帧时将调用回调函数。同时,您可以处理事件,窗口将响应。我建议您的回调函数只需使用应用程序定义的事件(使用注册)进行调用,而主线程正在使用等待这些事件和其他可能的事件

或者,在帧之间调用应该足以保持窗口响应。但是,如果您希望能够对事件做出响应,那么上述段落中提到的解决方案更为简洁


另一种选择是使用隐式调用
SDL\u PumpEvents
的函数,允许您在不阻塞的情况下检查新事件。

missing
break在开关中?