我正在使用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();
}
}
答案 0 :(得分:1)
您手动调用Sprite
数组(rom[i].~Sprite
)的析构函数。当循环迭代结束时,这将导致未定义的行为,并且当rom
的生存期在循环结束时结束时编译器调用析构函数。未定义的行为意味着它可以执行任何操作,包括在一个系统上工作并在另一个系统上崩溃。
在调试器中运行代码,并查看它崩溃的位置,可以提醒您:您想要摆脱调用~Sprite
的循环。