Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на анимацию.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Zac
Привет. Задали вот сделать програмку . показывающую фазы луны. анимация с использованием динамической памяти. я написал, но почемуто дергается картинка (кадры), хотя координаты там тока числа и везде одинаковые, никаких вычислений.
Как сделано - процедура рисует общуюю картину smile.gif,Ю затем процедура рисует луну. дальше управляю видео страницами 0 и 1. переключая их. На активной рисую , затем загоняю в динам. память, затем стираю и вставляю кадр из динамической памяти. далее переключаю страницу в видемую ну и т.д... Осталось разобратся почему дергается... может я не учел какието особенности работы паскаля с графикой а именно страничек.

Program Moon;
Uses CRT, Graph;

var
    size1:integer;
    star, gd,gm:integer;
  Img1:pointer;
Procedure Img;
 var i: integer;
begin
   SetBKcolor(0);
   For i:=1 to 50 do
     begin
       star:=random(14)+1;
       PutPixel(Random(350),Random(150),star);
     end;
   SetColor(2);
   setFillStyle(1,2); {Земля}
   Bar(0,150,350,210);
   SetColor(6);
   setFillStyle(1,6);{Ствол дерева}
   Bar(40,120,47,170);
   SetColor(10); {Листва}
   Circle(20,120,20);
   SetFillStyle(1,10);
   FloodFill(20,120,10);
   Circle(67,120,20);
   SetFillStyle(1,10);
   FloodFill(67,120,10);
   Circle(43,100,30);
   SetFillStyle(1,10);
   FloodFill(43,100,10);
   SetColor(1); { ОЗЕРО }
   Ellipse(200,175,0,360,100,20);
   SetFillStyle(9,1);
   FloodFill(200,175,1);
end;
Procedure Moon;
begin
   SEtcolor(15);
   Circle(300,60,40);
   SetFillStyle(1,14);
   FloodFill(300,60,15);
   Circle(280,50,10);
   Circle(330,60,7);
   Circle(300,79,8);
end;
begin

   Gd:=Detect;
   InitGraph(Gd, Gm, '');
   If GraphResult <> grOk Then Halt(1);
   While not Keypressed do
     begin
{1 КАДР}
SetActivePage(0);
SetVisualPage(1);
   cleardevice;
   Img;
   Size1:=ImageSize(0,0,350,210);
   GetMem(Img1, size1);
   GetImage(0,0,350,210,Img1^);
   cleardevice;
   PutImage(0,0,Img1^,XorPut);
SetActivePage(1);
SetVisualPage(0);
{2 кадр}
   Freemem(Img1,size1);
   img1:=nil;
Delay(50000);
Delay(50000);
   cleardevice;
   Img; moon;
   setColor(0);
   Circle(320,60,40);
   SetFillStyle(1,0);
   FloodFill(320,60,0);
   Size1:=ImageSize(0,0,350,210);
   GetMem(Img1, size1);
   GetImage(0,0,350,210,Img1^);
   cleardevice;
   PutImage(0,0,Img1^,XorPut);
SetActivePage(0);
SetVisualPage(1);
   Freemem(Img1,size1);
   img1:=nil;
   Delay(50000);
   Delay(50000);
   Cleardevice;
{3 кадр}
   img; moon;
   SetFillStyle(1,0);
   SetColor(0);
   Bar(300,20,340,100);
   Size1:=ImageSize(0,0,350,210);
   GetMem(Img1, size1);
   GetImage(0,0,350,210,Img1^);
   ClearDevice;
   PutImage(0,0,Img1^,XorPut);
SetActivePage(1);
SetVisualPage(0);
   Freemem(Img1,size1);
   img1:=nil;
   Delay(50000);
   Delay(50000);
   ClearDevice;
{4 кадр}
   img; moon;
   setColor(0);
   Circle(360,60,40);
   SetFillStyle(1,0);
   FloodFill(340,60,0);
   Size1:=ImageSize(0,0,350,210);
   GetMem(Img1, size1);
   GetImage(0,0,350,210,Img1^);
   ClearDevice;
   PutImage(0,0,Img1^,XorPut);
SetActivePage(0);
SetVisualPage(1);
   Freemem(Img1,size1);
   img1:=nil;
   Delay(50000);
   Delay(50000);
   ClearDevice;
{5 кадр}
   img; moon;
   Size1:=ImageSize(0,0,350,210);
   GetMem(Img1, size1);
   GetImage(0,0,350,210,Img1^);
   ClearDevice;
   PutImage(0,0,Img1^,XorPut);
SetActivePage(1);
SetVisualPage(0);
   Freemem(Img1,size1);
   img1:=nil;
   Delay(50000);
   Delay(50000);
   ClearDevice;
{6 кадр}
   img; moon;
   setColor(0);
   Circle(240,60,40);
   SetFillStyle(1,0);
   FloodFill(260,60,0);
   Size1:=ImageSize(0,0,350,210);
   GetMem(Img1, size1);
   GetImage(0,0,350,210,Img1^);
   ClearDevice;
   PutImage(0,0,Img1^,XorPut);
SetActivePage(0);
SetVisualPage(1);
   Freemem(Img1,size1);
   img1:=nil;
   Delay(50000);
   Delay(50000);
   ClearDevice;
{7кадр}
   img; moon;
   SetFillStyle(1,0);
   SetColor(0);
   Bar(300,20,260,100);
   Size1:=ImageSize(0,0,350,210);
   GetMem(Img1, size1);
   GetImage(0,0,350,210,Img1^);
   ClearDevice;
   PutImage(0,0,Img1^,XorPut);
SetActivePage(1);
SetVisualPage(0);
   Freemem(Img1,size1);
   img1:=nil;
   Delay(50000);
   Delay(50000);
   ClearDevice;
{8 кадр}
   img; moon;
   setColor(0);
   Circle(280,60,40);
   SetFillStyle(1,0);
   FloodFill(280,60,0);
   Size1:=ImageSize(0,0,350,210);
   GetMem(Img1, size1);
   GetImage(0,0,350,210,Img1^);
   ClearDevice;
   PutImage(0,0,Img1^,XorPut);
SetActivePage(0);
SetVisualPage(1);
   Freemem(Img1,size1);
   img1:=nil;
   Delay(50000);
   Delay(50000);
   ClearDevice;
  end;
   readln;
   CloseGraph;
end.

volvo
Цитата
может я не учел какието особенности работы паскаля с графикой
Именно... А точнее - ты забыл про то, что для того, чтобы использовать видеостраницы, надо инициализировать такой режим, в котором их по крайней мере больше одной. Detect инициализирует наилучший из возможных режимов, т.е. VGAHi, с одной страницей...

Меняешь вот на это:
...
   Gd:=vga;
   Gm:=VgaMed;
   InitGraph(Gd, Gm, '');
...
и проверяешь...

А вообще, можно было бы и цикл сделать - было бы гораздо короче...
Zac
Спасибо огромное ! ) помогло! просто я этого не знал. на лекциях только упомянули про 4 видео страницы и как их менять местами и все.. преподу незачет )
Тема исчерпана
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.