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