2011-04-30 31 views
0

我一直有這個問題一段時間。當我編譯我的代碼的這部分時,它顯示位圖上方的黑線。什麼可能是問題,有沒有解決辦法?Allegro C++庫

void start() 
{ 
    FONT *verdana; 
    PALETTE palette; 
    verdana = load_font("verdana.pcx", palette, NULL); 
    clear_to_color(screen,makecol(0,0,0)); 
    SAMPLE *tac = load_sample("clunk.wav"); 

    topce_bmp=load_bitmap("topce.bmp",NULL); 
    palki_bmp=load_bitmap("palka.bmp",NULL); 

    int cred_anim=255; 
    int cred_anim_fade=0; 
    SPEED=4; 
    int timer=0;  
    while(cred_anim_fade!=255) 
    { 
     line(screen, 3, 0, 3, 600, makecol(cred_anim_fade, cred_anim_fade, cred_anim_fade)); 
     line(screen, 797, 0, 797, 600, makecol(cred_anim_fade, cred_anim_fade, cred_anim_fade)); 
     if(key[KEY_ENTER]) 
     { 
       menu(0,NULL); 
     } 

//  BATS 


     if(y>0&&y<400) 
     { 
      y=posy-100; 
     } 
     else if(y<=0) y=1; 
     else if(y>=400) y=399; 

     draw_sprite(screen,palki_bmp, 20, y); 

     if(y1>0&&y1<400) 
     { 
      y1=posy-100; 
     } 
     else if(y1<=0) y1=1; 
     else if(y1>=400) y1=399; 

     draw_sprite(screen,palki_bmp, 765, y1); 
     rest(10); 
     cred_anim_fade++; 
    } 

    while (timer!=1000) 
    { 

     if(key[KEY_ENTER]) 
     { 
       menu(0,NULL); 
     } 

     timer++; 
     acquire_screen(); 

     clear_to_color(screen,makecol(0,0,0)); 


//  BORDERS 

     line(screen, 3, 0, 3, 600, makecol(255, 255, 255)); 
     line(screen, 797, 0, 797, 600, makecol(255, 255, 255)); 

//  BATS 


     if(y>0&&y<400) 
     { 
      y=posy-100; 
     } 
     else if(y<=0) y=1; 
     else if(y>=400) y=399; 

     draw_sprite(screen,palki_bmp, 20, y); 

     if(y1>0&&y1<400) 
     { 
      y1=posy-100; 
     } 
     else if(y1<=0) y1=1; 
     else if(y1>=400) y1=399; 

     draw_sprite(screen,palki_bmp, 765, y1); 



//  COLLISION X-AXIS 

     if(check_posy==1) 
     { 
      if(posy<15) 
      { 
       posy=posy+SPEED; 
       check_posy=1; 
      } 
      else if(posy>585) 
      { 
       posy=posy-SPEED; 
       check_posy=2; 
      } 
      else posy=posy+SPEED; 
     } 
     else if(check_posy==2) 
     { 
      if(posy<15) 
      { 
       posy=posy+SPEED; 
       check_posy=1; 
      } 
      else if(posx>585) 
      { 
       posy=posy-SPEED; 
       check_posy=2; 
      } 
      else posy=posy-SPEED; 
     } 


//  COLLISION WITH BATS 

     if(check_posx==1) 
     { 
      if(posx<50&&posy>y&&posy<y+200) 
      { 
       SPEED=SPEED+3; 
       posx=posx+SPEED; 
       check_posx=1; 
       play_sample(tac,500, 100, 1000, 0); 
      } 
      else if(posx>750&&posy>y1&&posy<y1+200) 
      { 
       SPEED=SPEED+3; 
       posx=posx-SPEED; 
       check_posx=2; 
       play_sample(tac,500, 0, 1000, 0); 
      } 
      else posx=posx+SPEED; 
     } 
     else if(check_posx==2) 
     { 
      if(posx<50&&posy>y&&posy<y+200) 
      { 
       SPEED=SPEED+3; 
       posx=posx+SPEED; 
       check_posx=1; 
       play_sample(tac,500, 100, 1000, 0); 
      } 
      else if(posx>750&&posy>y1&&posy<y1+200) 
      { 
       SPEED=SPEED+3; 
       posx=posx-SPEED; 
       check_posx=2; 
       play_sample(tac,500, 0, 1000, 0); 
      } 
      else posx=posx-SPEED; 
     } 

     draw_sprite(screen,topce_bmp, posx-13, posy-10); 

     rest(10); 
    } 
    clear_to_color(screen,makecol(0,0,0)); 
    textout_centre_ex(screen, verdana, "PONG!",400,320, makecol(cred_anim,0,0),makecol(0,0,0)); 
    textout_centre_ex(screen, verdana, "Vistinska igra.",400, 420, makecol(cred_anim,cred_anim,cred_anim),makecol(0,0,0)); 
    rest(3000); 
    while(cred_anim!=0) 
    { 
     clear_to_color(screen,makecol(0,0,0)); 
     textout_centre_ex(screen, verdana, "PONG!",400,320, makecol(cred_anim,0,0),makecol(0,0,0)); 
     textout_centre_ex(screen, verdana, "Vistinska igra.",400, 420, makecol(cred_anim,cred_anim,cred_anim),makecol(0,0,0)); 
     cred_anim--; 
     rest(1); 
    } 
} 
+0

你能找出產生錯誤的代碼的最小子集嗎?例如,如果你註釋掉所有的東西,但是在一個固定的位置渲染一個精靈,你還有問題嗎? – user168715 2011-04-30 16:32:13

+0

我認爲它與while循環中的clear_to_color()函數有關。如果我在while循環中註釋掉clear_to_color(),我不會顯示線條,但所有位圖都會在移動時留下痕跡,因此這不是一種解決方案。 – Martin 2011-04-30 17:25:36

回答

1

只是關於代碼的一些想法:

- 您調用acquire_screen(),但永遠不會調用release_screen()。這是壞的,not to mention all the warnings allegro gives you in the documentation for acquire_screen()。 「黑線」有點含糊不清(在何時,何地,何種程度上出現?),但根據您對clear_to_color()的評論,直接繪製到屏幕上也可能是一個問題。似乎會導致問題。試試double buffering,即可以解決幾個問題。

希望這會有所幫助。即使這些不能解決你的問題,他們仍然值得記住。

+0

是的,我嘗試了雙緩衝,它的工作!此外,我沒有複製整個代碼,所以這就是爲什麼release_screen()丟失,但實際上它在那裏。謝謝回覆! – Martin 2011-04-30 22:14:24