Sunteți pe pagina 1din 17

Grafic n C/C++ cu ajutorul bibliotecii SDL

Budaca Eduard

De ce eu?

Sunt un elev in clasa a X-a. Am realizat un joc ntre

aprilie 2012 i ianuarie 2013 folosind SDL,

EnderRUN. A durat 5-6 luni de munc susinut.

Ce este SDL?

SDL = Simple DirectMedia Layer O bibliotec C/C++ Se ocup de:


Funcioneaz pe Windows, Linux, Mac, (!)Android i multe altele (20+) Se poate folosi cu C, C++, C#, Java, Pascal, PHP, Python, Ruby i, iari, multe altele (25+) Este foarte rapid. Se extinde cu biblioteci adiionale.

grafic 2D, inclusiv transparen grafic 3D prin OpenGL audio acces la tastatur acces la mouse acces la joystick-uri

Ce NU este / NU poate face SDL


Nu este un alt limbaj de programare. Nu este o aplicaie de tip IDE. Nu este un compilator. Nu este un motor de jocuri. Tot trebuie s scriei cod ca s folosi SDL. Grafica 3D nu este tocmai simpl. Nu va ncrca dect formatul .bmp. Nu poate afia text. Partea audio este destul de dificil de folosit. Curba de nvare poate fi destul de abrupt. Din fericire, pentru unele din aceste dezavantaje, exist biblioteci adiionale.

Instalarea bibliotecii
1. 2.

3.
1. 2. 3.

Descrcarea bibliotecii (versiunea mingw32) Dezarhivarea folder-elor /include i /lib n /sdk n Code::Blocks:

4.

Copierea fiierelor .dll lng executabilele proiectului i n directorul proiectului. Tot aa putei proceda la instalarea majoritatii bibliotecilor n Code::Blocks.

La Build Options-Search Directories-Compiler adugm directorul include; La Build Options-Search Directories-Linker adugm directorul lib; Sub Linker Settings adugm bibliotecile SDL la opiunile linker-ului. (-lmingw32 -lSDLmain lSDL)

Programarea cu SDL

Exemplu de program folosind SDL


#include "SDL/SDL.h" //Header-ul SDL int main (int argc, char* args[]){//NEAPARAT asa. SDL_Init(SDL_INIT_EVERYTHING); //Initializam SDL-ul SDL_SetVideoMode(800, 600, 32, SDL_FULLSCREEN); //initializam o fereastra 800x600x32bpp, fullscreen //Lucru cu SDL aici... SDL_Delay(2000); //Va astepta 2 secunde inainte sa inchida programul SDL_Quit(); //inchidem SDL-ul return 0; }
Not: Nu am folosit diacritice pe aceste slide-uri deoarece diacriticele nu fac parte din codul ASCII i doresc ca aceast bucat de cod s poat fi copiat i lipit ntr-un cod surs fr probleme.

Cum se folosete SDL

n primul rnd, fiecare proiect trebuie s aib urmtoarea linie de cod inclus:

Pentru proiecte mici (1-3 fiiere surs), se poate pune aceast linie la nceputul fiecrui fiier .c/.cpp. Pentru proiecte mai mari:

#include "SDL/SDL.h"

