Помощь - Поиск - Пользователи - Календарь
Полная версия: Мультфильм на Turbo Pascal. Требуется альтернатива cleardevice. Как очистить только последний вставленный кадр?
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
tdAvenger
Возникла проблемка при написании мультфильма на Паскале. Очень надеюсь на Вашу помощь. Дело в том, что при смене кадра(для имитации движения),дабы удалить предыдущий кадр, приходится использовать процедуру cleardevice, которая в свою очередь полностью очищает экран. Проблема заключается в том, что удаляются все нарисованные элементы, включая статические объекты, которые по замыслу двигаться не должны(дорога, дома, деревья и т.п.). Единственное, что смог придумать на данный момент, это прописывать статический объект после каждого cleardevice'а (на примере дороги в коде). Но это жутко не удобно(например, при редактировании) и существенно увеличит объем кода, учитывая, что помимо дороги там планируется еще с десяток аналогичных объектов. Может быть cleardevice можно чем-нибудь заменить, чтобы очищался именно последний(только что вставленный) кадр? Или может быть посоветуете как переписать код программы, чтобы данную задумку реально было бы осуществить. Пытаюсь найти что-нибудь полезное в гугле, но пока безрезультатно.

Код
uses graph,crt;
var Gd,Gm :Integer;
    x,y,step, k:integer;
begin
Gd:= detect;
InitGraph(Gd,Gm,'');
setbkcolor(lightgray);
x:=30;
y:=200;
step:=10;

{дорога}
SetFillStyle(1,white);
bar(0,y+85,getmaxx,y+88);


repeat


{1 кадр}
setcolor(red);
setlinestyle(0,0,1);
setfillstyle(1,red);
fillellipse(x,y,13,40); {тело}
circle( x,y-60,20); {голова}
setlinestyle(0,0,3);
line(x-5,y+37,x-25,y+80); {левая нога}
line(x-25,y+80,x-15,y+85); {левая тапка*}
line(x+5,y+37,x+25,y+85); {правая нога}
line(x+25,y+85,x+35,y+85);  {правая тапка*}
Setcolor(blue);
setlinestyle(0,0,3);
line(x-3,y-20,x-20,y+5); {рука 1}
line(x-20,y+5,x-3,y+20); {рука 2}
setlinestyle(0,0,1);
arc(x-22,y+20,340,20,20); {карман}
setfillstyle(1,brown);
setcolor(brown);
pieslice(x,y-60,210,20,20); {волосы}
setcolor(darkgray);
setfillstyle(1,white);
pieslice( x+13,y-60, 0,360,2);
putpixel(x+13,y-59, darkgray);
putpixel(x+14,y-59, darkgray);
putpixel(x+14,y-60, darkgray);
line(x+16,y-50,x+8,y-50);
delay(100);
x:=x+step;
cleardevice;
{дорога}
SetFillStyle(1,white);
bar(0,y+85,getmaxx,y+88);
{2 кадр}
setcolor(red);
setlinestyle(0,0,1);
setfillstyle(1,red);
fillellipse(x,y,13,40); {тело}
circle( x,y-60,20); {голова}
setlinestyle(0,0,3);
line(x,y+37,x,y+85); {левая нога}
line(x,y+85,x+10,y+85); {левая тапка}
Setcolor(blue);
setlinestyle(0,0,3);
line(x-3,y-20,x-20,y+5); {рука 1}
line(x-20,y+5,x-3,y+20); {рука 2}
setlinestyle(0,0,1);
arc(x-22,y+20,340,20,20); {карман}
setfillstyle(1,brown);
setcolor(brown);
pieslice(x,y-60,210,20,20); {волосы}
setcolor(darkgray);
setfillstyle(1,white);
pieslice( x+13,y-60, 0,360,2);
putpixel(x+13,y-59, darkgray);
putpixel(x+14,y-59, darkgray);
putpixel(x+14,y-60, darkgray);
line(x+16,y-50,x+8,y-50);
delay(200);
x:=x+step;

if x=310 then
   begin
   {дорога}
SetFillStyle(1,white);
bar(0,y+85,getmaxx,y+88);
   {procedure svetofor}
    delay(3000);
    
    x:=x+step;    
      end;

cleardevice;
{дорога}
SetFillStyle(1,white);
bar(0,y+85,getmaxx,y+88);
until keypressed;
Closegraph;
end.



Заранее благодарю за любые идеи по реализации.
TarasBer
Только запоминать предпоследний кадр в буфер (GetImage, PutImage).
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.