Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на анимацию.
Форум «Всё о Паскале» > 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 видео страницы и как их менять местами и все.. преподу незачет )
Тема исчерпана
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.