2017-07-19 34 views
2

我在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(); 
} 
} 
+1

你爲什麼用'rom [i]〜Sprint()'手動調用析構函數?這是在變量超出範圍時自動完成的。 – 1201ProgramAlarm

+0

因爲我的遊戲中的紋理在ROM [] Sprites中必須是versitile。在某一點上,精靈必須包含一定的紋理,然後它必須具有不同的紋理,並且有時它不必繪製任何紋理。由於最後一部分,我找不到任何其他方式來刪除精靈內的紋理,所以在主循環的每次迭代結束時,我使用析構函數,並在主循環的開始處設置刷新紋理回到精靈。 –

回答

1

你手動調用您的Sprite陣列(rom[i].~Sprite)的析構函數。當循環迭代結束且編譯器在循環結束時終止rom的生命週期時調用析構函數時,會導致未定義行爲。未定義的行爲意味着它可以做任何事情,包括在一個系統上工作並在另一個系統上崩潰。

在調試器中運行代碼並查看它崩潰的位置可以幫助您:您想擺脫調用~Sprite的循環。

+0

我刪除了那個調用rom精靈的析構函數的循環,現在它工作正常。謝謝您的幫助 :) –

相關問題