SVGAlib


Obsah:


uvod

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