C++ SDL按钮/事件停止工作

C++ SDL按钮/事件停止工作,c++,sdl,C++,Sdl,在我创建一个简单的游戏时,我一直在一步一步地遵循lazyfoo“Productions”教程。我目前的任务是制作主菜单,这就是我的问题所在 我对全局变量有热情,因此我不使用它们;我相信它们很难准确地跟踪和维护,但这不是重点。本教程在屏幕上使用全局变量以及其他一些内容。我已经设计了一个button类,但是在它拒绝改变精灵之前,它只工作了一定的时间(大约7秒) 我仍然可以正常退出,但按钮的纹理将保持与停止时相同(如果鼠标在按钮上,它将保持发光,反之亦然) 这是我的主线程,在这里我调用按钮的类函数:

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

我对全局变量有热情,因此我不使用它们;我相信它们很难准确地跟踪和维护,但这不是重点。本教程在屏幕上使用全局变量以及其他一些内容。我已经设计了一个button类,但是在它拒绝改变精灵之前,它只工作了一定的时间(大约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);
}
Button::Button(int x,int y,int w,int h,int buttonnum,SDL_Surface*屏幕)
{
方框x=x;
方框y=y;
方框w=w;
方框h=h;
m_屏幕=屏幕;
开关(按钮)
{
案例0:
buttonclipinactive.x=0;
buttonclipinactive.y=0;
按钮分类。w=240;
按钮分类。h=60;
按钮激活。x=0;
//根据按钮的识别号设置剪辑以找到正确的精灵
}
void按钮::处理事件(SDL事件)
{
//鼠标偏移
int mx=0,my=0;
SDL_延迟(5);
//获取鼠标偏移量
mx=event.motion.x;
my=event.motion.y;
//如果鼠标在按钮上
如果((mx>box.x)和&(mxbox.y)和&(my
您调用的
按钮::show()
是否在循环中打勾。但该函数到底做了什么

SDL_Surface *mainmenuoptionsheet = load_image("images/mainmenuoptionsheet.bmp");
因此,您每一个刻度都在加载bmp。您的程序停止显示可能是因为(可以预见)内存不足,并且卡在显示的最后一个精灵上。因此,请在应用程序开始时将
SDL_曲面
指针加载一次,然后渲染每个帧


另外,请确保您使用的是最新的lazyfoo教程。他的旧教程已经过时了。

我想我应该已经看过了。谢谢您指出这一点!