Free Pascal-ban hogyan kell animációt készíteni?
Free Pascal-ban kéne megoldani valahogy, hogy nyilakkal tudjak mozgatni pl. egy kört.
Próbáltam letörölni a képernyőt és újrarajzolni mindent az új koordinátákba, de így villódzik. Szóval a cleardevice; nem vált be. Van esetleg valami más megoldás ahol nem fog villódzani a kép?
Ezt nézd meg:
ez alapján nekem működött, nem villódzott (Linux alatt, FPC 3.0 alatt Graph helyett ptcgraph-ot használva - ha kiszedem a váltogatás, villog).
A különbségek:
* a ciklus előtt beállítja a látható lapot.
* a ciklus elején váltja a lapot
* tesz bele egy kis késleltetést is
@#11:
Gratulálok, én nem voltam képes rátalálni erre a példára. Mekkelek5 megoldása nálam is tökéletesen fut (linuxon, persze ptcgraph unittal), attól eltekintve, hogy a kilépés nem működik.
@Kérdező:
Két megjegyzés:
1. Nem túl szerencsés csonka kódot közölni, akkor sem, ha biztos vagy benne, hogy a hiba nem a hiányzó részekben van -- hátha valaki kísérletezgetne a programoddal. A kódot természetesen ne ide töltsd fel, hanem valami megosztó-oldalra, mondjuk erre (pascalt nem tudsz választani, de ott a Delphi a listában):
2. Szerintem ezt az egész graph unitos dolgot ne erőltesd túlságosan. Divatjamúlt megoldás, amit valószínűleg csak a régi Turbo Pascallal való kompatibilitás kedvéért tartanak életben egyáltalán. De ezek szerint már Windowson sem az igazi, és linuxon nem is használható, ez aláássa a platformfüggetlenséget szép eszméjét. Kipróbáltad Mekkelek5 programját ptcgraph-fal is?
#11-es által hozott kódban azért van a delay, mert meg kell várni, amíg a sugár visszatér (V-sync). Erre is hoz példát a prog.hu-s oldal.
Szóval a megoldás kb. úgy néz ki, hogy
- az előtérben az aktív lap látszódik
- rajzolsz a backbufferre
- megvárod, míg végez a v-sync
- gyorsan kicseréled a backbuffert az aktív lapra
- goto 1
Ami fontos, hogy ne 640x480-ba csináld, menj le legalább 640x350-ig, akkor már két lapod lesz.
* EGALo (640 x 200) 4 pages
* EGAHi (640 x 350) 2 pages
* EGAMonoHi (640 x 350) 2 pages
* VGALo (640 x 200) 4 pages
* VGAMed (640 x 350) 2 pages
* VGA (640 x 480) 1 page
Itt a sync függvény, ami addig vár, míg visszatér a sugár:
procedure sync; assembler;
asm
mov dx,03DAh
@1:
in al,dx
test al,1000b
jz @1
end;
Állítólag ez is működik:
procedure WaitRetrace;
begin
repeat until port[$3da] and 8 = 8;
repeat until port[$3da] and 8 = 0;
end;
Ha nem várakotatsz a v-syncre, akkor villogás van (lsd. [link]
Itt egy példakód, nem tudom, működik-e (kb. tíz éve nem láttam Pascalt közelről):
{Setactpg.PAS}
{Sample code for the SetActivePage procedure.}
uses Graph;
var Gd, Gm: Integer;
begin
Gd := Detect;
InitGraph(Gd, Gm, ' ');
if GraphResult <> grOk then
Halt(1);
if (Gd = HercMono) or (Gd = EGA) or (Gd = EGA64) or (Gd = VGA) then
begin
SetVisualPage(0);
SetActivePage(1);
Rectangle(10, 20, 30, 40);
WaitRetrace();
SetVisualPage(1);
end
else
OutText('No paging supported.');
Readln;
CloseGraph;
end.
Egyébként én sem értem, minek szenvedsz ezzel, kismillió másik megoldás van a problémádra.
Ne legyen igazam, de szerintem nem lesz. Miért is lenne más megoldás (azt most tegyük is félre, hogy miért gyötörnénk téged e nyögvenyelős módszerrel, ha volna könnyebb)? A DOS és vele a Graph unit mára jóformán csak szép emlék, üzenet a távoli múltból, Jurassic Park, kövület, stb., egy olyan korból, amelyben a felhasználó boldog volt, hogy egyáltalán módja van grafikus felületen is munkálkodni. A Borland becsületére legyen mondva, hogy a kor színvonalán igazán elegánsan és letisztultan oldotta meg a dolgot.
Nemrégiben láttam egy kis ismeretterjesztő filmet, amelyben valami német kutatócsoport az ősemberek életét élte néhány hétig. De a vadászat macerás, meg persze az állatvédők sem engedték volna, tehát a vágóhídról szállították nekik a húst és a lenyúzott bőröket, ott állt nekik halomban a teherautóval odafuvarozott, géppel aprított fa, hogy legyen miből megrakni a horda közös tűzhelyét, az ősasszonyok láncfűrésszel otrombán darabolt rusztikus rönkasztalokon bohóckodtak a kovakéseikkel és csonttűikkel... Te ugyanerre vágyol: Meg akarsz maradni a daliás hőskor könnycsordítóan egyszerű eszközeinél, de ha ebből az következik, hogy egy összetettebb feladatot már valamivel fáradságosabb velük megoldani, akkor meg berzenkedel, hogy miért nincs előregyártott megoldás.
A Graph kevés; mindig is az volt, és a világ már régen elgyalogolt mellette. Most hasonló feladattal ott van az említett PTCGraph, ami egyrészt platformfüggetlen (bizony, a DOSban is használható), másrészt sokkal rafináltabb -- amiből persze éppen nem az következik, hogy „könnyebb” lesz, mint a Graph valójában eléggé szimpla módszerei. De ezen a legelőn tényleg nem terem túl sok fű. Ha tovább akarsz lépni, ismerkedj egyéb, a Turbo Pascal idejében még nem létezett grafikus könyvtárakkal, vagy térj át Lazarusra, amely ennek a tehernek nagyobb részét leveszi a válladról. De az is igaz, hogy az már nem a DOS világa.
Ha viszont egy ideig még maradnál, ahol vagy, akkor leszel szíves nem a német ősemberekről venni a példát, hanem a valódiakról. Ők ugyanis képesek voltak faékekkel, kődarabokkal, homokkal, meg némi munkával és tudással olyan elképesztő teljesítményeket maguk után hagyni, amelyeket ma milliárdos projektek eszközeivel is csak üggyel-bajjal csinálhatnánk utánuk. Ennek is megvan a maga szépsége, nemcsak a csuklóból odakent könnyedségnek.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!