我的SFML项目的主循环只发生一次。谁知道为什么?

时间:2017-07-19 00:03:46

标签: c++ sfml

我正在使用SFML制作游戏,而且我一直在家里制作它的PC。最近我不得不带着我的项目并继续在不同的PC上编码。我在新PC上为SFML配置了Code :: Blocks,我打开了项目,我想编译它以查看它是否正常工作。程序窗口打开并绘制完所有纹理后,程序崩溃了。我仔细检查了代码,发现程序的主循环(while(win.isOpen()))只发生过一次。我尝试通过重写部分代码来修复它,但没有任何效果。由于我是一个非常新手的程序员,我不知道如何解决导致此错误的原因。此外,如果你看到一些方法我可以改进我的代码,如果你能指出那些方式我会很高兴:D谢谢。

所以这是游戏的主循环。项目中包含了几个其他文件,所以我想不发布所有文件。

while(win.isOpen())
{
    win.clear();
    win.draw(bg);
    Sprite rom[24];
    rom[0].setTexture(ro[12]);
    r[0].id=1;
    if(Keyboard::isKeyPressed(Keyboard::D))
    {
        if(x<1200)
            x=x+10;
    }
    if(Keyboard::isKeyPressed(Keyboard::A))
    {
        if(x>1)
            x=x-10;
    }
    if(Keyboard::isKeyPressed(Keyboard::S))
    {
        if(y<900)
            y=y+10;
    }
    if(Keyboard::isKeyPressed(Keyboard::W))
    {
        if(y>1)
            y=y-10;
    }
    for(int i=0; i<=23; i++)
    {
        if(r[i].if_draw==true)
        {
            if(r[i].type==1 && r[i].siz==1)
            {
                rom[i].setTexture(ro[0]);
            }
            if(r[i].type==1 && r[i].siz==2)
            {
                rom[i].setTexture(ro[1]);
            }
            if(r[i].type==1 && r[i].siz==3)
            {
                rom[i].setTexture(ro[2]);
            }
            if(r[i].type==2 && r[i].siz==1)
            {
                rom[i].setTexture(ro[3]);
            }
            if(r[i].type==2 && r[i].siz==2)
            {
                rom[i].setTexture(ro[4]);
            }
            if(r[i].type==2 && r[i].siz==3)
            {
                rom[i].setTexture(ro[5]);
            }
            if(r[i].type==3 && r[i].siz==1)
            {
                rom[i].setTexture(ro[6]);
            }
            if(r[i].type==3 && r[i].siz==2)
            {
                rom[i].setTexture(ro[7]);
            }
            if(r[i].type==3 && r[i].siz==3)
            {
                rom[i].setTexture(ro[8]);
            }
            if(r[i].type==4 && r[i].siz==1)
            {
                rom[i].setTexture(ro[9]);
            }
            if(r[i].type==4 && r[i].siz==2)
            {
                rom[i].setTexture(ro[10]);
            }
            if(r[i].type==4 && r[i].siz==3)
            {
                rom[i].setTexture(ro[11]);
            }
            get_cords(sx,sy,r[i].id);
            rom[i].setPosition(sx,sy);
            win.draw(rom[i]);
        }
    }
    while(win.pollEvent(e))
    {
        if(e.type==e.KeyPressed && e.key.code==Keyboard::Space)
        {
            if((y<=750 && y>=150) && (x>=150 && x<=1050))
            {
                sel_space=get_sel_space(x,y);
                sel_row=get_row(sel_space);
                win.draw(options_b_1);
                win.display();
                sel_type=get_sel_number(e,win);
                if(sel_type==7)
                {
                    sel_type=0;
                    sel_space=0;
                    sel_size=0;
                    sel_row=0;

                    break;
                }
                if(sel_type==6 && sel_space!=1)
                {
                    row_t[sel_row-1]=row_t[sel_row-1]-r[sel_space-1].siz;
                    r[sel_space-1].demolish();
                }
                else if(sel_type!=7 && sel_space!=1)
                {
                    win.draw(options_b_2);
                    win.display();
                    r[sel_space-1].if_draw=true;
                    for(;;)
                    {
                        sel_size=get_sel_number(e,win);
                        if((sel_size>=1 && sel_size<=3) || (sel_size==7))
                        {
                            break;
                        }
                    }
                    if(chk_id_size(sel_space,sel_size)==true)
                    {
                        if(sel_size>=1 && sel_size<=3)
                        {
                            if_b=chk_if_good_space(r,row_t[sel_row-1],sel_size,sel_space-1,sel_row);
                        }
                        else if(sel_size==7)
                        {
                            sel_type=0;
                            sel_space=0;
                            sel_size=0;
                            sel_row=0;
                            break;
                        }
                    }
                    else
                    {
                        if_b=false;
                    }
                    if(if_b==true)
                    {
                        chk_money_pay(money,sel_type,sel_size);
                        r[sel_space-1].id=sel_space;
                        r[sel_space-1].type=sel_type;
                        r[sel_space-1].siz=sel_size;
                        r[sel_space-1].occ=true;
                        if(sel_size==2)
                        {
                            r[sel_space].occ=true;
                        }
                        if(sel_size==3)
                        {
                            r[sel_space].occ=true;
                            r[sel_space+1].occ=true;
                        }
                    }
                }
            }
        }
    }
    for(int i=0; i<=23; i++)
    {
        rom[i].~Sprite();
    }
    pointer.setPosition(x,y);
    win.draw(pointer);
    win.display();
}
}

1 个答案:

答案 0 :(得分:1)

您手动调用Sprite数组(rom[i].~Sprite)的析构函数。当循环迭代结束时,这将导致未定义的行为,并且当rom的生存期在循环结束时结束时编译器调用析构函数。未定义的行为意味着它可以执行任何操作,包括在一个系统上工作并在另一个系统上崩溃。

在调试器中运行代码,并查看它崩溃的位置,可以提醒您:您想要摆脱调用~Sprite的循环。