BasicC/Tekst

 BasicC obsługuje czcionki wektorowe za pośrednictwem biblioteki SDL_ttf oraz własne, proste czcionki bitmapowe.

Czcionki bitmapoweEdytuj

Wzó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);Edytuj

Procedura 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)Edytuj

Wywoł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)Edytuj

Ja 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)Edytuj

Jak GPrint, ale max n liter, wywołuje SDLGPrint(t,n,1,WINDOWW,WINDOWH,0);

GPrintnAt(X,Y,t,n)Edytuj

Jak wyżej, poczynając od X,Y, wykonuje: {GPR.x=(X);GPR.y=(Y);SDLGPrint(t,n,1,WINDOWW,WINDOWH,0);}

GPr(D)Edytuj

Wyświetla liczbę D. Wykonuje {snprintf(STRING$, STRLEN+1, "%.12lG", (double)D);SDLGPrint(STRING$,STRLEN,1,WINDOWW,WINDOWH,0);}

GPrn(D,N)Edytuj

Wyś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)Edytuj

Wyświetla liczbę D w pozycji X,Y. Wykonuje {GPR.x=(X);GPR.y=(Y);GPr(D)}

GPrnAt(X,Y,D,N)Edytuj

Jak powyżej, ograniczone do N znaków. Wykonuje {GPR.x=(X);GPR.y=(Y);GPrn(D,N)}

GPrintF(F,...)Edytuj

Odpowiednik 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,...)Edytuj

Jak powyżej, ale wyświetla w pozycji X,Y. Wykonuje {GPR.x=(X);GPR.y=(Y);GPrintF(F,__VA_ARGS__)}

GPColorRGB(r,g,b)Edytuj

Ustawia 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)Edytuj

Jak 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)Edytuj

Ustawia szerokość W i wysokość H czcionki. Wykonuje {GPR.w=W;GPR.h=H;}

Czcionki wektoroweEdytuj

Do 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)Edytuj

Ustawia 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)Edytuj

Wyś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)Edytuj

Podaje szerokość i wysokość tekstu txt dla aktualnej czcionki.

TextImg(Txt,T,M)Edytuj

Tworzy 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