GRY-Online.pl --> Archiwum Forum

Programowanie, animacja.

19.05.2010
19:31
[1]

KapCioch [ Generaďż˝ ]

Programowanie, animacja.

Witam, potrzebuję pomocy w turbo pascalu. Chciałbym zrobić poruszający się po danej osi wcześniej namalowany skomplikowany rysunek. Nie ma problemu w zrobieniu czegoś takiego na pustym tle i przy pomocy jednej funkcji rysującej np. circle, ale gdy do czynienia mamy z złożonym z różnych brył i linii rysunek, który w dodatku jest odpowiednio pokolorowany to nie mam pojęcia jak to zrobić i czy w ogóle da się coś z tym zrobić w jakiś sprytny sposób. Oczywiście istnieje możliwość z osobna analizowania każdej zmiennej tak aby współgrała z animacją, ale to jest zadania na dłuuuugie godziny...
Na przykład namalowałem rybę i chciałbym żeby ona cała poruszała się po tle. Ryba składa się z 3 kółek i 4 linii którymi zrobiłem ogon i zamknąłem układ kolorując cały na zielono.
Nie jestem dobry w tej dziedzinie dlatego się pytam. Rysunek ten zrobiłem w procedurze i myślałem że dzięki temu będę mógł go wsadzić w dowolne miejsce na ekranie, a także dowolnie go zapętlać, niestety tu tkwi problem gdyż program "nie widzi" go jako jednego rysunku, który można byłoby wkleić w dowolne miejsce na ekranie, ale jako cały osobny ekran. Poza tym nie wiem jak nakładać podane rysunki w procedurach tak aby nie znikało wcześniejsze tło i wcześniejsze rysunki itp.

Ps.
Myślałem również, aby zrobić bąbelki puszczane przez tą rybę. Czyli kółka unoszące się jedno za drugim do góry i powiększające się zarazem, wszystko fajnie wyszło:
to procedura na te bąble:
procedure bable;
p:=3;
y:=getmaxy div 2;
for i:=1 to 12 do
begin
cleardevice;
p:=p+2;
y:=y-p-6;
circle(x,y,i);
delay(150);
end;
end;
I wywołanie jej:
repeat bable;
until keypressed;

Oczywiście jest to wycinek roboczy, ale ogólny sens widać. Ładnie by to działało gdyby nie ClearDevice; co jest potrzebne, aby dać wrażenie jednego unoszącego się bąbla i nie wiem czym to zastąpić aby nie czyściło mi całego ekranu, a jedynie tego poprzedniego bąbla i jak to wkleić do tej ryby tak aby jej nie nadpisać:(

Ehhh mam nadzieję, że znajdzie się ktoś co mi jakoś pomoże i coś doradzi.

19.05.2010
21:36
[2]

redan [ Wiking ]

jeśli rysujesz to w obrębie canvasa, to zamiast czyszczenia możesz wykonać "rysowanie" kola o kolorze tła, a następnie dopiero narysować właściwy "bąbel'. możesz tez spróbować zmieniać położenie samego canvasa (nakładasz jeden canvas na drugi. pierwszy stanowi tło, a drugi będzie ruchomy z "bąblem")

19.05.2010
22:31
smile
[3]

KapCioch [ Generaďż˝ ]

Hmm dziękuję za odpowiedź, ale szczerze mówiąc mało stąd rozumiem. Może ja spytam jaśniej, jak zrobić kółka olimpijskie tak aby każde "przylatywało" na swoje miejsce z innej strony zza ekranu i zostawało na swoim miejscu? Znowu potrafię to zrobić, (tym razem robiłem bez procedur) ale muszę używać cleardevice i tak tylko pierwsze kółko działa poprawnie bo następne albo będą zostawiać swój "ślad" po przyjeździe na miejsce, albo również zadziałają właściwie z tym, że przez cleardevice zmażą poprzednie koła:(
Oto problem: (znów chaotyczna wersja, ale chyba idzie się połapać)
program animacja;
uses crt,graph;
var k,t,c,a,b,x,y,i:integer;


BEGIN
k:=detect;
Initgraph(k,t,'G:\pascal\TP\BGI');
a:=getmaxx;
b:=getmaxy;
x:=a div 2;
y:=b div 2;

setbkcolor(white);
setcolor(red);
setfillstyle(1,red);
Setlinestyle(3,0,4);
‹pierwsze kolko›
p:=x+40;
q:=y-150;
for i:=1 to 20 do
begin
cleardevice;
circle(p-300,q-300,40);
circle(p-300,q-300,35);
floodfill(p-336,q-300,red);
p:=p+20;
q:=q+20;
delay(150);
end;
‹drugie kolko›
setcolor(blue);
setfillstyle(1,blue);
p:=x+40;
q:=y-150;
for i:=1 to 20 do
begin
‹cleardevice;›
circle(p+300,q-300,40);
circle(p+300,q-300,35);
floodfill(p+336,q-336,blue);
p:=p-20;
q:=q+20;
delay(15);
end;
readln;
closegraph;
END.

© 2000-2024 GRY-OnLine S.A.