Proto╛e DOS se dnes asi nejΦast∞ji pou╛φvß na hry a jinΘ grafickΘ aplikace, rozhodl jsem se napsat o knihovn∞ Allegro. Je to opravdu dobrß grafickß knihovna pro DJGPP . Nenφ p°φmo GNU program, dokonce se nedistribuuje pod GPL. Jejφ licence je ale podobnß s GPL - jsou dostupnΘ zdrojovΘ k≤dy a nenφ nutnΘ platit za jejφ pou╛itφ.
Asi v╣ichni, kte°φ kdy programovali v Borland C nebo Pascalu (asi v∞t╣ina programßtor∙ na PC), a sna╛ili se tam ud∞lat n∞jakou rozumnou grafiku Φasem zahodili standardnφ knihovnu - BGI. ProΦ? Asi ka╛d², kdo v nφ d∞lal to vφ - je pomalß a neumφ po°ßdn∞ ani 320x200 256 barev - nejoblφben∞j╣φ to grafick² m≤d v∙bec. Podobnß situace je i u jin²ch p°ekladaΦ∙ a problΘm∙ - standardnφ knihovny jsou Φasto ne╣ikovnΘ a pomalΘ a tak hodn∞ lidφ dojde k zßv∞ru, ╛e jedinß sprßvnß cesta je ud∞lat si v╣echno sßm.
Postupem Φasu se ale programovßnφ stßle komplikuje (nenφ to smutnΘ?) a ka╛d² dnes po programu chce SVGA m≤dy, v²stup na 15 r∙zn²ch zvukov²ch karet a sφ╗. OvladaΦe k SVGA m≤d∙m ale nejsou u╛ tak jednoduchΘ - je mnoho cest jak grafiku inicializovat apod. a tak cesta, kdy si Φlov∞k ud∞lß v╣echno sßm je dost pomalß a Φlov∞k tak ztratφ hodn∞ Φasu, kter² by mohl strßvit n∞Φφm u╛iteΦn∞j╣φm (je sice zajφmavΘ ud∞lat ovladaΦ od n∞jakΘ tΘ karty, aby se Φlov∞k dozv∞d∞l, jak funguje, ale d∞lat ovladaΦ k 10. kart∞ u╛ tak velkß zßbava nenφ.)
U free softwaru je situace u knihoven jinß - v∞t╣inou ji zaΦne vyvφjet n∞jak² nad╣enec a ten to n∞kdy ud∞lß celkem dob°e. Navφc, proto╛e jsou zdrojovΘ k≤dy k dispozici, ka╛d², kdo pou╛φvß knihovnu a myslφ, ╛e je ╣patnß ji m∙╛e vylep╣it. A tak n∞kterΘ free knihovny jsou opravdu dobrΘ a jejich pou╛φvßnφ u╣et°φ hodn∞ prßce.
Jako p°φklad takovΘ celkem hezkΘ a u╛iteΦnΘ knihovny jsem si vybral allegro. ProΦ? No proto╛e to je (nejen) grafickß knihovna a snad ka╛d², kdo programoval mß n∞jakΘ zku╣enosti s grafikou... Jß jsem ji pou╛il v XaoSovi a musφm °φct, ╛e funguje celkem dob°e.
Allegro zaΦal programovat Shawn Heargreaves v roce 1994. Verze 1.0 fungovala pod Borland C. Verze 2.0 vy╣la a╛ v roce 1996 (brzo po tom co, vy╣la prvnφ verze DJGPPv2) a u╛ celß fungovala pod DJGPP. V jeho Changelogu se pφ╣e:
Dropped all the Borland code. A couple of months ago I ran out
of disk space, and it was with great satisfaction the I executed the
command deltree /y c:\bc4
. It was a horrible compiler, and I'm
glad it's dead.
V╣echny pozd∞j╣φ verze u╛ fungujφ pouze pod DJGPP. Poslednφ
verze je 2.2 ale pracuje se na verzi 3.0 (i jß jsem p°isp∞l svoji
tro╣kou do ml²na) a tak se tato recenze vstahuje k nφ. Domßcφ
stranku allegra (i se zdrojßky samoz°ejm∞) najdete na adrese
www.talula.demon.co.uk
Shawn profesionßln∞ pracuje pro n∞jakou firmu vyrßb∞jφcφ hernφ konzole. (tu╣φm ╛e Nitendo) a tak m∞l v╛dycky ke hrßm blφzko. I svoji knihovnu navrhnul tak, aby se v nφ hry dob°e psaly - umφ v╣e d∙le╛itΘ, mß funkce pro prßci s klßvesnicφ, my╣φ, ΦasovaΦem, joystickem, grafikou, poΦφtßnφ ve fixedpointu a zvukem. Je velmi rychlß a umφ r∙znΘ fφgle na animaci. Navφc ale mß i jednoduchΘ GUI, podobnΘ tomu na Atari, detekci OS (DOS, Windows, OS/2 apod.), CPU a dal╣φ.
Allegro se inicializuje pomocφ funkce allegro_ini
t, ta toho moc
ned∞lß - jenom nastavφ n∞kterΘ prom∞nΘ (jako os_type
, apod.) a
za°φdφ, aby se zavolala funkce allegro_exit
p°ed skonΦenφm programu
a tak program po sob∞ vrßtil textov² m≤d apod. Allegro obsahuje sadu funkcφ
pro Φtenφ konfiguraΦnφho souboru (od zvuku apod.), kterΘ ale jdou
pou╛φt i pro jinΘ uΦely.
Potom, co je Allegro inicializovßno je mo╛nΘ pou╛φt libovolnou z jeho slu╛eb:
Jako v╛dy se nap°ed grafika musφ inicializovat. Allegro
podporuje 256 barevnΘ m≤dy a od verze 3.0 i 15bit, 16bit, 24bit a
32bit. To se nastavuje pomocφ funkce set_color_depth
. Potom u╛
m∙╛ete zavolat samotnΘ set_gfx_mode
. Tomu p°edßte velikost m≤du,
kter² chcete na╛havit (t°eba 320x200), virtußlnφ obrazovky (t°eba
320x400) a driver, kter² chcete pou╛φt. To m∙╛e b²t
GFX_AUTODETECT
pro autodetekci, GFX_VGA
pro VGA
, GFX_TEXT
pro nßvrat do textovΘho
m≤du, nebo jeden z 15 driver∙ pro r∙znΘ SVGA karty.
Allegro podporuje i velmi divokΘ m≤dy t°eba 256x200, 320x100 apod., tak╛e pokud mßte n∞co proti svΘm∙ monitoru, m∙╛ete mu dßt po°ßdn∞ zabrat.
Na prßci s virtußlnφ obrazovkou jsou tu funkce jako
scroll_screen
. Proto╛e ale v m≤dech X volßnφ scrollu zp∙sobuje
sn∞╛enφ, je nutnΘ p°epφnat jenom, kdy╛ je refresh. ╚ekßnφ na refresh
ale zdr╛uje a tak allegro se umφ pov∞sit na ΦasovaΦ a synchronizovat
ovladaΦ s refreshem a scroolovat tak na pozadφ. Tahle vymo╛enost ale
bohu╛el nechodφ pod Win95, kde emulace ΦasovaΦe je p°φli╣ pomalß na
to, aby to fungovalo. Jde tφm ale docφlit p∞knß plynulß animace.
Allegro umi i split screen.
Demo programy od allegra majφ v∞t╣inou hned n∞kolik cest, jak d∞lat plynulou animaci - dirty rectangles (animace se kreslφ do bitmapy a pak se na obrazovky vykreslφ jenom ty Φßsti co se zm∞nily), doublebuffering (s Φekßnφm na retrace i s retrace simulßtorem) a triplebuffering. V╣echny tyto metody jdou v Allegru ud∞lat celkem snadno.
Dal╣φ d∙le╛itß sada funkcφ jsou funkce na prßci s bitmapou. V Allegru je bitmapa struktura obsahujφcφ obrßzek urΦitΘ velikosti. Pam∞╗ pro bitmapu je urΦenß polem ukazatel∙ na zaΦßtky jednotliv²ch °ßdek (ne na zaΦßtek pam∞ti), to umo╛≥uje, d∞lat t°eba podbitmapy, kterΘ jsou Φßstφ jinΘ bitmapy, nebo bitmapy slo╛enΘ s vφce jin²ch bitmap, vlnit s obrazovkou a pod. Allegro podporuje t°i typy bitmap:
to je obrazovka. Kdy╛ chcete kreslit na obrazovku,
prost∞ uvedete jako bitmapu prom∞nou screen
.
to je bitmapa v pam∞ti
to jsou u╛ zmφn∞nΘ bitmapy, kterΘ sdφli pam∞╗ s jinou v∞t╣φ.
create_bitmap
a zanikß pomocφ
destroy_bitmap
. Navφc jde bitmap∞ nastavit pr∙hlednß barva (tak
m∙╛e fungovat jako sprite), nebo Φtverec na clipßnφ. Bitmapy takΘ
obsahujφ n∞kterΘ dal╣φ informace, jako jestli jsou lineßrnφ,
planßrnφ apod.
Kdy╛ mßte bitmapu, m∙╛ete do nφ kreslit. Allegro mß hodn∞ funkcφ
od kreslenφ bodu, p°es Φßru, polygon, elipsu a╛ po spline a
foodfill. P°esto, ╛e to u DJGPP pova╛uju za zbyteΦnost, velkß Φßst
funkcφ Allegra je psßna v assembleru a tak jsou opravdu rychlΘ.
,P>
HotovΘ bitmapy pak jde zobrazovat pomocφ funkce blit
, ale
jsou i
chyt°ej╣φ funkce pro zv∞t╣ovßnφ/zmen╣ovßnφ, kreslenφ sprit∙, rotovßnφ,
kreslenφ ΦßsteΦn∞ pr∙hledn²ch bitmap (s alfa kanßlem a to i pod
8bpp) apod. Allegro umφ i sprity pakovat pomocφ RLE. To zv²╣φ
rychlost u d∞rav²ch sprit∙, proto╛e se nemusφ kontrolovat, jestli
ten kter² pixel se kreslφ, nebo ne a prost∞ se vφ, ╛e nßsledujφcφh x
pixel∙ se (ne)kreslφ. Kdy╛ i to je mßlo, mu╛e se pou╛φt compiled
sprite. To jsou bitmapy, kterΘ se p°elo╛φ do assembleru (pomocφ
funkce get_compiled_sprite
), tedy do sekvence mov instrukcφ a proto
jsou ·pln∞ nejrychlej╣φ na kreslenφ, ale nefunguje clipping.
Allegro mß i sadu funkcφ pro psanφ textu - umφ nahrßvat fonty (i proporcionßlnφ) a potom je zobrazovat.
Navφc v╣echny tyto funkce fungujφ i s atributem - tedy v modu,
kdy se na pixel aplikuje n∞jakß zßbavna funkce, mφsto toho, aby se
prost∞ obarvil (jako xor) a pr∙hlednΘ kreslenφ - u 256 barevn²ch
m≤d∙ si allegro p°edpoΦte transformaΦnφ tabulku a potom kreslφ
pr∙hledn∞. Poslednφ mo╛nostφ je pou╛φvßnφ pattern∙. Umφ
COPY_PATTERN
- to je barevn², SOLID_PATTERN - jednobarevn² a MASKED_PATTERN -
ΦßsteΦn∞ pr∙hledn². Pro poΦφtßnφ tabulek jsem napsal modifikaci
foodfila tak, ╛e v²poΦet je opravd∙ rychl² a tak netrvß tak dlouho
jako u program∙, co tabulku poΦφtajφ barvu po barv∞ a proto nenφ nutnΘ
uklßdat p°edpoΦφtanΘ tabulky. V∞t╣ina funkcφ je psßna zvlß╣╗ pro
jednotlivΘ kombinace attribut∙ a tak to nep°inß╣φ n∞jakΘ v∞t╣i
zpomalenφ.
Allegro mß i normßlnφ funkce pro prßci s paletou, Φekßnφ na retrace, fade out/in, interpolaci paletek, 332 paletu apod.
Allegro pou╛φvß vlastnφ k≤d pro prßcφ s interrupty.
Mß i sadu funkcφ pro ΦasovaΦ a tak se u╛
nemusφte starat o instalaci handleru, p°eΦasovßnφ apod. Prost∞
zavolßte install_timer()
a je to. N∞kterΘ dal╣φ Φßsti (jako my╣)
vy╛adujφ, aby ΦasovaΦ byl nainstalovßn.
Proto╛e Win95 majφ potφ╛e s Φasova╣em na vysokΘ frekvenci, tyto
funkce tam majφ urΦitΘ potφ╛e. Pokud chcete, aby program fungoval i
tam, je nutnΘ nastavit prom∞nou i_love_bill
na 1
. ╚asovaΦ pak b∞╛φ
pomaleji. Vß╣ vlastnφ ΦasovaΦ potom jednodu╣e nainstalujete pomocφ
install_timer
, kde °eknete frekvenci a o vφc se nestarßte.
Samoz°ejm∞, ╛e m∙╛ete nainstalovat vφc takov²ch ΦasovaΦ∙ na r∙zn²ch
frekvencφch a allegro se samo starß o jejφch sprßvnΘ volßnφ a
p°eΦasovßvßnφ ΦasovaΦe. Handlery se odinstalujφ pomoci remove_timer.
Navφc je tu podpora pro emulaci retacu a funkce rest
, kterß
funguje stejn∞ jako delay, ale p°i Φekßnφ se volß n∞jakß funkce
(tedy n∞co jako dosovskΘ odpoΦφvadlo)
Allegro obsahuje kompletnφ 32 bitov² ovladaΦ od klßvesnice. To je
d∙le╛itΘ, proto╛e realmode interupty v protected modu jsou pomalΘ,
zhor╣ujφ interrupt latenci a tak biosovß klßvesnice nenφ nejlep╣φ
nßpad. Allegro samo za°izuje p°evod scancod∙ do ascii a jejich
bufferovßnφ. Aplikace pak m∙╛e pou╛φvat normßlnφ funkce jako
keypressed
, readkey
(kterß pro zajφmavost v hornφch 16ti bytech
vracφ i scancode), nebo se dφvat, jestli je klßvesa zmßΦknutß pomocφ
pole key
.
Jsou tu ale i dal╣φ v∞ci, jako nastavovßnφ ledek, nebo simulace stisku klßvesy.
Po instalaci ovladaΦe Allegro samo udr╛uje prom∞nΘ
mouse_x
,
mouse_y
a mouse_b
. Cursor jde kreslit na libovolnou bitmapu (tedy i
na obrazovku), jde nastavovat pozici my╣e, rychlost, kam a╛ mß
jezdit, tvar cursoru, Φφst p°φmo mickeye a nechat si volat vlastnφ
obsluhu my╣φho p°eru╣enφ.
Allegro podporuje asi 6 r∙zn²ch joystick∙. Na rozdφl od my╣i a
klßvesnice se neobnovuje pozice joysticku automaticky a musφte volat
poll_joystick
. Ta nastavuje prom∞nΘ jako
joy_left
, joy_right
, joy_b1
,
joy2_left
, joy_x
apod..
Allegro mß i funkce na kalibraci joysticku a ulo╛enφ t∞chto informacφ do souboru.
Jsou tu funkce pro Φtenφ a zßpis bitmap, lbm, iff, pcx a tga (gify
nejsou podporovßny kv∙li potφ╛φm s copyrightem) soubor∙. M∙╛ete si ale
zaregistrovat i dal╣φ formßty. Tyto funkce automaticky provßdφ
konverzi z truecoloru do 8bpp a pod. To jde zapnout pomocφ
set_color_conversion
. Jde p°ehrßvat FLIC soubory (z pam∞ti i
souboru).
Navφc allegro umφ pracovat s datov²m souborem, kter² je zabalen² pomoci LZW (funkce pro kompresi jde pou╛φt i samostatn∞) a obsahuje libovolnΘ dal╣φ sobory. K tomu existuje i GUI program pro vytvß°enφ t∞chto soubor∙. Je mo╛nΘ je p°idat na konec .exe souboru.
Je tu i pßr v∞cφ pro 3d grafiku. Quake v tom asi nenapφ╣ete, ale
na n∞co by to mohlo staΦit. Jsou tu dv∞ funkce:
polygon3d
a
triangle3d
. Ob∞ umφ flat, gouraud, rgb gouraud (tady se
neinterpoluje index ale rgb), afinφ a perspektivnφ mapovßnφ
normßlnφch, d∞rav²ch a osv∞tlovan²ch textur. Tyto funkce zatφm
podporujφ jen 256ti barevnΘ m≤dy. Do budoucφ verze se plßnuje
zbuffer.
Fixedpoint funkce funkce umφ nßsobit, d∞lit a pou╛φvat tabulky pro sinus, cosinus a dal╣φ. Jsou psßny jako Inline funkce v roz╣φ°enΘm asembleru GCC a tak jsou rychlΘ. V C++ m∙╛ete pou╛φt i t°φdu, kterß p°etφ╛φ operßtory. Dal╣φ sada funkcφ je pro prßci s vektorama a maticema pro 3d grafiku. Jsou tu funkce na sklßdßnφ matic, generovßnφ transoframΦnφch, rotaΦnφch a dal╣φch matic, generovßnφ matice pro danou kameru, aplikovßnφ vzniklΘ matice na vektor, normalizaci vektor∙ apod. V╣echno ve fixedpoint i floatingpoint verzi.
Gui funkce vznikly proto, aby Shawn mohl ud∞lat n∞kterΘ utility k allegru. Je to celkem normßlnφ event handled GUI, kterΘ umφ vytvß°et menu, dialogy, buttony, checkboxy apod. Vypadß podobn∞ jako to na atari. Existuje i n∞jakß C++ nadstavba, co dod∞lß vystφnovanß tlaΦφtka. Je tu hotov²ch pßr u╛iteΦn²ch dialog∙ jako v²b∞r rozli╣enφ nebo file selector.
Podpora zvuku je podle mΘho nßzoru nejslab╣φ Φßst allegra. To hlavn∞ proto, ╛e stßle nenφ hotov² driver pro GUSe. Allegro zatφm podporuje soundblastery (vΦetn∞ AVE32) a na GUSOvi se stßle jenom pracuje. Navφc allegro zatφm neumφ p°ehrßvat mody (takΘ ve v²voji). Existuje ale verze mikallegro, co╛ je spojenφ mikmodu a Allegra, kterß u╛ tyto v∞ci umφ. Nenφ ale ud∞lßna nejelegantneji.
Standardnφ funkce allegra umφ nahrßvat a mixovat samply (wav, nebo voc), nastavovat hlasitost a frekvenci sampl∙m, loopovat, p°ehrßvat obrßcen∞ apod. Podporuje i n∞kterΘ efekty jako vibrato, paning atd.
P°ehrßvßnφ midi funguje bu∩ p°es FM syntΘzu, wavetable awe32 nebo digmid driver, co umφ pou╛φt GOSovΘ patche a tak i na SB MIDI znφ rozum∞.
Je tu i n∞kolik dal╣φch u╛iteΦn²ch v∞cφ - p°φm² p°φstup do VRAM, podpora pro debugovßnφ, zmen╣ovßnφ velikosti exe souboru, zamykßnφ funkcφ a dat apod, ale myslφm ╛e u╛ nemß smysl to tu rozvßd∞t.
Tak to by byl struΦn² v²Φet funkcφ allegra. Myslφm ╛e to je opravdu rychlß, chytrß a celkem p∞kn∞ napsanß knihovna. Jejφ hlavnφ nev²hodou podle m∞ je velikost vzniklΘho k≤du. Celß zkompilovanß knihovna mß asi 400KB, co╛ na poΦet funkcφ nenφ moc, ale je dost uvnit° provßzanß a tak i hloup² program, co vypφ╣e hello word v grafice mß 200KB. A to u╛ hodn∞ je. Je sice n∞kolik cest jak tuto velikost zmen╣it, ale nejsou nejjednodu╣╣φ. Mn∞ se poda°ilo velikost stßhnout na 40KB a to u╛ jde p°e╛φt.
Allegro takΘ zatφm funguje jenom pro DOS, ale u╛ se rozb∞hla i prvnφ verze pro Linux a portu do DirectX.
Dotazy a p°ipomφnky ohledn∞ strßnky posφlejte na hubicka@paru.cas.cz