se recomand folosirea unui header (fiier .h care conine declaraiile funciilor) inclus (prin intermediul directivei #include). se recomand crearea unui fiier surs care s conin mai multe funcii destinate s fac lucrul cu SDL mai uor.

Funcii utile n sdlwork.cpp


1.

init_sdl();

2.

close_sdl();

Va fi apelat la nceputul fiecrui program. Va iniializa SDL-ul, fereastra grafic i extensiile. Va fi apelat nainte de nchierea fiecrui program. Va nchide SDL-ul, va nchide extensiile i va elibera suprafeele folosite. Aceast funcie va ncrca o imagine dintr-un fiier.

3.

load_image();

4.

blit_surface ();

Scopul acestei funcii este de a simplifica procesul de lipire a unei suprafee pe alta (de exemplu pe ecran).

Evenimente n SDL

Evenimentele sunt informaii despre orice se ntmpl trimise programului. Evenimentele includ:

Apsarea sau eliberarea unei taste Micarea mouse-ului sau un click nchiderea ferestrei Activarea ferestrei Redimensionarea ferestrei

Avantaje i dezavantaje a evenimentelor


Avantaje

Dezavantaje

Sunt simplu de folosit Pot fi mai rapide Pot fi folosite ntr-o larg varietate de situaii Unele tipuri de evenimente (la nchiderea ferestrei, de exemplu) ar fi extrem de greu de reprezentat altfel.

Cele mai mari dezavantaje apar la evenimente de tip press and hold la tastatur sau mouse. Evenimentele sunt de dou tipuri: press i release Exemple de simptome:

Juctorul se mic doar o dat, la apsarea tastei, chiar dac tasta rmne apsat Tastele pot fi apsate i programul s nu ia comanda.

Keystates i Mousestates

Datorit dificultilor generate de folosirea evenimentelor, n SDL se pot folosi i keystates sau mousestates. Practic, cu un apel se poate verifica starea oricrei taste sau buton de mouse, oricnd programatorul are nevoie (nu doar la apsarea sau eliberarea unei taste/buton). Tot cu un singur apel se poate citi poziia cursorului.

Alpha Blending

Alpha blending este alt proces, mai avansat, de obinere a transparenei. Se mparte n 2 tipuri (alpha = nivel de transparen):
1. 2.

Aceste tipuri nu se pot combina. n general, transparena per-pixel va fi dominant. Nivelul de transparen poate fi ntre 0 i 255 (0 fiind SDL_ALPHA_TRANSPARENT i 255 fiind SDL_ALPHA_OPAQUE. La citirea unei imagini de tip .png cu sdl_image, transparena imaginii este pstrat, devenind per-pixel alpha.

Per-surface alpha, adic un nivel de transparen setat pentru toat suprafaa Per-pixel alpha, adic fiecare pixel va avea propriul nivel de transparen. (RGBA)

Alpha 255

Alpha 120

Alpha 0

Folosirea sistemului de alpha blending

De cele mai multe ori, SDL se ocup automat de alpha blending. O imagine cu transparen ncrcat cu sdl_image va avea transparen n program fr ca programatorul s aib cod de scris n plus. Totui, n funcia load_image() trebuie folosit

SDL_DisplayFormatAlpha() i nu SDL_DisplayFormat().

Cum se afieaz o imagine n SDL


1. 2.

3.
4. 5.

Se iniializeaz SDL i se creeaz fereastra (tot o suprafa, de exemplu screen). Se ncarc imaginea ntr-o suprafa, de exemplu img. Se deschide o bucl while(1). Se terge ecranul cu (de exemplu)
SDL_FillRect(screen, &screen->clip_rect, SDL_MapRGB(screen->format, 0, 0, 0));

6.

7.

Cu funcia blit_surface(), se aplic suprafaa cu imaginea peste suprafaa ecranului. (de exemplu blit_surface(img, screen, 0, 0, NULL); (!) Se apeleaz SDL_Flip() (de exemplu SDL_Flip(screen);). Acest lucru previne plpirea (flickering) a ecranului, programatorul aplicnd suprafeele n zona tampon care nu este afiat. La apelul funciei SDL_Flip(), zonele sunt inversate (swapped sau flipped) i ceea ce s-a aplicat poate fi vzut pe ecran. Se verific dac se d Alt+F4 sau dac cere nchiderea programului.

Informaii n plus

http://www.libsdl.org/, site-ul oficial SDL http://www.libsdl.org/cgi/docwiki.fcg, hub al documentaiei http://www.libsdl.org/cgi/docwiki.fcg/SDL_API, lista de funcii ale SDL-ului. http://lazyfoo.net/SDL_tutorials/index.php, un site foarte bun de tutoriale SDL.

La treab!
Remember to explore and experiment!

S-ar putea să vă placă și