BasicC/Tekst
BasicC obsługuje czcionki wektorowe za pośrednictwem biblioteki SDL_ttf oraz własne, proste czcionki bitmapowe.
Czcionki bitmapowe
edytujWzór czcionek bitmapowych zawarty jest w pliku graficznym BASFont.bmp. Zestaw ten jest wzorowany na czcionkach systemowych komputera ZX Spectrum, zawiera wzory 114 znaków o wymiarach 8x8 pikseli. Pierwsze 95 znaków jest zgodne ze standardem ASCII, odpowiada znakom ASCII o kodach 32-126 z wyjątkiem znaku ^ zastąpionego przez ↑, oraz ` zastąpionego przez £, kolejnym znakiem jest ©, następnie zdefiniowanych jest 18 znaków charakterystycznych dla j. polskiego. Możliwe jest ustawienie wielkości wyświetlanych znaków (domyślnie 16x16) i koloru, modyfikacja i zmiana wzorów czcionek.
Właściwości czcionki reprezentuje struktura GPRINT i zapisane są w zmiennej GPR o polach:
SDL_Texture *T; wskaźnik na teksturę zawierającą obraz czcionek
int x; pozycja x "kursora"
int y; pozycja y "kursora"
Uint8 sw; szerokość znaków, standardowo 8
Uint8 sh; wysokość znaków, standardowo 8
Uint16 w; szerokość wyświetlanych znaków, 16
Uint16 h; wysokość wyświetlanych znaków, 16
Aby zmienić czcionkę wystarczy do GPR.T przypisać wskaźnik na obraz innej czcionki, jeśli czcionki mają wymiary inne niż 8x8 - należy je wpisać w GPR.sw i GPR.sh. Czcionkę można wczytać z pliku, jak każdy inny obraz, lub stworzyć, np. modyfikując standardową. Czcionkę odwróconą (negatyw) można uzyskać następująco:
- zadeklarować wskażnik na teksturę, np:
SDL_Texture *odwroconacionka=NULL;
- wywołać
InvertImg(odwroconacionka,BASFont)
, spowoduje to stworzenie tekstury z odwróconymi czcionkami i przypisanie jej do zmiennej odwroconaczcionka - wywołać ImgBlendMode(BASFont,1) by ustawić domyślny tryb mieszania obrazu czcionki
- wywołać
GPR.T=odwroconaczcionka;
, spowoduje to zmianę czcionki na odwróconą
Aby zmienić czcionkę na standardową wywołujemy GPR.T=BASFont;
SDLGPrint(void*st,int m,int l,int X,int Y,Uint8 b);
edytujProcedura wyświetlania tekstu, która jest wywoływana przez inne komendy. Można jej używać bezpośrednio pamiętając o średniku na koncu. Obsługuje polskie litery diakrytyczne, może wyświetlać pojedyńczy napis lub tablicę napisów w kolejnych wierszach.
- st - tekst do wyświetlenia lub tablica napisów STRING[]
- m - maks. ilość liter do wypisana danego napisu, dla -1 brak ograniczenia
- l - maks. ilość wyświetlanych wierszy tablicy
- X - współrzędna X, po przekroczeniu której wypisywanie liter jest przerywane lub przechodzi do kolejnego wiersza
- Y - współrzędna Y, po przekroczeniu której wypisywanie liter jest przerywane
- b - !=0 - przerywanie, 0 - przechodzenie do kolejnego wiersza
GPrint(t)
edytujWywołuje procedurę SDLGPrint(t,STRLEN,1,WINDOWW,WINDOWH,0);
, która wyświetla na ekranie kolejne znaki tekstu t poczynając od pozycji "kursora" GPR.x,GPR.y i przesuwa kursor na koniec tekstu. Jeśli w napisie t napotka znak '\n' - przesuwa kursor na początek nowej linii.
GPrintAt(X,Y,t)
edytujJa powyżej, tylko najpierw przesuwa kursor do pozycji X,Y. Wykonuje {GPR.x=(X);GPR.y=(Y);SDLGPrint(t,STRLEN,1,WINDOWW,WINDOWH,0);}
GPrintn(t,n)
edytujJak GPrint, ale max n liter, wywołuje SDLGPrint(t,n,1,WINDOWW,WINDOWH,0);
GPrintnAt(X,Y,t,n)
edytujJak wyżej, poczynając od X,Y, wykonuje: {GPR.x=(X);GPR.y=(Y);SDLGPrint(t,n,1,WINDOWW,WINDOWH,0);}
GPr(D)
edytujWyświetla liczbę D. Wykonuje {snprintf(STRING$, STRLEN+1, "%.12lG", (double)D);SDLGPrint(STRING$,STRLEN,1,WINDOWW,WINDOWH,0);}
GPrn(D,N)
edytujWyświetla liczbę D ograniczoną do N znaków. Niezależnie od N ilość znaków ograniczona jest do 12. Wykonuje: {snprintf(STRING$, N+1, "%.12lG", (double)D);SDLGPrint(STRING$,STRLEN,1,WINDOWW,WINDOWH,0);}
GPrAt(X,Y,D)
edytujWyświetla liczbę D w pozycji X,Y. Wykonuje {GPR.x=(X);GPR.y=(Y);GPr(D)}
GPrnAt(X,Y,D,N)
edytujJak powyżej, ograniczone do N znaków. Wykonuje {GPR.x=(X);GPR.y=(Y);GPrn(D,N)}
GPrintF(F,...)
edytujOdpowiednik komendy C printf dla okna graficznego. Wykonuje {snprintf(STRING$, STRLEN+1, F,__VA_ARGS__);SDLGPrint(STRING$,STRLEN,1,WINDOWW,WINDOWH,0);}
GPrintFAt(X,Y,F,...)
edytujJak powyżej, ale wyświetla w pozycji X,Y. Wykonuje {GPR.x=(X);GPR.y=(Y);GPrintF(F,__VA_ARGS__)}
GPColorRGB(r,g,b)
edytujUstawia kolor tekstu dla GPrint podany w formacie RGB. Ponieważ czcionki są zwykłymi obrazami - zmiana koloru następuje poprzez modulację koloru wyświetlanego obrazu. Standardowo litery są w kolorze białym, tło jest w kolorze czarnym, który ma ustawioną pełną przeźroczystość alfa (właściwie brak nieprzeźroczystości, czyli alfa=0). Wywołuje SDL_SetTextureColorMod(GPR.T,r,g,b);
GPColor(c)
edytujJak powyżej, tylko kolor podawany jest jako pojedyńcza liczba. Wykonuje {ColorC.BAS=c;SDL_SetTextureColorMod(GPR.T,ColorC.SDL.r,ColorC.SDL.g,ColorC.SDL.b);}
SetFont(W,H)
edytujUstawia szerokość W i wysokość H czcionki. Wykonuje {GPR.w=W;GPR.h=H;}
Czcionki wektorowe
edytujDo obsługi czcionek wektorowych konieczna jest biblioteka SDL_ttf, domyślnie załączana w BasicSDL. Konwertuje ona czcionki tworzące napisy na obraz typu SDL_Surface i przypisuje do zmiennej SDLSurface, Basic zawiera funkcję konwertującą ten obraz na teksturę przypisaną do zmiennej SDLTexture i wyświetla na ekranie.
LoadFont(Font,FileN,Size)
edytujŁaduje czcionki z pliku FileN, ustala jej wielkość Size i przypisuje do zmiennej Font typu TTF_Font*. Wcześniej należy zadeklarować zmienną wskaźnikową, np.: TTF_Font *Font=NULL;
FontStyle(style)
edytujUstawia styl aktualnej czcionki. Możliwe wartości style: 1=TTF_STYLE_BOLD 2=TTF_STYLE_ITALIC 0=TTF_STYLE_NORMAL 4=TTF_STYLE_UNDERLINE
Text(X,Y,Txt,M)
edytujWyświetla napis Txt aktualną czcionką w pozycji X,Y w trybie M w kolorze zapisanym w zmiennej Color. Color można ustawić komendami Color, Colors, SDL_Color.
Tryby wyświetlania:
0 - Zwykły (solid), najszybszy. Litery na czarnym, przeźroczystym tle.
1 - Cieniowany (shaded). Tło jest w kolorze zapisanym w zmiennej ColorB, zmienną można ostawić komendami Colors, SDL_Color
2 - Mieszany (Blended). Włączone mieszanie kolorów alfa.
TextSize(txt,w,h)
edytujPodaje szerokość i wysokość tekstu txt dla aktualnej czcionki.
TextImg(Txt,T,M)
edytujTworzy obraz z napisu Txt w trybie M i przypisuje go zmiennej T typu SDL_Texture*. Zmienna musi być zadeklarowana.
Po każdej operacji tworzenia tekstu jego obraz znajduje się również w powierzchni SDLSurface.
Przykład (wymagany plik czcionki TTF):
#include "BasicSDL.h"
TTF_Font *Font;
STRING name;
int x,y,w,h;
SDL_Texture *tex;
SDL_Rect DSTt;
MAIN
x=Rand(-3,3);y=Rand(-3,3);w=Rand(1,4);h=Rand(-3,0);
Input$ (Name:,name)
SDLOpen(0)
LoadFont(Font,"zx81.ttf",32)
FontStyle(TTF_STYLE_ITALIC|TTF_STYLE_UNDERLINE)
SDL_Color(Color.SDL,255,122,0,255)
Text("BASIC C SDL",300,10,0)
CopyImg(SDLTexture,tex)
SDL_Color(Color.SDL,255,122,255,122)
SDL_Color(ColorB.SDL,111,122,255,122)
FontStyle(TTF_STYLE_NORMAL)
TextImg(name,SDLTexture,1)
DSTt.x=200;DSTt.y=100;
DSTt.w=20;DSTt.h=10;
Repeat
Cls
PutImg(tex,300,10)
if (DSTt.x>500) x=-x;
if (DSTt.x<0) x=-x;
if (DSTt.y>300) y=-y;
if (DSTt.y<0) y=-y;
if (DSTt.w>500) w=-w;
if (DSTt.w<0) w=-w;
if (DSTt.h>300) h=-h;
if (DSTt.h<0) h=-h;
DSTt.x+=x;DSTt.y+=y;DSTt.w+=w;DSTt.h+=h;
PutImgSize(SDLTexture,DSTt.x,DSTt.y,DSTt.w,DSTt.h)
ShowPage
GetEvents
Until (Quit)
SDLQuit
ENDMAIN