Você está na página 1de 5

CRIANDO A TELA

* Como criar uma tela em SDL;


* Os vrios formatos de telas;
* Como adicionar ttulo s !anelas ;
Criando uma Tela
O comando "ue cria uma tela em SDL # SDL$Set%ideo&ode' Na verdade uma tela nada mais # "ue
uma surface( assim como as ima)ens utili*adas nos +ro)ramas' Surfaces s,o as unidades +rimitivas
de "ual"uer a+lica-,o )rfica em SDL( +ois as mesmas s,o .uffers de ima)ens( isso #( reas da
mem/ria utili*adas +ara arma*enar ima)ens'
Assim( antes de confi)urar a tela temos "ue criar uma surface e de+ois a+licar so.re ela o comando
SDL$Set%ideo&ode +ara confi)ura-,o da tela' %e!a o e0em+lo a.ai0o'
E0em+lo 1
C/di)o2
#include <SDL/SDL.h>

SDL_Surface* tela = NULL;

int main (int argc, char *arg!"#
$
SDL_%nit (SDL_%N%&_'%D()#;
tela = SDL_Set'ide*+*de(,--,.--,./,SDL_S0SU1234(#;

SDL_Dela5(.---#;

SDL_6uit(#;
return -;
7
A lin3a a.ai0o declara uma surface de nome tela e d a mesma o valor nullo' %e!a "ue tela
ser uma inst4ncia da estrutura SDL$Surface "ue # o +rot/ti+o +ara surfaces( uma struct'
C/di)o2
SDL_Surface* tela = NULL;
5ara tra.al3ar com ima)ens e necessrio iniciar o su.sistema de vdeo'
C/di)o2
SDL_%nit (SDL_%N%&_'%D()#;
A)ora sim +odemos confi)urar o modo de vdeo com o comando SDL$Set%ideo&ode' Os
dois +rimeiros +ar4metros 677( 877 s,o as dimens9es da tela' O +ar4metro 8: se refere a
"uantidade de .its +or +i0el e o ;ltimo +ar4metro # a fla) do ti+o da surface' Nesse caso
estamos definindo uma surface do ti+o S<( o "ue si)nifica "ue estamos criando um .uffer na
rea +rinci+al da mem/ria( a mem/ria ram' A si)la s= vem de soft=are( isso #( n,o #
acelerado +or 3ard=are e assim n,o usar a mem/ria de vdeo'
C/di)o2
tela = SDL_Set'ide*+*de(,--,.--,./,SDL_S0SU1234(#;
A lin3a a.ai0o fa* com "ue o +ro)rama a)uarde 8 se)undos at# continuar a e0ecutar' Se n,o
fi*#ssemos isso n,o seria +ossvel visuali*ar a tela criada( +ois o +ro)rama e0ecutaria muito
r+ido' O valor +assado foi 8'777( devido o fato de "ue o tem+o deve estar em mil#simos de
se)undos'
C/di)o2
SDL_Dela5(.---#;
Os vrios formatos de telas
A SDL # de fato uma .i.lioteca muito +oderosa e verstil( dando ao usurio in;meras
+ossi.ilidades de confi)ura-9es' Isso tam.#m # verdade na 3ora de criar seu am.iente de
re+rodu-,o de ima)ens( onde voc> +ode escol3er uma das diversas formas de tra.al3ar com
ela' %e!a a.ai0o a ta.ela dos vrios ti+os de fla)s +ara a cria-,o de surfaces de vdeo e o "ue
si)nifica a si)la de cada uma delas'
SDL$S<S?R@ACE2 a surface ser criada na mem/ria ram'
SDL$A<S?R@ACE2 a surface ser criada na mem/ria de vdeo'
SDL$ASBNCCLIT2 usa m#todo de .lita)em assncrono'
SDL$ANB@OR&AT2 usa o +adr,o atual da tela'
SDL$A<5ALETTE2 usa todas as :DE cores da +aleta'
SDL$DO?CLEC?@2 usar du+lo .uffer Fcom+osi-,o e e0i.i-,oG'
SDL$@?LLSCREEN2 a+lica-,o deve rodar em tela c3eia'
SDL$O5ENHL2 usa SDL com O+enHL'
SDL$O5ENHLCLIT2 usa SDL com O+enHL mas vai renderi*ar com SDL'
SDL$RESIIACLE2 uma !anela redimensionvel'
SDL$NO@RA&E2 !anela sem .ordas'
Adi cionando ttulos s !anelas
Os ca+tions s,o as le)endas de ttulos das .ordas das !anelas' 5odemos colocar ttulos nas
!anelas de a+lica-9es sdl +or meio do comando SDL$<&$SetCa+tion' 5ara isso .asta +assar
a esse comando a mensa)em "ue dese!amos "ue se!a e0i.ida( entre as+as'
E0em+lo :
C/di)o2
#include <SDL/SDL.h>

SDL_Surface *tela = NULL;

