2016-03-05 7 views
-3

В настоящее время я использую цикл for для создания 4 прямоугольников вдоль оси x. Когда я запускаю программу, изображение прямоугольника появляется на несколько миллисекунд, прежде чем оно исчезнет. Можете ли вы показать мне, что мне нужно сделать, чтобы изображение отображалось на экране постоянно.Отображение прямоугольника с использованием цикла for в SDL2 C

Когда я создаю отдельные прямоугольники, он отображает изображение без исчезновения.

Пример будет полезен. Благодаря

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(); 
} 
+1

Предлагаю вам опубликовать полный компилируемый пример (и, делая это, вы, скорее всего, обнаружите ошибку в своем коде). Например. в данном фрагменте 'r' никогда не устанавливается, а SDL_RenderPresent не вызывается. Однако основной подход является правильным. – keltar

+0

Я отправил весь свой код. Не могли бы вы взглянуть на него. – user5771881

+1

Я не вижу проблем с данным примером, но подозрительно, что вы не очистили свою цель рендеринга до рисования. Установите четкий цвет (например, черный) и вызовите 'SDL_RenderClear' перед вызовами рисования. – keltar

ответ

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; 
}