【问题标题】:Displaying the rectangle using a for loop in SDL2 C在 SDL2 C 中使用 for 循环显示矩形
【发布时间】:2016-03-05 20:52:44
【问题描述】:

我目前正在使用 for 循环沿 x 轴创建 4 个矩形。当我运行程序时,矩形的图像会出现几毫秒,然后消失。你能告诉我我必须做什么才能使图像永久显示在屏幕上吗?

当我创建单个矩形时,它会显示图像而不会消失。

举个例子会很有帮助。谢谢

int main(){
int barrack1_xposition = 167,i=1;
int cnt_barrack=0;
SDL_Window *o = NULL;
SDL_Renderer *r = NULL;
SDL_Rect bar1[4];
SDL_Event e;


SDL_Init(SDL_INIT_VIDEO);

o = SDL_CreateWindow("SPACE INVADERS",
                        SDL_WINDOWPOS_UNDEFINED,
                        SDL_WINDOWPOS_UNDEFINED,
                        1024,
                        800,
                        SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);

r = SDL_CreateRenderer(o, -1,SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

while(i)
{
    while(SDL_PollEvent(&e) !=0)
    {
        if(e.type == SDL_QUIT)
            i=0;

   }

    for(cnt_barrack = 0; cnt_barrack < 4; cnt_barrack++)
    {
        bar1[cnt_barrack].x=barrack1_xposition;
        bar1[cnt_barrack].y=250;
        bar1[cnt_barrack].h=50;
        bar1[cnt_barrack].w=50;

        barrack1_xposition += 200;
    }

    SDL_SetRenderDrawColor(r,255,255,255,255);
    SDL_RenderFillRect(r,&bar1[0]);
    SDL_RenderFillRect(r,&bar1[1]);
    SDL_RenderFillRect(r,&bar1[2]);
    SDL_RenderFillRect(r,&bar1[3]);
    SDL_RenderPresent(r);   
}
SDL_DestroyWindow(o);
SDL_DestroyRenderer(r);;
SDL_Quit();
}

【问题讨论】:

  • 我建议您发布一个完整的可编译示例(通过制作它,您很可能会在代码中发现错误)。例如。在给定的 sn-p r 中永远不会设置,并且不会调用 SDL_RenderPresent。不过基本方法是正确的。
  • 我发布了我的整个代码。请你看一下。
  • 我认为给定示例没有问题,但是您在绘制之前没有清除渲染目标是可疑的。设置清晰的颜色(例如黑色)并在调用之前调用SDL_RenderClear
  • 我已经完成了,但它不会留在屏幕上。你能测试我实现 SDL_RenderClear 的代码吗?
  • 如果有效,请发帖。

标签: c arrays for-loop sdl-2 rect


【解决方案1】:

你的问题是因为你没有在每一帧上重置barrack1_xposition,所以它越来越高。最初我没有注意到,因为没有RenderClear,所以看起来很好,但实际上不是。

#include "SDL.h"

int main(){
    int barrack1_xposition,i=1;
    int cnt_barrack=0;
    SDL_Window *o = NULL;
    SDL_Renderer *r = NULL;
    SDL_Rect bar1[4];
    SDL_Event e;


    SDL_Init(SDL_INIT_VIDEO);

    o = SDL_CreateWindow("SPACE INVADERS",
            SDL_WINDOWPOS_UNDEFINED,
            SDL_WINDOWPOS_UNDEFINED,
            1024,
            800,
            SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);

    r = SDL_CreateRenderer(o, -1,SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

    while(i)
    {
        while(SDL_PollEvent(&e) !=0)
        {
            if(e.type == SDL_QUIT)
                i=0;

        }

        barrack1_xposition=167;

        for(cnt_barrack = 0; cnt_barrack < 4; cnt_barrack++)
        {
            bar1[cnt_barrack].x=barrack1_xposition;
            bar1[cnt_barrack].y=250;
            bar1[cnt_barrack].h=50;
            bar1[cnt_barrack].w=50;

            barrack1_xposition += 200;
        }

        SDL_SetRenderDrawColor(r,0,0,0,0);
        SDL_RenderClear(r);

        SDL_SetRenderDrawColor(r,255,255,255,255);
        SDL_RenderFillRect(r,&bar1[0]);
        SDL_RenderFillRect(r,&bar1[1]);
        SDL_RenderFillRect(r,&bar1[2]);
        SDL_RenderFillRect(r,&bar1[3]);
        SDL_RenderPresent(r);   
    }
    SDL_DestroyWindow(o);
    SDL_DestroyRenderer(r);;
    SDL_Quit();

    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 2014-03-20
    • 2021-08-15
    • 2021-07-09
    • 2021-12-27
    相关资源
    最近更新 更多