Здравствуйте, у меня такая проблема - не могу заставить работать 3 анимации одновременно, по одной все работает отлично, в чем ошибка?Помогите, пожалуйста,вот мой код: ExpandedWrap disabled
BEGIN gd:=nopalette; gm:=mCustom; SetWindowSize(1280,720); Initgraph(gd,gm,''); while not keypressed do begin Bluesun;star;yellowsun end; closegraph END.
while not keypressed do begin Bluesun;star;yellowsun end;
выполняться не будет, поскольку до Star дело вообще не дойдет. Вечно будет крутиться BlueSun. Чтобы было так, как ты хочешь - нужно организовать программу по-другому:
Инициализация_BlueSun Инициализация_Star Инициализация_YellowSun while not keypressed do begin Корректировка_BlueSun Корректировка_Star Корректировка_YellowSun Delay(100); end;
Вот тогда будет то, что тебе нужно. Под корректировкой понимается однократное изменение положения рисунка (для Star), или замена рисунка (для Sun). Естественно, что, скажем, значение i между вызовами YellowSun нужно сохранять, чтоб потом продолжать с того же места. Да и индекс текущего изображения между вызовами BlueSun и Star - тоже...
инициализация - это процедура, а i будет чем-то вроде точки их сцепления? или нужно разбить процедуры на создание и вывод?
про цикл я в курсе, не совсем уж баклан, исправить забыл, но все равно не работало бы, у меня есть еще один код для Graph, вот он:
uses crt,graph; procedure Sun; begin setcolor(yellow); circle(800,350,100); setfillstyle(1,yellow); floodfill(800,350,yellow) end; procedure Earth(a:integer); const grad=0.0174532; var ex,ey:integer; begin ex:=round(800+300*sin(a*grad)); ey:=round(350-180*cos(a*grad)); setcolor(green); circle(ex,ey,30); setfillstyle(1,green); fillellipse(ex,ey,30,30); delay(10); setcolor(black); setfillstyle(1,black); fillellipse(ex,ey,30,30) end;
procedure Moon(b:integer); const grad=0.0174532; var mx,my:integer; begin mx:=round(800+150*sin(b*grad)); my:=round(350-265*cos(b*grad)); setcolor(darkgray); circle(mx,my,20); setfillstyle(1,darkgray); fillellipse(mx,my,20,20); delay(5); setcolor(black); setfillstyle(1,black); fillellipse(mx,my,20,20) end; procedure Neptune(c:integer); const grad=0.0174532; var nx,ny:integer; begin nx:=round(800+320*cos(c*grad)); ny:=round(350-320*sin(c*grad)); setcolor(lightblue); circle(nx,ny,40); setfillstyle(1,lightblue); fillellipse(nx,ny,40,40); setcolor(black); setfillstyle(1,black); fillellipse(nx,ny,40,40) end; procedure Star1; begin setcolor(white); ellipse(60,80,360,270,25,50); ellipse(110,80,180,270,25,50); ellipse(60,180,0,90,25,50); ellipse(110,180,90,180,25,50); setfillstyle(1,white); floodfill(85,130,white); end; procedure Star1B; begin setcolor(black); ellipse(60,80,360,270,25,50); ellipse(110,80,180,270,25,50); ellipse(60,180,0,90,25,50); ellipse(110,180,90,180,25,50); setfillstyle(1,black); floodfill(85,130,black); end; procedure Star2; begin setcolor(white); ellipse(60,105,360,270,25,25); ellipse(110,105,180,270,25,25); ellipse(60,155,0,90,25,25); ellipse(110,155,90,180,25,25); setfillstyle(1,white); floodfill(85,130,white); end; procedure Star2B; begin setcolor(black); ellipse(60,105,360,270,25,25); ellipse(110,105,180,270,25,25); ellipse(60,155,0,90,25,25); ellipse(110,155,90,180,25,25); setfillstyle(1,black); floodfill(85,130,black); end; procedure Star3; begin setcolor(white); ellipse(35,105,270,360,50,25); ellipse(135,105,180,270,50,25); ellipse(35,155,0,90,50,25); ellipse(135,155,90,180,50,25); setfillstyle(1,white); floodfill(85,130,white) end; procedure Star3B; begin setcolor(black); ellipse(35,105,270,360,50,25); ellipse(135,105,180,270,50,25); ellipse(35,155,0,90,50,25); ellipse(135,155,90,180,50,25); setfillstyle(1,black); floodfill(85,130,black) end; {procedure Blackhole; begin setcolor(0); circle(85,130,51); setfillstyle(1,0); floodfill(85,130,0) end;} const n=200; var driver,mode,size,a,b,c,i,j,k,l,m,xc,yc:integer; x,y:array[1..n]of integer; BEGIN i:=1; j:=1; k:=1; xc:=0; { driver:=nopalette; mode:=m1280x1024;} initgraph(xc,yc,''); xc:=getmaxX;yc:=getmaxY; Sun; repeat begin begin if i=360 then i:=1; Earth(i); i:=i+1; if j=360 then j:=1; Moon(j); j:=j+1; if k=360 then k:=1; Neptune(k); k:=k+1; { Star1;Star1B;Star2;Star2B;Star3;Star3B;} end; for l:=1 to n do begin X[l]:=random(xc); y[l]:=random(yc) end; begin for l:=1 to n do begin m:=random(16); putpixel(x[l],y[l],m); if m=0 then begin x[l]:=random(xc); y[l]:=random(yc) end end; delay(160) end end; until keypressed; readkey; closegraph END.
как я понимаю, нужно будет также завести 3 переменные количетва кадров для солнц и i для количества оборотов, тогда в процедурах ни цикл repeat until, не операторские скобки не понадобятся,или их нужно заменить другим циклом?
Инициализация - это действия, которые ты делаешь перед циклом. Потом запоминаешь переменную, которая изменяется в цикле, и вызываешь одну итерацию цикла каждой процедуры за раз.
Бррр... В общем, я бы сделал как-то так (схематично, но должно быть понятно) :
uses crt,wingraph;
const sx=100; sy=100; yx=70; yy=70; g=Pi/180; bx=170; by=155; var sp : array[1 .. 5] of pointer;
function Iterate_BlueSun(i : integer) : integer; begin // delay(100); Putimage(650,320,bp[i]^,copyput);
i := i + 1; if i > 4 then i := 1;
Iterate_BlueSun := i; end;
var gd,gm : integer; i_bs, i_st, i_ys : integer;
BEGIN gd:=nopalette; gm:=mCustom; SetWindowSize(1280,720); Initgraph(gd,gm,'');
Init_BlueSun; Init_Star; Init_YellowSun;
i_bs := 1; i_st := 1; i_ys := 0;
while not keypressed do begin i_bs := Iterate_Bluesun (i_bs); i_st := Iterate_Star (i_st); i_ys := Iterate_YellowSun (i_ys); delay(100); end; closegraph; END.
Кстати, в Init_... совсем не обязательно работать с несколькими файлами, вполне можно обойтись одним. Можно сделать одну-единственную процедуру чтения данных из файла, и вызывать ее столько раз, сколько нужно. Но это уже самостоятельно...