0

嗨,我已经在 sdl 上编码了几个月,我正在尝试一个小游戏,我可以管理状态,我有一个介绍屏幕,一个带有播放按钮和游戏状态的主屏幕,我加载了一张地图并专注于我控制的角色(实体)和另一个进行碰撞测试,我可以让相机专注于我的角色并跟随他在地图上,问题是我想在游戏菜单中尝试(提供更多速度,健康,对角色的力量和类似的东西)所以我创建了一个新类,它在屏幕上呈现一个菜单,其中包含一个覆盖整个屏幕的图像和一个关闭菜单的按钮,但是当我激活菜单时(whit一个按键事件)菜单显示,但按钮不做任何事情,过了一会儿菜单不再显示,“创建菜单”的事件不起作用。

我在屏幕上绘图的代码是这样的:

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;
       }

在我的渲染功能上,我这样做:

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);

编辑:11/7/03 我终于找到了我的错误,并且能够解决它,但是我现在有一个新问题,我这样调用我的菜单:

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* 屏幕。我不是指着屏幕吗?或此范围内的屏幕为空?我该如何解决这个问题?

4

2 回答 2

2

“慢”有多慢?你没有指定数字,所以如果它只是你的 FPS 下降,它可能会被忽略。当他们的速度下降几百(!)FPS时,许多人都吓坏了,没有意识到这个测量值实际上是很小的。

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

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

编辑:

啊,你的速度真的很慢(现在你的原始问题已被编辑)。每次要绘制菜单时,您都会不小心(?)从硬盘驱动器重新加载菜单图像。这是一个非常大的减速,因为访问硬盘是计算机做的最慢的事情之一!

或者,至少这就是正在做的事情。但是你只是发布了一个项目中的一小段代码,仅仅知道是不够的。程序是复杂的东西,代码的不同部分以错综复杂的方式交互,所以你要求我们猜测你拼写的单词,但隐藏了其中 90% 的字母。很难同时调试和玩刽子手!=)

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

编辑 2: 您的新问题是,如果您在函数本地声明一个的“SDL_Surface *screen”,那么与代码中其他地方碰巧命名为“screen”的任何其他变量完全不同的指针。

于 2013-07-11T00:55:02.863 回答
1

一个问题是您错误地初始化了SDL_Rect传递给SDL_BlitSurface. 首先,您分配xdrawing.y,您可能打算分配y给它。

SDL_Rect drawing;

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

可能还有其他问题,但如果没有看到更多代码,很难说。

于 2013-07-11T00:31:38.420 回答