PRZEWIJANIE TEKSTU I ANIMACJA W TP

 

PROGRAM okrag_obrot; { Obracający  się  jednostajnie okrąg wokół  osi leżącej  w płaszczyźnie ekranu }

 

uses Crt, Graph;

 

const Sciezka_dostepu_do_sterownika: string ='d:\tp\bgi';

      pr=100;        { promień okręgu }

      dt:Real=1;   { przyrost czasu }

 

var  SterGr, ModGr, Blad : Integer;

     omega   : Real;    { prędkość kątowej }

     t             : Real;    { czas }

     Xsr,Ysr : Integer; { środek okręgu }

     a,b         : Word;    { połosie elipsy }

 

begin

 writeln('Podaj wartość prędkości kątowej'); { najlepiej ok. 0.05 }

 readln(omega);

 SterGr := Detect;

 InitGraph(SterGr, ModGr, Sciezka_dostepu_do_sterownika);

 Blad := GraphResult;

 if Blad <> grOk then

   begin

    Writeln('Bląd grafiki: ', GraphErrorMsg(Blad));

    Halt(1);

   end;

 Xsr:=GetMaxX div 2;  { środek okręgu na środku ekranu }

 Ysr:=GetMaxY div 2; { początkowe parametry okręgu }

 a:=pr; b:=pr;                 { wielkość półosi elipsy }

 t:=0;                                { początkowy czas }

{ animacja - nie można wykorzystać procedury SetWriteMode(XORPut) tak jak np. w zadaniu R11Z1B.PAS, do gaszenie narysowanej już elipsy, gdyż procedura ta współdziała jedynie z procedurami: DrawPoly, Line, LineRel, LineTo oraz

Rectangle; do tego celu w poniższym fragmencie wykorzystano rysowanie kolorem tła }

 repeat

SetColor(GetMaxColor);                {ustawienie do rysowania koloru białego }

  Ellipse(Xsr, Ysr, 0, 360, a, b);      { rysuj elipsę}

  Delay(10);                                         { czekaj 10 ms}

  SetColor(GetBkColor);                { ustawienie do rysowania koloru tła }

  Ellipse(Xsr, Ysr, 0, 360, a, b);        { zgaś elipsę}

  t:=t+dt; if t>=2*pi/omega then t:=0; { redukcja czasu po 1 okresie }

  b:=round(pr*abs(cos(omega*t)));      { nowa wartość półosi b }

 until KeyPressed; { naciśnięcie klawisza kończy ruch }

 CloseGraph

end.

 

PROGRAM Kulka_obiega_ekran_i_informuje_o_ilosci_obiegow;

USES graph,crt;

CONST r=20;t=1;

VAR gd,gm,i,d,n:integer;

    k:word;

    s:STRING;

BEGIN

 gd:=DETECT;

 InitGraph(gd,gm,'c:\TP\bgi');

 k:=0;d:=1;

REPEAT

 FOR i:=22 TO 617 DO

  BEGIN

   SetColor(d);SetFillStyle(1,d);circle(i,22,r);FloodFill(i,22,d);Delay(t);

   SetColor(0); circle(i,22,r);

  END;

 FOR i:=22 TO 457 DO

  BEGIN

   SetColor(d);SetFillStyle(1,d);circle(617,i,r);FloodFill(617,i,d);Delay(t);

   SetColor(0); circle(617,i,r);

  END;

 FOR i:=617 DOWNTO 22 DO

  BEGIN

   SetColor(d);SetFillStyle(1,d);circle(i,457,r);FloodFill(i,457,d);Delay(t);

   SetColor(0);  circle(i,457,r);

  END;

 FOR i:=457 DOWNTO 22 DO

  BEGIN

   SetColor(d);SetFillStyle(1,d);circle(22,i,r);FloodFill(22,i,d);Delay(t);

   SetColor(0);                  circle(22,i,r);

  END;

   SetColor(0);SetTextStyle(7,0,8);OutTextXY(120,100,'OBIEGAM ');

    OutTextXY(140,220,s+' RAZ');

    k:=k+1; d:=k;

    IF d>=15 THEN d:=d MOD 15;

    IF d=0 THEN d:=11;

    SetColor(d);   str(k+1,s);     OutTextXY(120,100,'OBIEGAM ');

    OutTextXY(140,220,s+' RAZ ');

UNTIL KeyPressed;

CloseGraph

END.

 

PROGRAM R11Z10A; { Rzut ukośny }

uses Crt, Graph;

const Sciezka_dostepu_do_sterownika: string ='d:\tp\bgi';

      pr=10;         { promień piłki }

      a:real=0.1;    { przyspieszenie }

      vy0:real=0.0;  { prędkość początkowa w kierunku osi y }

