* 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(#;
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(#;
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(#;