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