var  SterGr, ModGr, Blad : Integer;

     X,Y                 : Integer; { współrzędne środka piłki - na ekranie }

     xr, yr              : real;    { współrzędne rzeczywiste }

     Obraz               : Pointer; { wskaźnik do pamięci przechowującej obraz}

     Rozmiar             : Word;    { wielkość pamięci zarezerwowanej na obraz}

     s                   : Integer; { numer strony graficznej }

     vx, vy              : Real;    { składowe prędkości chwilowej }

     t,dt                : Real;    { czas i przyrost czasu }

begin

 writeln('Podaj wartość prędkości poziomej');

 readln(vx);

  SterGr:=VGA;

  ModGr:=VGAMed;

  InitGraph(SterGr, ModGr, Sciezka_dostepu_do_sterownika);

  Blad := GraphResult;

  if Blad <> grOk then

    begin

     Writeln('Blad grafiki: ', GraphErrorMsg(Blad));

     Halt(1);

    end;

     { narysowanie koła - piłki }

  SetVisualPage(1);

  SetActivePage(0);

  X:=GetMaxX div 2; Y:=2*pr;

  PieSlice(X,Y,0,360,pr);

     { zapamiętanie rysunku do dalszej animacji }

  Rozmiar := ImageSize(X-pr, Y+pr, X+pr, Y-pr);

  GetMem(Obraz, Rozmiar);

  GetImage(X-pr, Y+pr, X+pr, Y-pr, Obraz^);

  ClearDevice;

     { przygotowanie do animacji }

  X:=pr; xr:=x;     { współrzędne początkowe piłki na ekranie}

  Y:=Y-pr; yr:=Y;

  t:=0.0; dt:=1;    { czas początkowy i wartość przyrostu czasu }

  vy:=vy0;          { początkowa prędkość piłki wzdłuż osi y }

  s:=0;             { początkowa strona graficzna }

     { animacja }

  repeat

   SetActivePage(s);   { uaktywnienie niewidocznej strony graficznej }

   ClearDevice;        { wyczyszczenie jej }

   t:=t+dt;            { zwiększenie czasu }

   if Y>=GetMaxY-2*pr then begin vy0:=-vy; t:=0 end; { odbicie się piłki odpodłoża }

   if (X>=GetMaxX-2*pr) or (X<=0) then

vx:=-vx ; { odbijanie się piłki na bocznych krawędziach ekranu }

   vy:=vy0+a*t;     { aktualna prędkość wzdłuż osi y }

   yr:=yr+vy*dt;    { aktualne położenie wzdłuż osi Y }

   xr:=xr+vx*dt;    { aktualne położenie wzdłuż osi X ; prędkość jest stała }

   Y:=round(yr);    { zamiana na typ INTEGER, }

   X:=round(xr);    { dostępny w funkcjach graficznych }

   PutImage(X, Y, Obraz^, XORPut); { wstawienie obrazu na stronie graficznej w odpowiednim miejscu }

   SetVisualPage(s);               { pokazanie strony na ekranie }

   if s=0 then s:=1 else s:=0;     { zamiana stron }

  until KeyPressed;   { naciśnięcie klawisza kończy ruch }

 

  CloseGraph

end.

 

A TERAZ PRZYKŁAD PROGRAMU KTÓ®Y POKAŻE MAM DZIAŁAJĄCY SYGNALIZATOR ULICZNY WTAZ Z SYGNALIZACJA AKUSTYCZNA PRZY ZIELONYM ŚWIETLE

 

PROGRAM Sygnalizacja_uliczna;

USES graph,crt;

CONST t=3000;z=1000;q=400;c=1200; x=320;y=210;

VAR gd,gm:integer;

PROCEDURE GRAJ(nuta,czas:integer);

BEGIN

  sound(nuta);

  delay(czas);

  nosound;

END;{procedury}

BEGIN

 gd:=detect;

 InitGraph(gd,gm,'c:\TP\bgi');

 bar(0,0,639,479);

 SetColor(0);rectangle(x-100,y-200,x+100,y+200);

 SetFillStyle(1,0);FloodFill(x,y,0);

 SetColor(0);rectangle(x-30,y+200,x+30,y+290);

 SetFillStyle(1,0);FloodFill(x,y+220,0);

