gpt4 book ai didi

c++ - 我的 SFML 项目的主循环只发生一次。有人知道为什么吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:51 25 4
gpt4 key购买 nike

我正在用 SFML 制作游戏,并且我一直将其作为我在家中的 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();
}
}

最佳答案

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

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

关于c++ - 我的 SFML 项目的主循环只发生一次。有人知道为什么吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45178922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com