SDLBASIC Guida di riferimento 1 Visione generale 1.1Presentazione. Si tratta di un piccolo basic distribuito sotto licenza lgpl cross platform destinato a scrivere semplici giochi 2d. Basato sull'interprete del wxbasic e sulle librerie sdl dispone di un avanzato screen virtuale e di un bob system interno. E' possibile compilare i programmi direttamente in c usando la libreria strato SDLengine. 1.2 L'interprete basic Come interprete ho estratto l'interprete del wxbasic di David Cuny. Questo ottimo basic e' veramenre ben fatto e consente di inserire le funzioni senza usare bison o flex. Inoltre accetta di usare le funzioni come se fossero comandi senza generare errori (in pratica come il c). Ho rimosso tutto il supporto al wxwindows quindi ho inserito il supporto alle sdl library. Siccome non sono interessato a bindare il codice ho eliminato con facilita' le istruzioni per l'operazione. Quindi ho inserito in builtin.c e builtin.h le rutine di link al modulo SDLengine.c e ho scritto il makefile necessario per compilare sotto linux. Mio fratello (grazie Franco)mi ha concesso il suo pc con windows98 e il suo visual c++ con cui ho compilato la versione win32 che dovrebbe funzionare anche sotto xp. Ci sono aluni limiti in questa implementazione: i nomi delle rutine devono essere interi (per capirci screenswap e non screen swap) e sono obbligatorie le parentesi per i parametri (se non ci sono parametri si deve scrivere () ). A voler ben guardare questo aspetto rende piu' facile portare il codice in c. Infatti basta aggiungere un punto e virgola alla fine della riga ,initialize() all'inizo del programma e terminate alla fine e poco altro per avere un sorgente c pronto per essere compilato e linkato con SDLengine. Per rendere meglio l'idea ci sono alcuni esempi del caso scritti apposta. 1.3 SDLengine E' il modulo che contiene le rutine strato tra l'interprete basic e le librerie SDL. Contiene anche alcune rutine estratte da vari software distribuiti sotto licenza gpl. Il concetto e' quello di avvicinarsi il piu' possibile a una sintassi semplice e pulita cercando di nascondere l'obiect orienred delle librerie SDL poco adatto alla semplicita' del basic. 1.4 sdlBasicIde l'editor di sdlBasic Ho scritto (anzi si puo' dire ho rubato) una semplice ide per scrivere modificare e lanciare i programmi in sdl basic. Ho usato le fltk come gui ma si tratta di un lavoro ancora acerbo. Per il momento il modo migliore per lanciare i programmi e' la shell. 2 Primi passi 2.1 Installazione Linux binario(non ancora disponibile): dovete avere installato le librerie sdl,sdl-image , sdl-mixer e sdl.ttf (in mandrake 9.0 sono presenti tutte sui dischi). Scaricate e scompattate sdlbasic-bin.tar.gz ,entrate nella directory e srivete "su -c install". windows binario; scompattate il file sdlBasic.zip , copiate le dll nella directory di sistema (in win95-98-me c:\windows\system , in xp-2000-nt c:\windows\system32) . linux sorgente: dovete avere anhe i pacchetti devel delle librerie. Scaricate sdlBasic-source.tar.gz scompattate e lanciate make install come super user. Non ho fatto il configure perche.... non so farlo. windows sorgente: ci vuole il vc++ microsoft dovete scaricare gli sdk delle rispettive librerie SDL scaricate il sorgente.tar.gz (lo stesso di linux) entrate nella directory visualc avviate il workspace e buona fortuna. Attenzione compila solo in modo debug. 4 I comandi base del dcbasic and append as call case close const continue common data declare delete dim do each end erase error exit explicit for to next function if then else else if end if in include input inv is let lline loop mod new noconsole not open option or output print qbasic redim return select shared shl shr static step sub until wend while xor printstack abs acos argc argv asc asin atan chdir chr chr$ command command$ connect convbase convbase$ cos date date$ hasdir hasdir$ direxists eof exp fileexists fix floor format format$ frac freefile getwxapp hex hex$ indexes insert insert$ instr int kill lcase lcase$ left left$ len length loc lof lbound ltrim ltrim$ mainloop mid mid$ mkdir quicksort randomize readbyte rename replace replace$ replacesubstr replacesubstr$ reverse reverse$ right right$ rinstr rmdir rnd round rtrim rtrim$ run seek sgn shell sin space space$ sqr str str$ strf strf$ string string$ tally tan ticks time time$ typeof typeof$ ubound ucase ucase$ val writebyte 4 I comandi SDL 4.1 Comandi Screen sdlBasic ha un sofisticato sistema di gestione dello schermo composto da diversi comandi Il cuore del sistema e' il display che in pratica e' dove si riversa l'output visibile sia in finestra che a fullscreen. Invece gli screen (ce ne sono 8) sono degli schermi virtuali. Si puo impostare l'area del display che occupano le dimensioni e la posizione visibile (l'offset). Il comando che aggiorna ogni variazione impostata e screenswap. Finche non si invoca questo comando non si vedranno aggiornamenti sullo schermo setdisplay(w,h,bpp,mode ) Apre lo schermo o la finestra grafica nella risoluzione indicata da width,height,bpp Se si tratta di una finestra naturalmente la profondita di colore non cambiera'. il modo stabilisce il tipo di display: 0 full screen 1 finestra a sezione fissa 2 finestra ridimensionabile Per default viene aperta automaticamente con parametri 640,480,0,1 viene anche settato lo screen 0 con le stesse dimensioni. displaywidth() E' una funzione che restituisce la larghezza del display displayheight() E' una funzione che restituisce l'altezza del display displaybpp() E' una funzione che restituisce i byte per pixel del display screenopen ( n, w, h, dx,dy, dw, dh, flag) definisce le dimensioni dello schermo virtuale n e la posizione della finestra visibile (il display). Nel SDLengine sono disponibili 8 screen numerati da 0 a 7. Se non viene invocato lo screen 0 sara' settato sulle dimensioni del display. La voce flag permette di stabilire se lo screen si trova sopra o sotto il piano dei bob e se il colore nero e' trasparente screen (n) setta lo schermo virtuale attivo sul quale operano i comandi grafici screenclose (n) chiude lo schermo n e dealloca la memoria screenclone(n,s,x,y,w,h,flag) Crea una nuova entrata nello schermo s. in pratica permette di avere due vedute dello stesso screen. Ideale per giochi con due player screencopy(n,x,y,w,h,nd,xd,yd) Copia una porzione di schermo dallo schermo n allo schermo nd. Si puo anche copiare sullo stesso schermo. E' un comando per rendere facile la copia di grafica screenrect(x,y,w,h,flag) Ridimensiona e riposizipna la porzione di display occupata dallo screen n. Il flag n stabilisce se questo screen e' sopra o sotto agli sprite. Non e' possibile rendere trasparente il colore nero se non e' settato all'apertura xscreenrect() Riporta la coordinata x della porzione di display occupata dallo screen corrente. yscreenrect() Riporta la coordinata y della porzione di display occupata dallo screen corrente. wscreenrect() Riporta la larghezza della porzione di display occupata dallo screen corrente. hscreenrect() Riporta l'altezza della porzione di display occupata dallo screen corrente. screenwidth() E' una funzione che restituisce la larghezza dello screen screenheight() E' una funzione che restituisce l'altezza dello screen offset (x,y) posiziona il display sullo screen. Se il display dovesse sporgere dallo screen automaticamente sara' modificato il parametro in modo che sia al bordo xoffset() Restituisce la coordinata x della posizione del display sullo schermo yoffset() Restituisce la coordinata y della posizione del display sullo schermo cls() cancella l'intero screen : attenzione perche i bob sono indipendenti. per cancellare solo una parte potete usare: ink(0) : bar(x,y,x1,y1) screenswap() aggiorna il display e il bob system. Fino a quando non invocate guesto comando non si vedranno le modifiche di nessun comando grafico compreso cls e offset setautoback(m) attiva / disattiva lo screenswap automatico. Permette di rendere automatico l'aggiornamento grafico ogni m millisecondi. E' necessara un po' di prudenza per non appesantire troppo il sistema dualplayfield(m) attiva / disattiva l'aggiornamento degli screen sopra al piano degli sprite waitvbl attende lo screenswap automatico 4.2 Comandi di colore La gestione dei colori avviene a 32 16 e 8 bit. I comandi accettano i parametri sempre a 32 bit e provvedono internamente alle conversioni. Attualmente questa parte non funziona correttamente. ink( color) imposta il colore corrente. Lavora sempre a 24 bit e approssima automaticamente il colore in base alla risoluzione. rgb(r,g,b) restituisce il colore in formato numerico partendo dai tre fondamentali. 4.3 Comandi di Geometria Questi comandi si occupano di tracciare punti,linee,figure geometriche e provvedono anche a prelevare le infomazioni sul colore di un punto dot (x,y) traccia un punto sullo screen con il colore corrente settato con ink dot_ex(x,y,c) scrive un punto con il colore c alla coordinata x,y point (x.y) restituisce il colore del punto x y sullo screen line (x,y,x1,y1) traccia una linea retta box (x,y,x1,y1) traccia un rettangolo vuoto bar (x,y,x1,y1) traccia un rettangolo pieno circle (x,y,r1,r2) traccia un cerchio ellipse (x,y,r1,r2) traccia un ellisse fillcircle (x,y,r) traccia un cerchio pieno fillellipse (x,y,r1,r2) traccia un ellisse piena 4.4 Comandi di file Input - Output Questi comandi si occupano di caricare e salvare le immagini i suoni e la musica dal file system rispettando le regole dei differenti sistemi operativi. loadimage (filename,n) carica un immagine grafica nel banco n. Sono al momento disponibili 4096 posti. Non ci sono vincoli prefissati per la dimensione. saveimage (filename,n *.bmp) salva l' immagine grafica del banco n. loadsound (filename ,n) Carica un suono nel banco n. Ci sono 512 banchi indipendenti riservati per i suoni. Come per le immagini non ci sono vincoli prefissati per la dimensione. loadmusic (filename) Carica in memoria un file musicale. I formati ammessi sono mod e soci (xm it pl3),ogg e mp3(questi ultimi solo in linux). 4.5 Comandi di blitting Questi comandi trasferscono i dati grafici da un banco allo screen e viceversa alla massima velocita possibile blt(n,sx,sy,w,h,dx,dy) copia una parte del banco n sullo screen pastebob( x,y,n) stampa sullo screen un immagine rispettando la trasparenza 4.6 Comandi bob system bob(n,x,y,fr) attiva o sposta il bob n alla coordinata x y con l'immagine fr. I bob vengono aggiornati automaticamente al comando screenswap. sono disponibili 256 bob deletebob(n) disattiva il bob n. xbob(n) riporta la coordinata x del bob n ybob (n) riporta la coordinata y del bob n frbob (n) riporta l'immagine(frame) del bob n livebob (n) Restituisce 1 seil bob e' al momento attivo. 4.7 Comandi di Testo text (x,y,s,txt) Stampa un testo alla coordinata x y con l'altezza s il testo deve essere una stringa. Per stampare un numero bisogna usare str$(numero). setfont (pathfont) Cambia il font di tipo true type usato per per text textrender. pathfile e' il percorso del font. textrender (txt,s, n) Crea nel banco n un immagine della scritta richiesta. L'immagine ottenuta potra' essere usata come bob o blittata sullo schermo. 4.8 Comandi del suono playsound (n,c) esegue il suono del banco n sul canale c. Ci sono per default 64 canali audio riservati. volumesound(c,v) Stabilisce il volume del canale. Deve essere compreso tra 0 e 128. Per default e' 128. Se lo settate a -1 restituira il volume corrente. playmusic (loop) Esegue il motivo caricato in memoria corrente. loop determina il numero di esecuzioni. Con -1 l'esecuzione sara' continua. Stopmusic() Interrompe l'esecuzione della musica corrente. volumemusic(v) Stabilisce il volume della musica. Deve essere compreso tra 0 e 128. Per default e' 128. Se lo settate a -1 restituira il volume corrente. fademusic(d) degrada ilvolume della musica di d punti. Se il valore e' uguale ominore di 0 termina l'esecuzione. 4.9 Comandi relativi alla tastiera key(k) restituisce 1 se il tasto k e' premuto. Il sistema ha integrato un buon numero di costanti predefinite con il codice del tasto. 4.10 Comandi relativi al mouse xmouse() restituisce la coordinata x del mouse. E' riferita allo screen corrente ymouse() restituisce la coordinata y del mouse. E' riferita allo screen corrente bmouse() restituisce lo stato dei tasti del mouse. mousehide() Nasconde il puntatore del mouse mouseshow() Rende visibile il puntatore del mouse. 4.11 Comandi del joystick xjoy() non implementata yjoy() non implementata bjoy(button) non implementata 4.12Comandi relativi al timing di sistema wait(t) non fa nulla per t millesimi di secondo ToDo: '_______________________________________________________________________________ joy system '_______________________________________________________________________________ init: restart (soundfrq,buffer) :la possibilita di riavviare le sdl con altri parametrii '_______________________________________________________________________________ screen: screenclone(ssorg, sdest) : apre una nuova visuale su uno sreen '_______________________________________________________________________________ geometria: paint(x,y) : riempie un area chiusada altri colori del colore corrente draw(x,y) :traccia una linea dritta dalle coordinate correnti a x,y del colore corrente '_______________________________________________________________________________