2011-04-30 88 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