Форум для программистов - задавайте интересные вопросы - получайте квалифицированные ответы
Free Pascal, Wingraph
  • VBnotVBnot June 2011
    Здравствуйте, у меня такая проблема - не могу заставить работать 3 анимации одновременно, по одной все работает отлично, в чем ошибка?Помогите, пожалуйста,вот мой код:
    ExpandedWrap disabled

    uses crt,wingraph;

    const sx=100; sy=100;
    yx=70; yy=70; g=Pi/180;
    bx=170; by=155;
    r=1;q=2;
    procedure Star;
    var sp1,sp2,sp3,sp4,sp5:pointer;
    sf1,sf2,sf3,sf4,sf5:file;
    ss1,ss2,ss3,ss4,ss5:integer;
    begin
    ss1:=imagesize(1,1,sx,sy);
    ss2:=imagesize(1,1,sx,sy);
    ss3:=imagesize(1,1,sx,sy);
    ss4:=imagesize(1,1,sx,sy);
    ss5:=imagesize(1,1,sx,sy);
    getmem(sp1,ss1);
    getmem(sp2,ss2);
    getmem(sp3,ss3);
    getmem(sp4,ss4);
    getmem(sp5,ss5);
    assign(sf1,'star1.bmp'); reset(sf1,1);
    assign(sf2,'star2.bmp'); reset(sf2,1);
    assign(sf3,'star3.bmp'); reset(sf3,1);
    assign(sf4,'star4.bmp'); reset(sf4,1);
    assign(sf5,'star5.bmp'); reset(sf5,1);
    blockread(sf1,sp1^,ss1);
    blockread(sf2,sp2^,ss2);
    blockread(sf3,sp3^,ss3);
    blockread(sf4,sp4^,ss4);
    blockread(sf5,sp5^,ss5);
    repeat
    begin
    delay(170);
    Putimage(200,200,sp1^,copyput);
    delay(170);
    Putimage(200,200,sp2^,copyput);
    delay(170);
    Putimage(200,200,sp3^,copyput);
    delay(170);
    Putimage(200,200,sp4^,copyput);
    delay(170);
    Putimage(200,200,sp5^,copyput)
    end
    until r<>1
    end;

    procedure Yellowsun;
    var yp : pointer;
    ya : AnimatType;
    ysz,i : longint;
    yf : file;
    begin
    ysz:=imagesize(1,1,yx,yy);
    getmem(yp,ysz);
    assign(yf,'Ysun.bmp');reset(yf,1);
    Blockread(yf,yp^,ysz);
    Close(yf);
    Putimage(1210,650,yp^,copyput);
    Freemem(yp);
    Getanim(1210,650,1210+yx-1,650+yy-1,black,ya);
    Putimage(1210,650,yp^,xorput);
    delay(500);
    i:=0;
    Updategraph(updateoff);
    repeat
    delay(10);
    Putanim(700+round(300*sin(i*g)),370+round(200*cos(i*g)),ya,bkgput);
    inc(i);
    Putanim(700+round(300*sin(i*g)),370+round(200*cos(i*g)),ya,transput);
    Updategraph(updatenow)
    until g<>Pi/180;
    freeanim(ya)
    end;

    procedure BlueSun;
    var bp1,bp2,bp3,bp4 : pointer;
    bs1,bs2,bs3,bs4 : longint;
    bf1,bf2,bf3,bf4 : file;
    begin
    bs1:=imagesize(1,1,bx,by);
    bs2:=imagesize(1,1,bx,by);
    bs3:=imagesize(1,1,bx,by);
    bs4:=imagesize(1,1,bx,by);
    getmem(bp1,bs1);
    getmem(bp2,bs2);
    getmem(bp3,bs3);
    getmem(bp4,bs4);
    assign (bf1,'bsun1.bmp'); reset(bf1,1);
    assign (bf2,'bsun2.bmp'); reset(bf2,1);
    assign (bf3,'bsun3.bmp'); reset(bf3,1);
    assign (bf4,'bsun4.bmp'); reset(bf4,1);
    Blockread(bf1,bp1^,bs1);
    Blockread(bf2,bp2^,bs2);
    Blockread(bf3,bp3^,bs3);
    Blockread(bf4,bp4^,bs4);
    Close(bf1);
    Close(bf2);
    Close(bf3);
    Close(bf4);
    repeat
    delay(100);
    Putimage(650,320,bp1^,copyput);
    delay(100);
    Putimage(650,320,bp2^,copyput);
    delay(100);
    Putimage(650,320,bp3^,copyput);
    delay(100);
    Putimage(650,320,bp4^,copyput)
    until q<>2
    end;

    var gd,gm : integer;

    BEGIN
    gd:=nopalette;
    gm:=mCustom;
    SetWindowSize(1280,720);
    Initgraph(gd,gm,'');
    while not keypressed do
    begin
    Bluesun;star;yellowsun
    end;
    closegraph
    END.
  • serg44serg44 June 2011
    У тебя цикл

    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 - тоже...
  • VBnotVBnot June 2011
    инициализация - это процедура, а 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, не операторские скобки не понадобятся,или их нужно заменить другим циклом?
  • serg44serg44 June 2011
    Инициализация - это действия, которые ты делаешь перед циклом. Потом запоминаешь переменную, которая изменяется в цикле, и вызываешь одну итерацию цикла каждой процедуры за раз.

    Бррр... В общем, я бы сделал как-то так (схематично, но должно быть понятно) :

    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;

    procedure Init_Star;
    var
    sf1,sf2,sf3,sf4,sf5:file;
    ss1,ss2,ss3,ss4,ss5:integer;
    begin
    ss1:=imagesize(1,1,sx,sy);
    ss2:=imagesize(1,1,sx,sy);
    ss3:=imagesize(1,1,sx,sy);
    ss4:=imagesize(1,1,sx,sy);
    ss5:=imagesize(1,1,sx,sy);
    getmem(sp[1],ss1);
    getmem(sp[2],ss2);
    getmem(sp[3],ss3);
    getmem(sp[4],ss4);
    getmem(sp[5],ss5);
    assign(sf1,'star1.bmp'); reset(sf1,1);
    assign(sf2,'star2.bmp'); reset(sf2,1);
    assign(sf3,'star3.bmp'); reset(sf3,1);
    assign(sf4,'star4.bmp'); reset(sf4,1);
    assign(sf5,'star5.bmp'); reset(sf5,1);
    blockread(sf1,sp[1]^,ss1);
    blockread(sf2,sp[2]^,ss2);
    blockread(sf3,sp[3]^,ss3);
    blockread(sf4,sp[4]^,ss4);
    blockread(sf5,sp[5]^,ss5);
    end;
    function Iterate_Star(i : integer) : integer;
    begin
    Putimage(200, 200, sp[i]^,copyput);

    i := i + 1;
    if i > 5 then i := 1;

    Iterate_Star := i;
    end;

    var
    ya : AnimatType;

    Procedure Init_YellowSun;
    var
    yp : pointer;
    ysz : longint;
    yf : file;
    begin
    ysz:=imagesize(1,1,yx,yy);
    getmem(yp,ysz);
    assign(yf,'Ysun.bmp');reset(yf,1);
    Blockread(yf,yp^,ysz);
    Close(yf);
    Putimage(1210,650,yp^,copyput);
    Freemem(yp);
    Getanim(1210,650,1210+yx-1,650+yy-1,black,ya);
    Putimage(1210,650,yp^,xorput);
    delay(500);
    Updategraph(updateoff);
    end;

    function Iterate_YellowSun(i : Integer) : integer;
    begin
    // delay(10);
    Putanim(700+round(300*sin(i*g)),370+round(200*cos(i*g)),ya,bkgput);
    inc(i);
    Putanim(700+round(300*sin(i*g)),370+round(200*cos(i*g)),ya,transput);
    Updategraph(updatenow);

    Iterate_YellowSun := i;
    end;

    var
    bp : array[1 .. 4] of pointer;

    procedure Init_BlueSun;
    var
    bs1,bs2,bs3,bs4 : longint;
    bf1,bf2,bf3,bf4 : file;
    begin
    bs1:=imagesize(1,1,bx,by);
    bs2:=imagesize(1,1,bx,by);
    bs3:=imagesize(1,1,bx,by);
    bs4:=imagesize(1,1,bx,by);
    getmem(bp[1],bs1);
    getmem(bp[2],bs2);
    getmem(bp[3],bs3);
    getmem(bp[4],bs4);
    assign (bf1,'bsun1.bmp'); reset(bf1,1);
    assign (bf2,'bsun2.bmp'); reset(bf2,1);
    assign (bf3,'bsun3.bmp'); reset(bf3,1);
    assign (bf4,'bsun4.bmp'); reset(bf4,1);
    Blockread(bf1,bp[1]^,bs1);
    Blockread(bf2,bp[2]^,bs2);
    Blockread(bf3,bp[3]^,bs3);
    Blockread(bf4,bp[4]^,bs4);
    Close(bf1);
    Close(bf2);
    Close(bf3);
    Close(bf4);
    end;

    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_... совсем не обязательно работать с несколькими файлами, вполне можно обойтись одним. Можно сделать одну-единственную процедуру чтения данных из файла, и вызывать ее столько раз, сколько нужно. Но это уже самостоятельно...
  • VBnotVBnot June 2011
    Да там просто кадров нарезал для вращения синей звезды штук 60, а на звездочку и 5ти хватит - мерцание

    Я думал схематично, а тут весь исправленный код)
    Спасибо вам огромное

Добро пожаловать!

Похоже, что Вы здесь впервые. Если хотите поучаствовать, нажмите на одну из этих кнопок!

Sign In with Twitter Sign In with OpenID Sign In with Google Login with Facebook

Войти Зарегистрироваться

In this Discussion

Tagged

Webparadox - разработка мобильных приложений под iOS и Android.