当我创建一个简单的游戏时,我一直在一步一步地关注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);
}
答案 0 :(得分:3)
你在循环中打电话给Button::show()
。但是这个功能究竟做了什么?
SDL_Surface *mainmenuoptionsheet = load_image("images/mainmenuoptionsheet.bmp");
所以你每个刻度都加载bmp。你的程序停止显示可能是因为它(可预见地)内存不足以使用,并且卡在显示的最后一个sprite上。因此,在应用程序的开头加载一个SDL_Surface
指针 ONCE ,然后渲染每一帧。
作为补充说明,请确保您使用的是最新的lazyfoo教程。他的旧约会过时了。