int main (int argc, char *arg!"#
$
SDL_%nit (SDL_%N%&_('(18&9%N:#;
tela = SDL_Set'ide*+*de (;,-, ,<-, =;, SDL_S0SU1234(#;

SDL_0+_Set4a>ti*n (?4r@tic,L_S)2& 1)D3ND)...?, NULL#;

SDL_Dela5(.---#;
SDL_6uit(#;

return -;
7
A lin3a a.ai0o # a res+onsvel +ela e0i.i-,o do ttulo da !anela'
C/di)o2
SDL_0+_Set4a>ti*n (?4r@tic,L_S)2& 1)D3ND)...?, NULL#;
Carre)ando e E0i.indo Ima)ens
* Como carre)ar uma ima)em;
* Como e0i.ir ima)ens usando a SDL;
* E0i.ir ima)ens com o taman3o correto;
1' Carre)ando e e0i.indo ima)ens
A SDL carre)a ar"uivos do ti+o '.m+' &as se voc> +recisar carre)ar outro ti+o de ima)ens(
+oder fa*er isso ao incluir a .i.lioteca au0iliar SDL$Ima)e ao seu +ro!eto' A ima)em
carre)ada dever ser alocada em uma surface( um .uffer de ima)em( +or isso o +rimeiro
+asso # declarar uma surface +ara a ima)em'
C/di)o2
SDL_Surface* imagem = NULL;
Se estamos tra.al3ando com ima)ens( o.ri)atoriamente teremos "ue iniciali*ar o su.sistema
de ima)ens +ara "ue os comandos de mani+ula-,o das mesmas fi"uem dis+onveis'
C/di)o2
SDL_%nit (SDL_%N%&_'%D()#;
@eito isso( ! +odemos carre)ar uma ima)em +or meio da fun-,o SDL$LoadC&5' 5ara isso
+assamos como +ar4metro uma strin) com nome ou locali*a-,o e nome do ar"uivo .itma+ a
ser carre)ado'
C/di)o2
imagem = SDL_L*adA+B(?2*t*.Cm>?#;
?ma coisa im+ortante a considerar # "ue voc> n,o sa.e +reviamente "ual # +rofundidade de
cor da ima)em carre)ada e e0i.ir uma ima)em com +aleta diferente da +aleta de cor da tela
vai desfi)ura a mesma' 5ara resolver esse +ro.lema( voc> +ode usar a fun-,o
SDL$Dis+laJ@ormat( "ue vai converter a ima)em +ara o formato de cores da tela'
C/di)o2
imagem = SDL_DiD>la52*rmat(imagem#;
A)ora ! +odemos e0i.ir a ima)em' 5ara isso vamos fa*er uma Clita)em FClittin)G' O termo
Clit # uma forma contrada de KClocL TransferM( ent,o( fa*er uma .lita)em # transferir um
.loco de +i0els de um .uffer +ara outro' No nosso caso( estamos transferindo um .loco de
+i0els do .uffer da ima)em +ara o .uffer da tela'
5ara fa*er uma .lita)em +recisamos de duas surfaces e de dois ret4n)ulos como +ar4metros(
mas os ret4n)ulos +odem ser definidos como N?LL( e assim usaremos o +ar4metro +adr,o
"ue # +osi-,o 7(7 e taman3o total da surface'
Dessa forma( o comando SDL$ClitSurface aceita +or ordem os se)uintes +ar4metros2 surface
recurso( ret4n)ulo recurso( surface destino e ret4n)ulo destino' No nosso e0em+lo estamos
fa*endo a .lita)em da ima)em na tela( +or isso Kima)emM # a surface recurso e KtelaM # a
surface destino' Estamos definindo os ret4n)ulos como Null( assim a ima)em vai ser toda
e0i.ida a +artir do canto su+erior es"uerdo da tela'
C/di)o2
SDL_AlitSurface(imagem, NULL, tela, NULL#;
Como voc> ! sa.e( +ara "ue +ossamos ver os efeitos de renderi*a-,o( temos "ue atuali*ar a
surface' Na +rimeira lin3a a.ai0o # e0atamente isso "ue fa*emos e na se)unda lin3a( fa*emos
o +ro)rama a)uardar tr>s se)undos antes de ser encerrado'
C/di)o2
SDL_U>date1ect(tela, -, -, -, -#;
SDL_Dela5(.---#;
5ara evitar "ual"uer +ro.lema com )erenciamento de mem/ria( descarre)ue as surfaces de
ima)ens "uando n,o mais forem usadas +or meio do comando SDL$@reeSurface'
C/di)o2
SDL_2reeSurface(imagem#;
%e!a a.ai0o como ficou o c/di)o fonte com+leto se nosso e0em+lo de carre)ar e e0i.ir
ima)ens a +artir de ar"uivos'
E0em+lo 1
C/di)o2
#include <SDL/SDL.h>

