C++ e SDL

13 views
Skip to first unread message

NewWave (Fabiano Vasconcelos)

unread,
Feb 12, 2012, 12:04:13 PM2/12/12
to ccppb...@googlegroups.com
Olá, amigos!

Se possível, eu gostaria de uma explicação mais detalhada sobre o código:

 //Definimos as flags.
    int flags = SDL_SWSURFACE;
    if (fullscreen)
        flags = flags | SDL_FULLSCREEN;

Deu pra perceber que SDL_SWSUFACE é um inteiro, mas não deu pra entender porque esse inteiro está sendo atribuído a flags e porque estas flags estão sendo definidas.
O que faz exatamente a última linha?

Obrigado.

Extraído do tutorial do PontoV: http://www.pontov.com.br/site/opengl/139-criando-uma-janela-sdl

Wander Lairson Costa

unread,
Feb 12, 2012, 12:36:41 PM2/12/12
to ccppb...@googlegroups.com
Em 12 de fevereiro de 2012 15:04, NewWave (Fabiano Vasconcelos)
<fvasco...@gmail.com> escreveu:

> Olá, amigos!
>
> Se possível, eu gostaria de uma explicação mais detalhada sobre o código:
>
>  //Definimos as flags.
>     int flags = SDL_SWSURFACE;
>     if (fullscreen)
>         flags = flags | SDL_FULLSCREEN;
>
> Deu pra perceber que SDL_SWSUFACE é um inteiro, mas não deu pra entender
> porque esse inteiro está sendo atribuído a flags e porque estas flags estão
> sendo definidas.
> O que faz exatamente a última linha?
>

flags provavelmente será o último argumento da função SDL_SetVideoMode
[1], que é utilizada para configurar o vídeo. SDL_SWSURFACE indica que
o vídeo não utilizará aceleração por hardware.

fullscreen provavelmente é uma variável que indica se deve inicializar
em modo tela cheia. Se a variável for verdadeira, configura flags com
a opção SDL_FULLSCREEN.

O operador | faz um or binário. Assim, flags é configurada com
SDL_FULLSCREEN sem perder as configurações anteriores.

[1] http://sdl.beuc.net/sdl.wiki/SDL_SetVideoMode

--
Best Regards,
Wander Lairson Costa

Reuben Morais

unread,
Feb 12, 2012, 12:44:24 PM2/12/12
to ccppb...@googlegroups.com
Um inteiro está sendo utilizado para guardar bitflags, ou booleanos de 1 bit.
Se você procurar a definição das flags SDL_*, vai ver algo parecido com:

#define SDL_SWSURFACE (1<<0)
#define SDL_BLABLABLA (1<<1)
#define SDL_FULANO (1<<2)
#define SDL_FULLSCREEN (1<<3)

Então quando faz flag |= SDL_FULLSCREEN você está setando a flag
SDL_FULLSCREEN dentro do inteiro flags.
Para saber se uma flag está ativa ou não você pode fazer if (flag &
SDL_FULANO) …

Se você analisar as operações usadas para setar, apagar e ler flags
vai perceber que não é nada de outro mundo.

-- reuben

Lucas Nunes

unread,
Feb 12, 2012, 12:45:03 PM2/12/12
to ccppb...@googlegroups.com
Antes de mais nada, um flag funciona como bool mas são definidos nos bits de um int,
logo, vc pode definir 8 flags em um char (pois tem 8bits):
0000 0000 -> 0x0
0000 0001 -> um flag 
0000 0011 -> 2 flags

Normalmente, vc apenas define os flags, o API cuida de interpretá-los.

---

// Declara flags, que recebe o valor de SDL_SWSURFACE (que provavelmente é um macro)
// O  SDL_SWSURFACE deve vir de algum #define SDL_SWSURFACE ALGUMACOISA 
// Mas, vamos supor que   SDL_SWSURFACE vale 2, então o SDL declarou algo do tipo:

//  #define SDL_SWSURFACE 2 ou 0x02 (em hexadecimal)
// Seria então 0000 00010 (em binário)

int flags = SDL_SWSURFACE; // Nesse caso, flags = 2

// Verifica se é para abrir a janela em tecla cheia, se for, deve-se ativar o flag de tela cheia
if (fullscreen)
flags = flags | SDL_FULLSCREEN;

// No trecho acima, vc deve acionar um flag sem apagar os que já estão armazenados.
// Por isso usam o operador lógico OU.
// Supondo que  SDL_FULLSCREEN seja definido como 4 (0000 00100) e aplicando um OU com 2
// vc define os 2 flags sem problemas:
// (0000 0010) | (0000 0100) =  (0000 0110)

Você não precisa se preocupar com o que o SDL faz com as flags (a menos que queira estudar o código do SDL),
apenas para que eles servem.

No caso, depois que vc passa os valores dos flags pro SDL_SetVideoMode, ele interpreta quais flags estão ativos e faz a mágica.
Para verificar se está ativo e só usar um E lógico:

if(flags &  SDL_FULLSCREEN ==  SDL_FULLSCREEN) // verifica se  SDL_FULLSCREEN está ativo

Isso em binário (com os valores que eu disse seria):
(0000 0000) & (0000 0100) = 0000 0000 ----> resulta em false
(0000 0100) & (0000 0100) = 0000 0000 ----> resulta em true

---

Espero ter ajudado.

--
Antes de enviar um e-mail para o grupo leia:
http://www.ccppbrasil.org/wiki/Lista:AntesdePerguntar
--~--~---------~--~----~---------------------------------~----------~--~----~
[&] Colabore com a Pesquisa de Preferência de Conteúdo
para Eventos do Grupo C & C++ Brasil:
http://www.surveymonkey.com/s/GBBGTXN
------~----~-------~---~---~---~---~----------------~------------~---------~
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
Para mais opções, visite http://groups.google.com/group/ccppbrasil
--~--~---------~--~----~--~-~--~---~----~-----------------~--~----------~
Emprego & carreira: vag...@ccppbrasil.org
http://groups.google.com/group/dev-guys?hl=en

NewWave (Fabiano Vasconcelos)

unread,
Feb 12, 2012, 1:19:17 PM2/12/12
to ccppb...@googlegroups.com
Brilhantes explicações! Muito boas! As 3!
Obrigado pela ajuda!
Se ainda vier alguma dúvida sobre o tema eu reabro a thread.
Have a nice sunday! :D
Reply all
Reply to author
Forward
0 new messages