C++ SDL2.0菜单功能

C++ SDL2.0菜单功能,c++,menu,sdl-2,C++,Menu,Sdl 2,我目前正试图为我的一个项目编写一个菜单函数。我正在重新制作《吃豆人》,我希望能够模块化主菜单,在需要时调用它。我认为SDL_曲面和TTF字体是这个特定函数所需的全部参数 当我使用SDL函数时遇到了麻烦,SDL函数只在SDL1.2中可用,而不是在2.0中。我希望这段代码尽可能可重用。你们怎么解决这个问题?下面我有一些示例代码,虽然不是全部都是我自己的。我想让这样的东西发挥作用: int showmenu(SDL_Surface* screen, TTF_Font* font) { Uint32

我目前正试图为我的一个项目编写一个菜单函数。我正在重新制作《吃豆人》,我希望能够模块化主菜单,在需要时调用它。我认为SDL_曲面和TTF字体是这个特定函数所需的全部参数

当我使用SDL函数时遇到了麻烦,SDL函数只在SDL1.2中可用,而不是在2.0中。我希望这段代码尽可能可重用。你们怎么解决这个问题?下面我有一些示例代码,虽然不是全部都是我自己的。我想让这样的东西发挥作用:

int showmenu(SDL_Surface* screen, TTF_Font* font)
{
  Uint32 time;
  int x, y;
  const int NUMMENU = 2;
  const char* labels[NUMMENU] = {"Continue","Exit"};
  SDL_Surface* menus[NUMMENU];
  bool selected[NUMMENU] = {0,0};
  SDL_Color color[2] = {{255,255,255},{255,0,0}};

  menus[0] = TTF_RenderText_Solid(font,labels[0],color[0]);
  menus[1] = TTF_RenderText_Solid(font,labels[1],color[0]);
  SDL_Rect pos[NUMMENU];
  pos[0].x = screen->clip_rect.w/2 - menus[0]->clip_rect.w/2;
  pos[0].y = screen->clip_rect.h/2 - menus[0]->clip_rect.h;
  pos[1].x = screen->clip_rect.w/2 - menus[0]->clip_rect.w/2;
  pos[1].y = screen->clip_rect.h/2 + menus[0]->clip_rect.h;

SDL_FillRect(screen,&screen>clip_rect,SDL_MapRGB(screen>format,0x00,0x00,0x00));

  SDL_Event event;
  while(1)
  {
    time = SDL_GetTicks();
    while(SDL_PollEvent(&event))
    {
      switch(event.type)
      {
        case SDL_QUIT:
        SDL_FreeSurface(menus[0]);
        SDL_FreeSurface(menus[1]);
        return 1;

    case SDL_MOUSEMOTION:
    x = event.motion.x;
    y = event.motion.y;
    for(int i = 0; i < NUMMENU; i += 1)
    {

      if(x >= pos[i].x && x <= pos[i].x + pos[i].w &&
         y >= pos[i].y && y <= pos[i].y + pos[i].h)
      {
        if(!selected[i])
        {
          selected[i] = 1;
          SDL_FreeSurface(menus[i]);
          menus[i] = TTF_RenderText_Solid(font,labels[i],color[1]);
        }
      }

      else
      {
        if(selected[i])
        {
          selected[i] = 0;
          SDL_FreeSurface(menus[i]);
          menus[i] = TTF_RenderText_Solid(font,labels[i],color[0]);
        }
      }
    }
      break;

      case SDL_MOUSEBUTTONDOWN:
      x = event.button.x;
      y = event.button.y;
      for(int i = 0; i < NUMMENU; i += 1)
      {
        if(x >= pos[i].x && x <= pos[i].x + pos[i].w &&
           y >= pos[i].y && y <= pos[i].y + pos[i].h)
        {
          SDL_FreeSurface(menus[0]);
          SDL_FreeSurface(menus[1]);
          return i;
        }
      }
      break;

      case SDL_KEYDOWN:
      if(event.key.keysym.sym == SDLK_ESCAPE)
      {
        SDL_FreeSurface(menus[0]);
        SDL_FreeSurface(menus[1]);
        return 0;
      }
    }
  }

   for(int i = 0; i < NUMMENU; i += 1)
   {
     SDL_BlitSurface(menus[i],NULL,screen,&pos[i]);
   }

  }
}
int showmenu(SDL_表面*屏幕,TTF_字体*字体)
{
Uint32次;
int x,y;
常数int NUMMENU=2;
常量字符*标签[NUMMENU]={“继续”,“退出”};
SDL_曲面*菜单[NUMMENU];
bool selected[NUMMENU]={0,0};
SDL_颜色[2]={255255},{255,0,0};
菜单[0]=TTF_RenderText_Solid(字体、标签[0],颜色[0]);
菜单[1]=TTF_RenderText_Solid(字体、标签[1],颜色[0]);
SDL_Rect pos[NUMMENU];
位置[0].x=屏幕->clip_rect.w/2-菜单[0]->clip_rect.w/2;
位置[0].y=screen->clip_-rect.h/2-菜单[0]->clip_-rect.h;
位置[1].x=屏幕->clip_rect.w/2-菜单[0]->clip_rect.w/2;
位置[1].y=screen->clip_-rect.h/2+菜单[0]->clip_-rect.h;
SDL_FillRect(屏幕,&屏幕>剪辑,SDL_MapRGB(屏幕>格式,0x00,0x00,0x00));
SDL_事件;
而(1)
{
时间=SDL_GetTicks();
while(SDL_事件和事件))
{
开关(事件类型)
{
案例SDL_退出:
SDL_自由曲面(菜单[0]);
SDL_自由曲面(菜单[1]);
返回1;
案例SDL_:
x=event.motion.x;
y=event.motion.y;
对于(int i=0;i如果(x>=pos[i].x&&x=pos[i].y&&y=pos[i].x&&x=pos[i].y&&y那么这段代码到底有什么问题呢?这段代码使用SDL 1.2函数,它不使用SDL 2.0编译,除了像
&screen>clip\u rect
这样的明显错误之外,这里没有从SDL2中删除任何内容。那么这段代码到底有什么问题呢?这段代码使用SDL 1.2函数,它不使用SDL 2.0编译明显的错误,如
&screen>clip\u rect
这里没有从SDL2中删除的内容。