SDL_Surface* imagem = NULL;
SDL_Surface* tela = NULL;
int main (int argc, char *arg!"#
$
SDL_%nit (SDL_%N%&_'%D()#;
tela = SDL_Set'ide*+*de(;--,,--,./,SDL_S0SU1234(#;

imagem = SDL_L*adA+B(?2*t*.Cm>?#;
imagem = SDL_DiD>la52*rmat(imagem#;

SDL_AlitSurface(imagem, NULL, tela, NULL#;

SDL_U>date1ect(tela, -, -, -, -#;
SDL_Dela5(.---#;

SDL_2reeSurface(imagem#;
SDL_6uit(#;

return -;
7
:' Clit ando surfaces com o taman3o correto
O +ro)rama acima +rocessa dados de forma desnecessria( +ois considera a rea total das
surfaces' Em al)uns +ro)ramas( como veremos mais adiante( usamos a+enas uma +arte de um
surface sendo desnecessrio +rocessar o resto' 5or outro lado( o +ro)rama acima tam.#m
+eca +elo fato de n,o +odermos escol3er em "ue local da surface de destino a surface de
ori)em ser .litada'
5odemos resolver os dois +ro.lemas tra.al3ando com ret4n)ulos' Devemos definir um
ret4n)ulo +ara a ima)em recurso( e assim es+ecificar "ual +arte dela nos interessa' Tam.#m
+odemos definir um ret4n)ulo +ara a ima)em de destino e assim controlar em "ual local da
ima)em de destino a"uela ima)em ser .litada e at# mesmo "uais +artes dessa ima)em ser,o
.litadas'
O e0em+lo a.ai0o # uma ada+ta-,o do e0em+lo anterior( mas a)ora usando ret4n)ulos +ara
controlar as reas das surfaces e seu local de e0i.i-,o' %e!a "ue a +rimeira coisa "ue fi*emos
foi declarar dois ret4n)ulos'
C/di)o2
SDL_1ect 1_1ecurD*;
SDL_1ect 1_DeDtin*;
O +asso se)uinte foi definir a lar)ura e a altura desses ret4n)ulos como sendo id>nticas s
dimens9es da ima)em carre)ada' Isso cria um ret4n)ulo com o taman3o e0ato de +i0els "ue
ser,o .litados( isso #( transferidos de uma surface +ara outra'
C/di)o2
1_1ecurD*.E = 1_DeDtin*.E = imagemF>E;
1_1ecurD*.h = 1_DeDtin*.h = imagemF>h;
A +osi-,o 0 e J da ima)em de recurso # F7(7G( +ois vamos usar a ima)em inteira e assim
temos "ue +e)ar os +i0els a +artir do incio da ima)em' Lem.rando "ue essa # a surface de
ori)em( isso #( de onde os +i0els ser,o co+iados +ara serem transferidos +ara outra rea'
C/di)o2
1_1ecurD*.G = -;
1_1ecurD*.5 = -;
Como dese!amos e0i.ir a ima)em no centro da tela( as +osi-9es 0 e J do ret4n)ulo de destino
s,o confi)uradas como F167(:7G( +ois esse # o +onto inicial onde os +i0els ser,o .litados'
C/di)o2
1_DeDtin*.G = =,-;
1_DeDtin*.5 = /-;
A)ora "ue ! temos tudo definido nos ret4n)ulos ent,o +odemos fa*er a .lita)em +assando ao
comando o endere-o dos ret4n)ulos "ue definem a forma como essa .lita)em das ima)ens vai
ocorrer'
C/di)o2
SDL_AlitSurface(imagem, H1_1ecurD*, tela, H1_DeDtin*#;
A)ora ve!a a.ai0o o c/di)o com+leto do +ro)rama "ue nos mostra como fa*er um controle
total da .lita)em de ima)ens'
E0em+lo:
C/di)o2
#include <SDL/SDL.h>

SDL_Surface* imagem = NULL;
SDL_Surface* tela = NULL;

int main (int argc, char *arg!"#
$
SDL_%nit (SDL_%N%&_'%D()#;
tela = SDL_Set'ide*+*de(;--,,--,./,SDL_S0SU1234(#;

imagem = SDL_L*adA+B(?2*t*.Cm>?#;
imagem = SDL_DiD>la52*rmat(imagem#;

SDL_1ect 1_1ecurD*;
SDL_1ect 1_DeDtin*;
1_1ecurD*.E = 1_DeDtin*.E = imagemF>E;
1_1ecurD*.h = 1_DeDtin*.h = imagemF>h;
1_1ecurD*.G = -;
1_1ecurD*.5 = -;
1_DeDtin*.G = =,-;
1_DeDtin*.5 = /-;

SDL_AlitSurface(imagem, H1_1ecurD*, tela, H1_DeDtin*#;

SDL_U>date1ect(tela, -, -, -, -#;
SDL_Dela5(.---#;

SDL_2reeSurface(imagem#;
SDL_6uit(#;

return -;
7

Você também pode gostar