C++ SDL2.0菜单功能
我目前正试图为我的一个项目编写一个菜单函数。我正在重新制作《吃豆人》,我希望能够模块化主菜单,在需要时调用它。我认为SDL_曲面和TTF字体是这个特定函数所需的全部参数 当我使用SDL函数时遇到了麻烦,SDL函数只在SDL1.2中可用,而不是在2.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
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中删除的内容。