REPEAT

 SetColor(4);circle(x,y-120,50);

 SetFillStyle(1,4);FloodFill(x,y-120,4);

 delay(t);

 SetColor(0); circle(x,y-120,50);

 SetFillStyle(1,0);FloodFill(x,y-120,0);

 

   SetColor(14); circle(x,y,50);

   SetFillStyle(1,14);FloodFill(x,y,14);

   delay(z);

   SetColor(0); circle(x,y,50);

   SetFillStyle(1,0);FloodFill(x,y,0);

 

 SetColor(2); circle(x,y+120,50);

 SetfillStyle(1,2);Floodfill(x,y+120,2);

 GRAJ(c,q); GRAJ(c,q); GRAJ(c,q); GRAJ(c,q);

 GRAJ(0,q); GRAJ(c,q); GRAJ(0,q); GRAJ(c,q);

 SetColor(0); circle(x,y+120,50);

 SetFillStyle(1,0);FloodFill(x,y+120,0);

 

   SetColor(14); circle(x,y,50);

   SetFillStyle(1,14);FloodFill(x,y,14);

   delay(z);

   SetColor(0); circle(x,y,50);

   SetFillStyle(1,0);FloodFill(x,y,0);

UNTIL KeyPressed;

readln;CloseGraph

END.

 

 

PROGRAM ODBIJANIE_PILKI; { Rzut ukośny }

 

uses Crt, Graph;

 

const Sciezka_dostepu_do_sterownika: string ='d:\tp\bgi';

      pr=10;         { promień piłki }

      a:real=0.1;    { przyspieszenie }

      vy0:real=0.0;  { prędkość początkowa w kierunku osi y }

var

  SterGr, ModGr, Blad : Integer;

     X,Y                 : Integer; { współrzędne środka piłki - na ekranie }

     xr, yr              : real;    { współrzędne rzeczywiste }

     Obraz               : Pointer; { wskaźnik do pamięci przechowującej obraz}

     Rozmiar             : Word;    { wielkość pamięci zarezerwowanej na obraz}

     s                   : Integer; { numer strony graficznej }

     vx, vy              : Real;    { składowe prędkości chwilowej }

     t,dt                : Real;    { czas i przyrost czasu }

 

begin

 writeln('Podaj wartość prędkości poziomej');

 readln(vx);

 

  SterGr:=VGA;

  ModGr:=VGAMed;

  InitGraph(SterGr, ModGr, Sciezka_dostepu_do_sterownika);

  Blad := GraphResult;

  if Blad <> grOk then

    begin

     Writeln('Błąd grafiki: ', GraphErrorMsg(Blad));

     Halt(1);

    end;

 

     {narysowanie koła - piłki }

  SetVisualPage(1);

  SetActivePage(0);

  X:=GetMaxX div 2; Y:=2*pr;

  PieSlice(X,Y,0,360,pr);

 

     { zapamiętanie rysunku do dalszej animacji }

  Rozmiar := ImageSize(X-pr, Y+pr, X+pr, Y-pr);

  GetMem(Obraz, Rozmiar);

  GetImage(X-pr, Y+pr, X+pr, Y-pr, Obraz^);

  ClearDevice;

 

     { przygotowanie do animacji }

  X:=pr; xr:=x;     { współrzędne początkowe piłki na ekranie}

  Y:=Y-pr; yr:=Y;

  t:=0.0; dt:=1;    { czas początkowy i wartość przyrostu czasu }

  vy:=vy0;          { początkowa prędkość piłki wzdłuż osi y }

  s:=0;             { początkowa strona graficzna }

     { animacja }

  repeat

   SetActivePage(s);   { uaktywnienie niewidocznej strony graficznej }

   ClearDevice;        { wyczyszczenie jej }

   t:=t+dt;            { zwiększenie czasu }

   if Y>=GetMaxY-2*pr then begin vy0:=-vie; t:=0 end; { odbicie się piłki od podłoża }

   if (X>=GetMaxX-2*pr) or (X<=0) then vx:=-vx ; { odbijanie się piłki na bocznych krawędziach ekranu }

 

   vy:=vy0+a*t;     { aktualna prędkość wzdłuż osi y }

   yr:=yr+vy*dt;    { aktualne położenie wzdłuż osi Y }

   xr:=xr+vx*dt;    { aktualne położenie wzdłuż osi X ; prędkość jest stała }

   Y:=round(yr);    { zamiana na typ INTEGER, }

   X:=round(xr);    { dostępny w funkcjach graficznych }

   PutImage(X, Y, Obraz^, XORPut); { wstawienie obrazu na stronie graficznej w odpowiednim miejscu }

   SetVisualPage(s);               { pokazanie strony na ekranie }

   if s=0 then s:=1 else s:=0;     { zamiana stron }

  until KeyPressed;   { naciśnięcie klawisza kończy ruch }

  CloseGraph

end.