C++ 在SDL中,当我在屏幕上绘制菜单时,它会使游戏速度变慢,并且不会';不行,我怎样才能解决这个问题?

C++ 在SDL中,当我在屏幕上绘制菜单时,它会使游戏速度变慢,并且不会';不行,我怎样才能解决这个问题?,c++,sdl,C++,Sdl,大家好,我已经在sdl上编写了几个月的代码,我正在制作一个小游戏来尝试,我可以管理状态,我有一个介绍屏幕一个带有播放按钮和游戏状态的主屏幕,我加载一个地图和机器人到角色(实体),一个是我控制的,另一个是进行碰撞测试,我可以让相机聚焦在我的角色上,然后跟着他在地图上转,问题是我想尝试游戏菜单(给角色更多的速度、健康、力量等等),所以我制作了一个新类,在屏幕上呈现一个菜单,画面覆盖整个屏幕,还有一个按钮关闭菜单,但是当我激活菜单时(按键按下事件),菜单显示,但按钮不起任何作用,过了一段时间菜单不再显

大家好,我已经在sdl上编写了几个月的代码,我正在制作一个小游戏来尝试,我可以管理状态,我有一个介绍屏幕一个带有播放按钮和游戏状态的主屏幕,我加载一个地图和机器人到角色(实体),一个是我控制的,另一个是进行碰撞测试,我可以让相机聚焦在我的角色上,然后跟着他在地图上转,问题是我想尝试游戏菜单(给角色更多的速度、健康、力量等等),所以我制作了一个新类,在屏幕上呈现一个菜单,画面覆盖整个屏幕,还有一个按钮关闭菜单,但是当我激活菜单时(按键按下事件),菜单显示,但按钮不起任何作用,过了一段时间菜单不再显示,“创建菜单”的事件不起作用

我在屏幕上绘制的代码如下:

bool Draw::OnDraw(SDL_Surface* screen, SDL_Surface* image_draw, int x, int y)
{
    if(screen == NULL || image_draw == NULL)
    {
        return false;
    }

    SDL_Rect drawing;

    drawing.x = x;
    drawing.y = y;

    SDL_BlitSurface(screen, NULL, image_draw, &drawing);

    return true;

}
此外,我还使用以下内容创建屏幕:

if((screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF)) == NULL)
{
    return false;
}
我试过SDL_Flip(screen)但是没有,我想问题是在屏幕上画画,但是我可以用什么其他方法来制作菜单呢。 更多代码:

我按如下方式激活菜单:

case SDLK_h: {
            hero_menu = true;
            break;
       }
case SDLK_h: {
            MenuHero activate;
            activate.Activate_Menu();
            break;
        }
在渲染函数中,我执行以下操作:

if(hero_menu)
    {
        MenuHero call_menu;
        call_menu.Activate_Menu(screen);
    }

void MenuHero::Activate_Menu(SDL_Surface* screen)
{
    menu_back = Draw::OnLoad("./image/hero_screen.png");
    close_button = Draw::OnLoad("./image/close.png");
    Draw::OnDraw(screen, menu_back, 0, 0);
编辑:2003年11月7日 我终于发现了我的错误,并且能够解决它,但是我现在有一个新问题,我这样调用我的菜单:

case SDLK_h: {
            hero_menu = true;
            break;
       }
case SDLK_h: {
            MenuHero activate;
            activate.Activate_Menu();
            break;
        }
在MenuHero类的Activate_Menu()函数中,我有:

void MenuHero::Activate_Menu()
{
    SDL_Surface* screen;
    menu_back = Draw::OnLoad("./image/hero_screen.png");
    Draw::OnDraw(screen, menu_back, 0, 0);

现在它没有在屏幕上画任何东西,我在整个代码中都使用了SDL_Surface*屏幕。我不是指着屏幕吗?或此范围中的屏幕为空?如何解决此问题?

一个问题是,您未正确初始化传递给
SDL\u BlitSurface
SDL\u Rect
。首先,您将
x
分配给
drawing.y
,您可能打算将
y
分配给它

SDL_Rect drawing;

drawing.x = x;
drawing.y = y;

可能还有其他问题,但如果看不到更多的代码,就很难判断。

一个问题是,您错误地初始化了传递给
SDL\u BlitSurface
SDL\u Rect
。首先,您将
x
分配给
drawing.y
,您可能打算将
y
分配给它

SDL_Rect drawing;

drawing.x = x;
drawing.y = y;
可能还有其他问题,但如果看不到更多的代码,就很难判断“慢”有多慢?您没有指定数字,因此如果是,则可能会忽略它。当他们的速度下降几百(!)FPS时,许多人都会发疯,他们没有意识到测量值实际上是一个很小的量

你是如何加载图像的?请确保您可以显示。如果在加载它们时不进行转换,那么每一个blit SDL都必须手动转换每一个像素,这可能会导致一些真正的减速

(注意:我链接到的第一篇文章是我在GameDev.net上撰写和发布的。我不知道有任何类似的资源可以将人们链接到这个主题上,我也没有从链接中获得任何好处(财务或其他方面)。我链接到的第二篇文章不是我自己写的,但在过去我发现它很有用)

编辑:

啊,这是你真正的减速(既然你原来的问题被编辑了)。每次要绘制菜单时,都会意外地从硬盘重新加载菜单图像。这是一个非常大的减速,因为访问硬盘驱动器是计算机做的最慢的事情之一

或者,至少你看起来是这么做的。但你只是发布了一个项目中的一小部分代码,这还不足以确定。程序是复杂的东西,代码的不同部分以复杂的方式相互作用,所以你让我们猜你在拼写什么单词,但在其中隐藏了90%的字母。很难同时调试和扮演刽子手!=)

我们需要看到所有相关部分的复杂整体来解决您的问题。IMO称,这些问题比问答网站更适合社区论坛

编辑2: 你的新问题是,如果你声明了一个新的函数本地的“SDL_Surface*screen”,这是一个完全不同于其他变量的指针,而这些变量在代码中的其他地方恰好被命名为“screen”。

那么“slow”有多慢?您没有指定数字,因此如果是,则可能会忽略它。当他们的速度下降几百(!)FPS时,许多人都会发疯,他们没有意识到测量值实际上是一个很小的量

你是如何加载图像的?请确保您可以显示。如果在加载它们时不进行转换,那么每一个blit SDL都必须手动转换每一个像素,这可能会导致一些真正的减速

(注意:我链接到的第一篇文章是我在GameDev.net上撰写和发布的。我不知道有任何类似的资源可以将人们链接到这个主题上,我也没有从链接中获得任何好处(财务或其他方面)。我链接到的第二篇文章不是我自己写的,但在过去我发现它很有用)

编辑:

啊,这是你真正的减速(既然你原来的问题被编辑了)。每次要绘制菜单时,都会意外地从硬盘重新加载菜单图像。这是一个非常大的减速,因为访问硬盘驱动器是计算机做的最慢的事情之一

或者,至少你看起来是这么做的。但你只是发布了一个项目中的一小部分代码,这还不足以确定。程序是复杂的东西,代码的不同部分以复杂的方式相互作用,所以你让我们猜你在拼写什么单词,但在其中隐藏了90%的字母。很难同时调试和扮演刽子手!=)

我们需要看到所有相关部分的复杂整体来解决您的问题。IMO称,这些问题比问答网站更适合社区论坛