私はSFMLでゲームを作っています。自宅で自分のPCを作っています。最近私のプロジェクトを私と一緒に受けて、別のPCでコーディングを続けなければなりませんでした。私は新しいPCでSFMLのCode :: Blocksを設定しました。プロジェクトを開いたので、コンパイルしてうまく機能しているかどうか確認したいと思っていました。プログラムウィンドウが開き、すべてのテクスチャが描画されるとすぐに、プログラムがクラッシュしました。私はコードを見て、私はプログラムのメインループ(:while(win.isOpen())が一度だけ起こったことに気づいた。私はコードの一部を書き直して修正しようとしましたが、何も機能しませんでした。私は非常に初心者のプログラマーなので、このエラーの原因を修正する方法はわかりません。また、あなたが私のコードを改善できるいくつかの方法を見た場合、あなたがそれらの方法を指すことができればgreatfullでしょう: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の中にあるので、仮想的でなければなりません。ある時点では、スプライトは特定のテクスチャを含んでいなければならず、別のテクスチャを持たなければならず、何度も何も描画しないためには何もテクスチャを持たなくてはなりません。その最後の部分のために、私はスプライト内のテクスチャを削除する他の方法を見つけることができませんでしたので、メインループのすべての反復の最後に私はデストラクタを使用し、私はリフレッシュテクスチャを設定するメインループの開始スプライトに戻ります。 –