SDL按钮/事件停止工作

时间:2014-01-17 03:40:42

标签: c++ sdl

当我创建一个简单的游戏时,我一直在一步一步地关注lazyfoo'Productions'教程。我目前的任务是制作主菜单,这就是我的问题所在。

我对全球变量充满激情,我不使用它们;我认为他们太难以准确地跟踪和维护,但这是重点。本教程使用屏幕的全局变量以及其他一些内容。我已经设法制定了一个按钮类,但它只能在一定时间内(大约7秒)起作用,然后拒绝改变精灵。

我仍然可以正常退出,但按钮的纹理将保持与停止时的纹理相同(如果鼠标在它上面,它将保持发光,反之亦然)。

这是我的主线程,我调用按钮的类函数:

//...

while(quit == false)
{
    if(SDL_PollEvent(&event))
    {
        if(event.type == SDL_QUIT)
        {
            quit = true;
        }
        else if(event.type == SDL_MOUSEMOTION)
        {
            button_newgame.handle_events(event);
        }
    }

    button_newgame.show();

    if(SDL_Flip(screen) == -1)
    {
        return 0;
    }
}

这是按钮功能

Button::Button(int x, int y, int w, int h, int buttonnum, SDL_Surface *screen)
{
box.x = x;
box.y = y;
box.w = w;
box.h = h;

m_screen = screen;

switch(buttonnum)
{
case 0:
    buttonclipinactive.x = 0;
    buttonclipinactive.y = 0;
    buttonclipinactive.w = 240;
    buttonclipinactive.h = 60;

    buttonclipactive.x = 0;
    //setting clips according to the button's identiffying number to find the correct sprite
}

void Button::handle_events(SDL_Event event)
{
//The mouse offsets
int mx = 0, my = 0;

SDL_Delay(5);

//Get the mouse offsets
mx = event.motion.x;
my = event.motion.y;

//If the mouse is over the button
if( ( mx > box.x ) && ( mx < box.x + box.w ) && ( my > box.y ) && ( my < box.y + box.h ) )
{
    //Set the button sprite
    clip = &buttonclipactive;
}
//If not
else
{
    //Set the button sprite
    clip = &buttonclipinactive;
}

SDL_Rect* Button::show()
{
    SDL_Surface *mainmenuoptionsheet = load_image("images/mainmenuoptionsheet.bmp");

    apply_surface(box.x, box.y, mainmenuoptionsheet, m_screen, clip);
}

1 个答案:

答案 0 :(得分:3)

你在循环中打电话给Button::show()。但是这个功能究竟做了什么?

SDL_Surface *mainmenuoptionsheet = load_image("images/mainmenuoptionsheet.bmp");

所以你每个刻度都加载bmp。你的程序停止显示可能是因为它(可预见地)内存不足以使用,并且卡在显示的最后一个sprite上。因此,在应用程序的开头加载一个SDL_Surface指针 ONCE ,然后渲染每一帧。

作为补充说明,请确保您使用的是最新的lazyfoo教程。他的旧约会过时了。