2017-07-19 41 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精灵的析构函数的循环,现在它工作正常。谢谢您的帮助 :) –

相关问题