SVGAlib
Obsah:
Svgalib je takova sporna knihovna-je to vlastne takovej kousek dosu v
linuxovi-leze prima na hardware,je neprenosna na ostatni osyje mozne s
ni riznout pocitac, ma problemy z ne-root uzivatelama-vyzaduje rootovska
prava(suid) a ma klasicky dosove orientovany funkce. Na druhou stranu v
ni jdou psat hry pekne site na pc hardware,ktere vypadaji stejne pekne
jako pod dosem,muzou bez problemu bezet ve vysich rozlisenich - ne jako
normalne kde v Xwoknech na doomovsky okno 320x200 potrebujete lupu
abyste neco videli. Proto se mi moje jedina hra pro linux-koulesy psaly
celkem pekne. Stejne jsem ji ale nakonec muset prepsat na xwokna ale to
slo kupodivu prekvapive snadno.
Svgalib podporuje vetsinu svga karet, mysi a primy pristup na
klavesnici. Kazdemu doporucuju upgardnout na 1.2.9 protoze ta je mnohem
odolnejsi vuci chybam. Vlastni knihovna toho moc neumi-nahodi vam
videorezim umi cekat na refreshe,nastavavovat palety atd..proste to,co
se bezne dela biosem. Na kresleni car atd musite vetsinou pouzit neco
jinyho-je tam sice funkce na kresleni-vga_line ale ne ze by toho tam
bylo moc a je to pomaly. Na to je uz v zakladni distribuci pridana vgagl
knihovna. To je jednoducha framebufferova knihovna, ktera uz umi kreslit
bitmapy,ctverecky,kolecka,cary,delat framebuffering(obrazovku v pameti a
potom ji kopirovat na obrazovku) a dalsi srandicky. Je celkem trubo a
jednoducha. Neni az tak spatna.
inicializace
- vga_mousesupport(1/0)
- zapne podporu mysi-je treba zapnout pred vga_init
- vga_init()
- nazhavi svgalibku-osaha hardware atd..
- vga_hasmode(mode)
- zjisti jestli je mod mode mozny. To je treba delat pred
jakymkoliv nazhavovanim grafiky! protoze kdyz mod nejde svgalib ho
stejne nazhavi a rizne masinu. Promena mode je konstant typu G640x480x256
- vga_setmode(mode)
- nazhavi mod
- keyboard_init()
- nazhavi tvrdy pristup na klavesnici-muzete potom testovat
pekne vsechny klavesy prez scancody jako v dosu
- keyboard_translatekeys(1/0)
- zapne/vypne mapovani sipek na keypad
ukonceni
- keyboard_close()
- zapne normalni mod klavesnice-je treba volat pred
udzhavenim grafiky jinak vam klavesnice zustane blbnout
- vga_setmode(TEXT)
- nazhavi textovy rezim
a muzete spokojene ukoncit
ostatni
- vga_waitretrace()
- ceka na retrace
- vga_setpalette()
- na paletky
Je tu fura dalsich funkci-treba jako jestli se program ma zastavit pri
prepnuti konzily
rozdelovani obrazovky,scrolling atd..proste se kouknete do hacka
input
klavesnice
Podpora klavesnice je uboha. Je lepsi pouzivat knihovnu rawkey.
- keyboard_pressed(scancode)
- zjisti jestli klavesa scancode je zmackla
- keyboard_update()
- updatne tabulku zmacknutych klaves do aktualniho stavu-je
treba volat pred keyboard_pressed
mys
- mouse_update()
- jako u klavesnice
- mouse_getbutton()
- mapa zmacknutych buttonu
- mouse_getx()
- mouse_gety()..co asi
vgagl
Na psani her je celkem vyhodne pouzivat knihovny vgagl. Protoze podporuje
framebuffering,je celkem rychla, je kratka ale na hry staci umi priblizne:
kontext
vsechno kresleni probiha na kontextu. Je tu nekolik funkci na prepinani
kontextu:
- gl_setcontextvga(mod)
- nastavi kontext na mod(mod je treba G320x200x256
na obrazovce..tedy co budete to tohodle kontextu kreslit objevi se.
nevim co to bude delat kdyz mod nebude mod obrazovky...asi binec
- gl_setcontextvgavirtual(mod)
- udela kontext v pameti,kde si muzete neco
nakreslit a potom to pekne okopirovat na obrazovku.
Tohle vytvareni kontextu je jednak pomale a taky treba vytvareni virtualnich
kontextu udela vzdycky novej-proto je treba je ukladat funkcema:
- gl_getcontext(& na GraphicsContext)
- ulozi aktualni kontext do prom.
- gl_setcontext(& context)
- prepne na urceny kontext
barvicky
gl_setpalette(ukazatel na strukturu Palette)
kresleni
gl_setpixel,gl_line,gl_fillbox,gl_hline atd..
clipane se zapina/vypina pomoci gl_enableclipping/gl_disableclipping
Bitmapky
umi pracovat z normalnima,pruhlednejma-0 je pruhledna a ty umi zkompilovat
trochu je zapakuje tim ze uklada vzdycky ze je n pruhlednych a n nepruhlednych
a vykreslovani je rychlejsi protoze to pak uz nemusi prohlizet a jednoduse
memcopi to ale nefunguje jinde nez normal 256
kompilovani
- gl_compileboxmasksize(x,y,char *bitmap)i
- zjisti kolik musite naalikovat na
zapakovanou bitmapku
- gl_compileboxmask(x,y,char *bitmap, char *cbitmap)
- zapakuje bitmap do cbitmap
kresleni
- gl_putbox(x,y,w,h,char *bitmap)
- vykresli bitmapku
- gl_putboxmask(stejny)
- vykresli pruhlednou bitmapku
- gl_putboxmaskcompiles(stejny)
- vykresli pruhlednou zkompilovanout bitmapku
a na stejnym principu ma jeste part na kresleni pouze casti:
- gl_putboxpart(x,y,wcasti,hcasti,w,h,bitmap,x v bitmape,y v bitmape)
- taky ma gl_copybox na kopirovani ctverce:
- gl_copybox(x,y,w,h,x1,y1)
- gl_copyboxtocontext(x,y,w,h,context,x1,y1)
- na kopirovani do jinyho kontextu-
hodi se na obnovovani obrazovky z framebufferu
- gl_copyboxfromcontext(context,x,y,w,h,x1,y1)
- zkopiruje z jineho kontextu
Prace z framebufferem
- gl_copyscreen(context)
- zkopiruje kontext na obrazovku. Zaroven udela prepinani
stranek kdyz je zapnuto takze se obraz objevi na obrazovce
- gl_enableflippeng(flipping)
- zapne double/triplebuffering na obrazovce-
musi se potom obnovovat pomoci copy_screen a nenasel jsem jinou cestu
proste zadna jina funkce neprepne stranku a tak se kresli naprazdno
ostatni
- gl_clearscreen(color) smaze obrazovku pyxelem cislo color
- gl_scalobox(w1,h1,zdroj,w2,h2,cil) resizne bitmapku zdroj na cil
- gl_setclippingwindow(x1,y1,x2,y2) okenko na clipani
Pak ma jeste funkce na psani
pouziti vypada asi takhle:
font=malloc(256*8*8)
gl_expandfont(8,8,barva,gl_font8x8,font)
a pak muzete vesele psat:
gl_setfont(8,8,font)
gl_write(0,0,"Cau")
Tento soubor je soucasti rozsahle sbirky skolicek na
http://www.ucw.cz/~hubicka/skolicky
Take si muzete prohlidnout jeji puvodni textovou podobu
Nebo mi mailnout na
hubicka@ucw.cz
Copyright (C) Jan Hubicka 1996