c ++ SDL объединяет текст и цифры

Я делаю большой проект и хочу показать пользователю информацию, которая выглядит красиво.

Все, что мне нужно, это уметь рисовать квадрат и текст внутри.

Я нарисовал текст и квадраты, но не могу соединить их вместе. Я даже обнаружил место, где есть проблема. Это функция SDL_SetVideoMode (mwidth, mheight, bpp, flags).

Это место выделено. Заранее спасибо!

using namespace std;
#define SPACING 0
TTF_Font *font=0;
int  font_size=16;
SDL_Surface *screen;)



void draw_text_at(SDL_Surface *scr,char *msg, int x0, int y0)
{
   int h;
   SDL_Rect r;

   SDL_Color fg={0,0,0,255};
   h=TTF_FontLineSkip(font);

    r.x=x0;
    r.y=y0-h;
    r.x=x0-TTF_GetFontOutline(font);
    r.y+=h+SPACING-TTF_GetFontOutline(font);

    SDL_Surface *surf=TTF_RenderText_Blended(font,msg,fg);

      if(surf)
      {   SDL_BlitSurface(surf,0,scr,&r);
          SDL_FreeSurface(surf);
      }
}

void window::handle_key_down(SDL_keysym * keysym)
{
  switch(keysym->sym)
  {
    case SDLK_ESCAPE:
     exit(0);
     break;

    default:
     break;
  }
}


 void window::setup_opengl()
 {
  float ratio=(float)mwidth/(float)mheight;
  glShadeModel(GL_SMOOTH);
  glCullFace(GL_BACK);
  glFrontFace(GL_CCW);

  glEnable(GL_CULL_FACE);
  glClearColor(1.0f,1.0f,1.0f,1.0f);
  glViewport(0,0,mwidth,mheight);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  gluPerspective(60.0,ratio,1.0,1024.0);
  glEnable(GL_DEPTH_TEST);
  glDepthFunc(GL_LEQUAL);
  glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
 }


 void window::draw_screen()
 {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();  // set  system of coordinates to the center of the screen
  glTranslatef(0.0,0.0,-10.0);
  glColor4f(0.0,1.0,1.0,1.0);

  glBegin(GL_QUADS);
   glVertex3f(-8, 0-2 ,0);
   glVertex3f(-2+-8,0-2 ,0);
   glVertex3f(-2+-8,-2-2,0);
   glVertex3f(0+-8, -2-2,0); 
  glEnd();

  glBegin(GL_QUADS);
   glVertex3f(-8+3, 0-2 ,0);
   glVertex3f(-2+-8+3,0-2 ,0);
   glVertex3f(-2+-8+3,-2-2,0);
   glVertex3f(0+-8+3, -2-2,0);
  glEnd ();

  SDL_GL_SwapBuffers( );
 }


void window(int quantity_of_disks, hard_disk &disk)
 {
   if((SDL_Init(SDL_INIT_VIDEO)<0))
    {printf("Could not initialize SDL: %s.\n", SDL_GetError());
    exit(-1); //return -1;
    }

   if(TTF_Init()==-1)
    {   printf("TTF_Init: %s\n", TTF_GetError());
        exit(-2);
    }

   const SDL_VideoInfo *info=NULL;
   int flags=0,bpp=0;
   info=SDL_GetVideoInfo();

   if(!info)
    {   fprintf(stderr,"Video query failed");
        SDL_Quit();
        exit(0);
    }

   bpp=info->vfmt->BitsPerPixel;

   SDL_GL_SetAttribute(SDL_GL_RED_SIZE,5);
   SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE,5);
   SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE,5);
   SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,16);
   SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);

ЗДЕСЬ ЕСЛИ я установил флаг на ноль, я вижу текст
Если флаг установлен на SDL_OPENGL или SDL_OPENGLBLIT, я вижу квадраты

flas передается в функцию SDL_SetVideoMode Но я хочу увидеть и то, и другое. Я пробовал его поменять, но ..

  flags= 0;
 //   SDL_ANYFORMAT | SDL_OPENGLBLIT  | SDL_ASYNCBLIT

Этот момент здесь:

     screen = SDL_SetVideoMode(mwidth,mheight,bpp,flags);

    if ( screen == NULL )
     { fprintf(stderr, "Couldn't set video mode: %s\n", SDL_GetError());
      exit(-2); //return -2;
      }
     SDL_WM_SetCaption ("MBR informant",NULL);
     setup_opengl();

     glMatrixMode(GL_MODELVIEW);

    char *path_to_font="freefont-ttf/sfd/FreeMono.ttf";
   load_font(path_to_font, font_size);

   SDL_FillRect(screen,0,~0);

   while (1)
     {  draw_screen();
        char *msg="we typed it";
        draw_text_at(screen,msg,50,50);
        SDL_Flip(screen);

       SDL_Delay(1000);
       process_events ();
      }

     SDL_Quit();
     }

Это выглядит как:

при переменной flag = 0 при переменной flag = 0

когда переменная flag = SDL_OPENGL введите описание изображения здесь

Из-за большого размера кода я оставил только функции, имеющие отношение к рисованию. Полный файл: http://rghost.net/37518422

РЕШЕНИЕ

Благодаря jrok я решил эту проблему так: я определил прямоугольник. SDL_Rect rect; rect.x = 0; rect.y = 0; rect.w = 150; rect.h = 140;

и я изменил одну часть:

     while (1)
       {  draw_screen();
          char *msg="we typed it";
          draw_text_at(screen,msg,50,50);
          **SDL_FillRect (screen,&rect,100);**
          SDL_Flip(screen);
         SDL_Delay(1000);
        process_events ();
      }

и я получил то, что хотел: введите описание изображения здесь


person Tebe    schedule 10.04.2012    source источник


Ответы (1)


Вы дублируете текст с помощью SDL_BlitSurface(). Я не знаю, почему именно это пошло не так, но в вики-клиринге SDL говорится (SDL_BlitSurface ):

Like most surface manipulation functions in SDL, it should not be used together with OpenGL.

Если вы хотите придерживаться OpenGL, этот вопрос охватывает некоторые возможности для рендеринга текста:

Как выполнить рендеринг текста OpenGL в реальном времени для графического интерфейса пользователя?

person jrok    schedule 10.04.2012
comment
Нет ли возможности нарисовать фигуру с помощью функций SDL без Opengl? Рисовать текст мне было непросто, поэтому я был бы рад сделать все на SDL. Я действительно заблудился. Мне это показалось таким простым: квадрат и текст, но ... - person Tebe; 11.04.2012
comment
@shbk Вы можете сохранять свои рисунки в файлах изображений, загружать их и копировать с помощью SDL. Просмотрите это немного: wiki.libsdl.org/moin.cgi/CategorySurface Simple прямоугольники также можно рисовать с помощью SDL_FillRect(). - person jrok; 11.04.2012
comment
Да! SDL_FillRect () - мой выбор. Потому что, насколько я понимаю, библиотека SDL была написана не для развлечения, а для того, чтобы упростить программирование и сделать его более кроссплатформенным. разве это не наше дело? Спасибо! Думаю, без вас я бы нашел это решение еще через несколько дней, и я не уверен, что вообще смогу его получить - person Tebe; 11.04.2012