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 }
end.