我在SFML制作游戏,我一直在家制作个人电脑。最近,我不得不把我的项目与我一起,并继续在另一台PC上编码。我在新PC上为SFML配置了Code :: Blocks,并且我打开了该项目,并且想编译它以查看它是否正常工作。一旦程序窗口打开并且所有的纹理都被绘制出来,程序就会崩溃。我经历了代码,我发现程序的主循环(即:while(win.isOpen()))只发生过一次。我试图通过重写部分代码来修复它,但没有任何工作。由于我是一个非常新手的程序员,我不知道如何解决这个问题。此外,如果您看到某些方法可以改进我的代码,那么如果您可以指出这些方式,我会很有帮助:D谢谢。我的SFML项目的主循环只发生一次。任何人都知道为什么?
所以这里是游戏的主循环。有几个其他文件包含到项目中,所以我想不要发布所有的文件。
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();
}
}
你为什么用'rom [i]〜Sprint()'手动调用析构函数?这是在变量超出范围时自动完成的。 – 1201ProgramAlarm
因为我的游戏中的纹理在ROM [] Sprites中必须是versitile。在某一点上,精灵必须包含一定的纹理,然后它必须具有不同的纹理,并且有时它不必绘制任何纹理。由于最后一部分,我找不到任何其他方式来删除精灵内的纹理,所以在主循环的每次迭代结束时,我使用析构函数,并在主循环的开始处设置刷新纹理回到精灵。 –