2017-07-19 6 views
2

私は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(); 
} 
} 
+1

なぜあなたは手動で 'rom [i]。〜Sprint()'でデストラクタを呼び出していますか?これは、変数が有効範​​囲外になると自動的に行われます。 – 1201ProgramAlarm

+0

私のゲームのテクスチャはrom [] Spritesの中にあるので、仮想的でなければなりません。ある時点では、スプライトは特定のテクスチャを含んでいなければならず、別のテクスチャを持たなければならず、何度も何も描画しないためには何もテクスチャを持たなくてはなりません。その最後の部分のために、私はスプライト内のテクスチャを削除する他の方法を見つけることができませんでしたので、メインループのすべての反復の最後に私はデストラクタを使用し、私はリフレッシュテクスチャを設定するメインループの開始スプライトに戻ります。 –

答えて

1

は手動であなたのSprite配列(rom[i].~Sprite)のデストラクタを呼び出しています。この結果、ループの反復処理が終了し、ループの終了時にromの有効期間が終了するとコンパイラがデストラクタを呼び出すと、Undefined Behaviorが発生します。定義されていない動作とは、1つのシステムで作業し、別のシステムでクラッシュするなど、何でもできることを意味します。

デバッガでコードを実行してクラッシュした場所を確認すると、~Spriteというループを取り除きたいことがあります。

+0

私は、ROMスプライトのデストラクタを呼び出すループを削除し、今は正常に動作します。助けてくれてありがとう :) –

関連する問題