#c #allegro
#c #allegro
Вопрос:
У меня уже некоторое время возникает эта проблема. Когда я компилирую эту часть своего кода, над растровыми изображениями отображаются черные линии. В чем может быть проблема и есть ли какие-либо решения?
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>0amp;amp;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>0amp;amp;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>0amp;amp;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>0amp;amp;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<50amp;amp;posy>yamp;amp;posy<y 200)
{
SPEED=SPEED 3;
posx=posx SPEED;
check_posx=1;
play_sample(tac,500, 100, 1000, 0);
}
else if(posx>750amp;amp;posy>y1amp;amp;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<50amp;amp;posy>yamp;amp;posy<y 200)
{
SPEED=SPEED 3;
posx=posx SPEED;
check_posx=1;
play_sample(tac,500, 100, 1000, 0);
}
else if(posx>750amp;amp;posy>y1amp;amp;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);
}
}
Комментарии:
1. Можете ли вы определить минимальное подмножество этого кода, которое вызывает ошибку? Например, если вы закомментируете все, кроме рендеринга одного спрайта в фиксированной позиции, у вас все еще есть проблема?
2. Я думаю, что это как-то связано с функцией clear_to_color() в цикле while. Если я закомментирую clear_to_color() из цикла while, я не показываю строки, но все растровые изображения оставляют трассировку при перемещении, так что это не решение.
Ответ №1:
Всего несколько идей, касающихся кода:
-Вы вызываете acquire_screen(), но никогда не вызываете release_screen(). ЭТО ПЛОХО, не говоря уже обо всех предупреждениях, которые allegro выдает вам в документации для acquire_screen().
— «Черные линии» немного расплывчаты (когда, где и в какой степени они появляются?), Но это также может быть проблемой при рисовании непосредственно на экране, основываясь на вашем комментарии о том, как clear_to_color (), по-видимому, вызывает проблему. Попробуйте двойную буферизацию, это может решить несколько проблем.
Надеюсь, это поможет. Даже если это не решит вашу проблему, о них полезно помнить.
Комментарии:
1. Да, я пробовал двойную буферизацию, и это сработало! Также я не копировал весь код, поэтому отсутствует функция release_screen(), но на самом деле она там есть. Спасибо за ответ!