|
Antes de entrarmos no código usando a SDL, vamos entender um pouco de seus conceitos. A SDL (Simple Directmedia Layer) é uma biblioteca multiplataforma criada para facilitar a construção de aplicações envolvendo multimídia. A biblioteca é formada de diversos subsistemas, que fornecem serviços para manipulação de vídeo, imagens, eventos, temporização, threads e sockets. Nesse artigo, vamos ver como criar uma janela, onde nosso jogo irá rodar.
Subsistemas da SDL
Antes de irmos para o código da janela, vamos detalhar cada um dos subsistemas oferecidos pela SDL:
- Inicialização e finalização: É normal que questionemos o sistema operacional a respeito dos recursos que temos disponíveis para nossos jogos. A SDL simplifica esse processo ao fornecer uma rotina chamada SDL_Init, capaz de inicializar cada módulo específico a ser utilizado. Ela mesmo pergunta ao sistema operacional se os recursos necessários estão ou não disponíveis e nos retorna um código de erro simples de ser tratado;
- Manipulação do vídeo: A SDL permite que trabalhemos numa janela pixel-a-pixel ou utilizando OpenGL. Este blog trabalhará com a segunda opção. Ela fornece uma maneira fácil e multiplataforma de criarmos a janela do jogo, ou iniciarmos o modo fullscreen. Também facilita a integração com o hardware;
- Manipulação de imagens: A SDL fornece mecanismos para carregar imagens e manipula-las pixel-a-pixel. O formato suportado nativamente é o .bmp, mas com a biblioteca SDL_Image também podemos carregar a maior parte dos formatos padrão, incluindo .jpg, .gif e .png, com ou sem canal alpha;
- Mecanismo de eventos: A SDL fornece um mecanismo de eventos simples para tratar diversas formas de entrada do usuário: isso inclui: eventos na janela, ou movimentação com mouse, teclado e joystick;
- Efeitos sonoros: Um de seus subsistemas fornece módulos para trabalhar com sons nos formados .mid, .mod e .wav. Adicionalmente a SDL_Mixer ainda suporta diversos outros formatos, incluindo .mp3 e .ogg;
- Temporização: A temporização é essencial em qualquer aplicação multimídia. Com ela conseguimos criar jogos que rodem na mesma velocidade, seja em computadores lentos ou mais rápidos.
- Acesso a redes: A SDL permite a inicialização e o uso de sockets de maneira simples, facilitando a criação de jogos em rede através do pacote adicional SDL_Net;
- Multi-threading: Permite disparar múltiplas linhas de execução e criar blocos de sincronização de maneira multiplataforma.
O main
Para construir uma aplicação de janelas é necessário criar um bloco main dependente do ambiente escolhido. No caso do windows, criaríamos o WinMain da seguinte forma:
int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow)Usando a SDL não precisamos nos preocupar com isso. Ela é quem toma conta de fazer as chamadas específicas. Então, para nós, resta apenas a tarefa de declarar um main padrão, com o seguinte formato:
int main(int argc, char* argv[])
Embora o C++ forneça outras alternativas para a assinatura do main, essa forma é obrigatória para se usar a SDL. Se você realmente precisar usar o WinMain, consulte o arquivo /src/main/win32/SDL_main.c para ver como a SDL deve ser inicializada. Isso é um tema avançado e, para os exemplos desse portal, isso não será necessário.
Inicialização e finalização
Cada módulo da SDL deve ser inicializado com o comando SDL_Init antes que possa ser utilizado. O comando recebe um argumento inteiro, que é composto utilizando o operador OU binário | com as seguintes flags:
- SDL_INIT_VIDEO: Inicializa o subsistema de vídeo;
- SDL_INIT_TIMER: Inicializa o subsistema de temporização;
- SDL_INIT_AUDIO: Inicializa o subsistema de som;
- SDL_INIT_JOYSTICK: Inicializa o subsistema de joystick;
- SDL_INIT_CDROM: Inicializa o subsistema de cdrom;
A sdl ainda possui os seguintes flags especiais:
- SDL_INIT_EVERYTHING: Uma maneira rápida de inicializar todos os subsistemas acima.
- SDL_INIT_NOPARACHUTE: A inicialização “sem paraquedas” faz com que a SDL ignore todas as mensagens de erros críticos do sistema. Embora seja curioso, não utilizaremos esse flag.
- SDL_INIT_EVENTTHREAD: Não documentado. Também não é necessário utiliza-lo.
Tipicamente, um jogo grande irá fazer a inicialização com SDL_INIT_EVERYTHING. Para os primeiros exemplos, podemos inicializar os subsistemas apenas de timer e vídeo, como no exemplo abaixo:
SDL_Init(SDL_INIT_TIMER | SDL_INIT_VIDEO);
Os módulos são finalizados através da função SDL_Quit. Você pode simplificar o seu código e colocar a SDL_Quit como parâmetro na função atexit(), assim ela será chamada sempre que o comando exit for dado. A declaração fica assim:
atexit(SDL_Quit);
Abrindo uma janela com a SDL
Uma vez que o módulo de vídeo está no ar, o próximo passo é definir qual é o modo de vídeo que utilizaremos para a aplicação. A função que permite que façamos isso é a SDL_SetVideoMode e seus parâmetros são: largura, altura, número de bits por pixel (também chamado de bpp ou depth) e, novamente, um inteiro com flags. As mais importantes e comumente usadas são:
- SDL_SWSURFACE: Indica que queremos criar uma janela que não dependa de hardware de aceleração de vídeo;
- SDL_HWSURFACE: Indica que precisamos de uma janela com aceleração de vídeo. Essa flag pode ser passada em conjunto com a anterior para suportarmos os dois modos;
- SDL_ANYFORMAT: Quando o número de bits-por-pixel não é suportado, a SDL tenta emula-lo. Passando essa flag, você informa a SDL que você não se incomoda se ela simplesmente usar o número suportado no lugar;
- SDL_DOUBLEBUF: Ativa o double-buffering e page-flipping. Esse recurso só estará completamente disponível se a SDL estiver usando uma superfície de hardware, criada ao passar também a flag SDL_HWSURFACE. Caso contrário, a SDL não fará o page-flipping.
- SDL_NOFRAME: Retira a decoração da tela (barra de título, botões, etc).
- SDL_FULLSCREEN: Inicializa em tela cheia. A altura e largura passadas nos parâmetros anteriores se referirão a resolução da tela. Se a resolução não puder ser atingida, a SDL utilizará uma resolução menor mais próxima da desejada, mas a janela ficará centralizada numa tela preta. Essa flag ativa automaticamente a SDL_NOFRAME;
- SDL_OPENGL: Inicializa a janela com OpenGL;
A função SDL_SetVideoMode retorna um ponteiro para a superfície de desenho da tela, do tipo SDL_Surface. Na SDL, qualquer elemento que possa ser desenhado ou receber desenhos é chamado de superfície (surface).
Que tal colocar tudo isso junto num único programa?
#include "SDL.h"
#include <stdexcept>
#include <iostream>
SDL_Surface* window;
void setup(int width, int height, int bpp, bool fullscreen)
{
//Inicializamos o subsistema de video.
if (SDL_Init(SDL_INIT_VIDEO) < 0)
throw std::runtime_error(SDL_GetError());
//Definimos as flags.
int flags = SDL_SWSURFACE;
if (fullscreen)
flags = flags | SDL_FULLSCREEN;
//Tentamos criar a janela
window = SDL_SetVideoMode(width, height, bpp, flags);
//Sem sucesso? Lançamos uma exceção com o erro.
if (window == NULL)
throw std::runtime_error(SDL_GetError());
//Configuramos a função de finalização da SDL
atexit (SDL_Quit);
}
/** Espera o usuário pressionar o x da janela. */
void processEvents()
{
SDL_Event event;
while (SDL_PollEvent(&event) != 0)
{
switch (event.type)
{
case SDL_QUIT:
exit(0); //Fechamos a apliação
break;
}
}
}
int main(int argc,char* argv[])
{
try
{
setup(640, 480, 8, false); //Faz a mágica acontecer
while (true)
processEvents();
}
catch (std::exception &e)
{
std::cout << "Error: " << e.what();
exit(1);
}
}
Rodando esse exemplo, você deve ver uma janelinha abrindo na tela. Não se preocupe com o processamento de eventos por enquanto. Ele foi usado aqui apenas para que você conseguisse ver a janela (caso contrário, ela fecharia logo que abrisse). No próximo artigo, configurar a janela para uso com OpenGL. No futuro, organizaremos tudo numa classe, para reutilizarmos em qualquer jogo que quisermos.
Veja também
- O artigo SDL – A biblioteca dos jogos 2D, do Portal Cpp;
- Os frameworks brasileiros Wintermoon e Easy2D;
- E o primeiro capítulo do livro SDL Passo-a-Passo, por Maurilio Guedes (BillGuedes)
-
31/03/2010 23:48:12 | Vinícius Godoy de Mendonça - SDL

Putz, a idéia é seguir com OpenGL a partir daqui.
Mas procure dar uma olhada no artigo do Paulo chamado [url=http://www.pontov.com.br/site/index.php?option=com_content&view=a rticle&id=113:animacao-baseada-em-tempo&catid=51:programacao&Itemid=65 ]Animação Baseada em Tempo[/url].
Vai te ajudar bastante.

-
27/09/2010 15:32:04 |201.22.222.xxx| Lucas Gerhard - Muito bacana

Buenas,
Muito bacana esse artigo, conseguiu ser direto e didático. Estou começando estudos sobre openGL. Pena que não consegui fazer funcionar utilizando DevC++ (windows), espero ter mais sorte no Linux hoje a noite.
Parabéns pelo artigo...
-
27/09/2010 12:44:12 | Vinícius Godoy de Mendonça

Sorte sua não ter conseguido fazer funcionar no DevCpp. É uma IDE antiga, ultrapassada.
Por isso faço tanta questão de frisar que você não deve utiliza-la para nenhum desenvolvimento mais moderno em Windows.
Use o Code::Blocks. Ele já vem com uma versão atual do MinGW instalado. Temos um tutorial aqui exclusivo para ele: Ponto V! - Um ambiente para criar jogos com a SDL e a OpenGL
-
28/09/2010 18:13:33 |189.27.177.xxx| Lucas Gerhard

Opa, instalei o Code::blocks seguindo o tutorial e funcionou perfeitamente (isso que dá não ver a seta indicando que tem mais um artigo). Só te peço pra dar uma olhada na linha 17 onde tu ta comparando duas variáveis ao invés de estar atribuindo o valor, no mais tudo funcionou que é uma beleza.
té...
-
28/09/2010 18:33:18 | Vinícius Godoy de Mendonça

Não era para ser um !=, nem uma atribuição e sim um |=
Vou corrigir ali em cima deixando o código mais explícito.
-
28/09/2010 13:41:27 |189.27.177.xxx| Lucas Gerhard

A bom... Belezura então, valeu pela ajuda. Já to desinstalando o DevCpp e instalando o Code::Blocks.
-
28/12/2010 21:29:14 |186.213.25.xxx| Fabiano Vasconcelos - Erros de segmentação que não fazem sentido

Olá, Vinícius!
Em primeiro lugar, parabéns pelo belo trabalho. Tanto a você, quanto ao Bruno. Este é realmente um portal profissional.
Em seguida eu queria tirar uma dúvida: na minha IDE (NetBeans), esta linha,
throw std::runtime_error(SDL_GetError());
que aparece duas vezes dá erro. A observação que aparece no lado esquerdo é: "Impossível resolver o identificador runtime_error". O mesmo acontece com SDL_Surface.
Já a saída do compilador é:"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entrando no diretório `/home/jent/projects/RiverAssault/rassault'
"/usr/bin/make" -f nbproject/Makefile-Debug.mk dist/Debug/GNU-Linux-x86/rassault
make[2]: Entrando no diretório `/home/jent/projects/RiverAssault/rassault'
mkdir -p dist/Debug/GNU-Linux-x86
g++ -lSDL -o dist/Debug/GNU-Linux-x86/rassault build/Debug/GNU-Linux-x86/main.o
/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start':
collect2: ld returned 1 exit status
make[2]: ** [dist/Debug/GNU-Linux-x86/rassault] Erro 1
make[1]: ** [.build-conf] Erro 2
make: ** [.build-impl] Erro 2
make[2]: Saindo do diretório `/home/jent/projects/RiverAssault/rassault'
make[1]: Saindo do diretório `/home/jent/projects/RiverAssault/rassault'O que pode estar ocorrendo?
Grande abraço!

-
28/12/2010 21:41:59 | Vinícius Godoy de Mendonça - SDL

Oi.
Você configurou corretamente a SDL no seu projeto?É necessário baixar e instalar a SDL: http://www.libsdl.org/download-1.2.php
Se você já fez isso, então pode ser algum erro de configuração do seu arquivo de projeto. Eu realmente não sei configurar no netbeans, minhas principais IDEs para desenvolvimento C++ são o Code::Blocks e o Visual.
-
28/12/2010 22:22:18 |186.213.25.xxx| Fabiano Vasconcelos

Cara, baixar os pacotes eu baixei. Deve ser alguma flag que estaria faltando no g++.

Vou verificar isso aqui.
-
28/12/2010 22:30:00 | Vinícius Godoy de Mendonça

Certifique-se também que a extensão do seu arquivo é .cpp e não .c
-
29/12/2010 01:51:28 |186.213.51.xxx| Fabiano Vasconcelos

Descobri!!!
É um erro peculiar e que deve ser resgistrado aqui, pois é muito sutil e eu não achei solução em português:
http://lists.libsdl.org/pipermail/sdl-libsdl.org/2007-March/060279.htm lEm suma, como já está de madrugada, usei mesmo o tradutor lixão do google. Não estou em condições de traduzir:
"Você está ciente do fato de que a SDL define uma macro para embrulhar a principal função?
Ele espera int main (argc argv []) como seus argumentos (com a possível exceção
de usar nomes de variáveis diferentes para os parâmetros passados). Se você tentar int
main () ou int main (void) ou void main () ou qualquer coisa que não inclui o
argumentos passados na linha de comando, ele não vai funcionar.Além disso, como uma dica para futuros problemas relacionados com o Linux é que o Linux utiliza
arquivos caso sensível assim # include vai funcionar se você tem o seu
cabeçalhos no diretório SDL usando letras maiúsculas. Se você usar minúsculas que
não vai funcionar."Ou seja, a função deve ser main() e com os parâmetros padrão. O resto deve ser declarado a parte.
Por hoje é só!
Um abraço e boa semana!

-
29/12/2010 08:05:12 | Vinícius Godoy de Mendonça

Por isso escrevi no artigo:
Ela é quem toma conta de fazer as chamadas específicas. Então, para nós, resta apenas a tarefa de declarar um main padrão, com o seguinte formato:E, no parágrafo seguinte:
Embora o C++ forneça outras alternativas para a assinatura do main, essa é a forma recomendada pela SDL.Outras formas de main são admitidas. Em todo caso, vou alterar ali o texto para dar mais destaque.
-
29/12/2010 08:35:26 | Bruno Crivelari Sanches

Oficialmente a função main pode ter dois formatos:
void main(void)ou
int main(int, char **);
Qual usar depende da sua necessidade, mas como o Vini comentou a SDL impõe restrições.
-
29/12/2010 11:40:49 |187.58.88.xxx| Anônimo

Cara, eu nem me dei conta do seu texto na íntegra. Ontem eu não tava muito bem da cabeça, hehehehheheh...
De qualquer maneira, esse é um detalhe muito importante que deve importunar uma parcela considerável de programadores iniciantes. Bom saber que agora existe solução em português. Se vocês puderem colocar destaque maior nessa parte, será um grande diferencial.Muita paz a todos!
-
07/01/2011 12:44:06 |189.104.213.xxx| Fernanda Scheidt - pequeno problema, posso ter feito algo errado???

Ola Vinicius,
Comecei hoje a seguir seu tuto passo a passo, incusive na troca do dev pelo codeblock, mas ao compilar esse codigo da janela ele deu um erro na linha 60, com os "}" e só compilou quando eu removi os "" e ficou só a chave "}".
posso ter feito algo de errado???
-
07/01/2011 13:13:07 | Vinícius Godoy de Mendonça

Você fez certo. Não sei pq esse editor insiste em colocar essas coisas. Já retirei umas 4 ou 5 vezes do artigo.
-
30/01/2011 21:09:01 |187.114.123.xxx| Fabiano Vasconcelos - Explicação

Amigos, vocês poderiam me explicar as linhas 16 e 17? Não entendi principalmente as atribuições lá.
Obrigado e boa semana!
-
31/01/2011 07:38:47 | Vinícius Godoy de Mendonça

Bom, a linha 16 não tem o que explicar. Só está testando se a variável fullscreen, passada como parâmetro, é true.
A linha 17, sim, é um pouco mais complicada. Os valores da variável flags são definidos na forma de um mapa de bits. Aquele comando combina os bits da variável flags, com os bits dos valores passados por parâmetro.
Dê uma lida nesse tópico do GUJ, onde esse tema é explicado com detalhes: http://www.guj.com.br/java/207435-mapa-de-bits-alguem-se-habilita-#105 3869
-
15/02/2011 14:25:25 |186.212.38.xxx| Victor - Ajuda.

Olá. Você tem um tutorial ensinando a instalar e configurar OpenGL e SDL no Linux Ubuntu e no Code::Blocks? Que eu já cansei de só ver tutoriais que não funcionam.
Usando as configurações padrões, ou eu uso SDL ou OpenGL em um projeto, nunca consegui usar os 2......
-
15/02/2011 14:28:55 | Vinícius Godoy de Mendonça

O que você quer dizer com "usar os dois"? Quando a OpenGL está ligada, não é possível dar usar comandos de pintura da SDL, a OpenGL irá substituir totalmente o mecanismo de render. Ou seja, esqueça os comandos de BlitSurface.
A configuração que proponho neste tutorial e no próximo, ensinam a abrir uma janela SDL com a OpenGL como renderer. Você ainda poderá usar o mecanismo de eventos, sons, os loaders de imagem, da SDL, mas a pintura terá que ser feita usando OpenGL.
-
15/02/2011 15:22:02 |186.212.38.xxx| Victor

Então. Mas isso de usar os 2, foi erro de expressão meu.
Se eu vou no CB e crio um SDL project, eu só consigo usar SDL, se eu crio um OpenGL, só uso o OpenGL, caso contrário, ele diz "arquivo ou diretório não encontrado". Se tratando de programação, só 2 coisas que eu odeio. Configurar essas coisas, os tutoriais raramente funcionam e buscar tutoriais/documentação para aprender.
-
15/02/2011 15:26:51 | Vinícius Godoy de Mendonça

Siga o tutorial sobre criação de ambientes à risca:
http://www.pontov.com.br/site/index.php/opengl/137-criando-um-ambiente -para-jogos-com-sdlopenglCom ele você configura um projeto do zero, sem usar os wizards do Code::Blocks. Entenda os passos necessários e você poderá reproduzir no Linux.
Eu sou extremamente contra Wizards, principalmente no C++. Ali, se você não conhece o ambiente, você se ferra.
-
17/02/2011 16:27:40 |187.112.119.xxx| Victor

Bom, eu encontrei uma série de problemas caso fosse "adaptar" isso.
1º, não sei o equivalente as variáveis de ambiente no Linux.
2 ª, não sei onde fica um programa após instala-lo pelo terminal ou por um pacote.
Acho melhor continuar procurando tutoriais e esperando que pelo menos um funcione, ou esperar ter a disciplina de compiladores na faculdade, ai eu vou entender como um compilador funciona.
-
17/02/2011 16:38:52 | Bruno Crivelari Sanches
Citou:1º, não sei o equivalente as variáveis de ambiente no Linux.Existem, só não sei onde fica uma gui para editar elas. Provavelmente por linha de comando é mais simples.
Citou:esperar ter a disciplina de compiladores na faculdade, ai eu vou entender como um compilador funciona.Mas não vai entender como usar um compilador C ou C++, na disciplina não vão explicar isso, vão explicar as teorias e técnicas para compilação, não como usar um compilador já existente.
T+
-
15/02/2011 15:43:24 | Bruno Crivelari Sanches
Citou:Configurar essas coisas, os tutoriais raramente funcionam e buscar tutoriais/documentação para aprender.Por isso que muitas vezes é melhor entender como tudo funciona ao invés de apenas seguir uma receita de bolo. Pode parecer complicado, mas o processo de usar essas libs é bem intuitivo para quem sabe como a compilação de um programa C ou C++ funciona.
Configurar SDL ou OpenGL é como configurar qualquer biblioteca para se usar com um programa C/C++: dizer ao compilador onde estão os arquivos de include, dizer ao linker onde estão os arquivos de biblioteca.
Sugiro dar uma lida:
E também: Como usar bibliotecas C/C++
T+
-
01/03/2011 18:01:11 |200.207.145.xxx| Koolen - Instalação efetuada com sucesso! Mas não rodou o a

Boa tarde, já faz alguns meses que estou na pesquisa de qual linguagem trabalhar para o desenvolvimento de games. Sou programador a 18 anos em linguagens desktop, web, scripts, etc.
Esta de parabens seu post de instalação, tudo ok!
Pergunta seguinte, neste post aqui em cima, vc ofereceu um código exemplo, eu não tenho muita noção da funcionaldiade do c e tbm prefiro perguntar do que pesquisar.
Meu código deu um erro, que deve ser de referencia o seguinte:
stdexcept: No suc file or directoryNunca tinha instalado o CodeBlocks, segui seu procedimentos até aqui e parei neste ponto, gostaria de saber se fiz algo de errado ou faltou algum detalhe no processo.
Agradeço sua atenção!
-
01/03/2011 18:14:10 |200.207.145.xxx| Koolen

Encontrei o problema.
Realmennte erro de noob.
1° Tenho que usar a opção "File -> New Project -> Console Application"
2° Adicionar todas as configurações novamente ao projetoEntão sempre faço isso, não tem como manter essas configurações por padrão. Existe a possibilidade de manter como padrão igual o delphi ou visual studio fazem? Tipo pra adicionar automaticamente em todos os novos projetos.
Valeu, to gostando do code::block
bacana.
-
01/03/2011 19:27:18 | Vinícius Godoy de Mendonça

Olá Koolen.
Existe sim, você pode configurar as opções em Settings->Compiler&Debugger. Eu não gosto muito de deixar a configuração na IDE, prefiro sempre definir por projeto.
Uma das coisas que faço é ter um projeto em branco, já configurado e só dou copy&paste nele quando preciso montar um ambiente novo.
Se você já está adaptado ao Visual, use-o. A única coisa que muda é que você deverá incluir um include antes do include do gl.h
-
19/12/2011 10:57:05 |187.48.157.xxx| Rafael Vieira Braga - Dúvida

Olá,
primeiro de tudo, parabéns, não só pelo site mas pela sua ajuda e suporte a comunidade de programadores. Agora a minha dúvida.
Instalei o code::blocks, tudo direitinho conforme seu tutorial. Depis baixei o SDL e suas features(mixer,image e tbm o net), configurei o compilador(directories e Linker), tudo conforme vc foi explicando. Porém, na hora de compilar o projeto(básico mesmo) ele dá os seguintes erros:
no linker:
Linking console executable: bin\Debug\CivilWar.exe
C:\Program Files (x86)\CodeBlocks\MinGW\bin\ld.exe: cannot find -lsdl_mixer.dll
collect2: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 0 seconds)
1 errors, 0 warningsno console:
ld.exe||cannot find -lsdl_mixer.dll|
||=== Build finished: 1 errors, 0 warnings ===|
-
19/12/2011 11:15:40 | Vinícius Godoy de Mendonça

Oi.
Creio que nas configurações, em "link libraries" você só deva deixar SDL_Mixer e não SDL_Mixer.dll
[]s,
Vini
-
19/12/2011 11:32:00 |187.48.157.xxx| Rafael

Não deu certo... porém, percebi que nas pastas "lib", dos SDL_*, não tem o ".a". Será que esqueci algo? Só fiz descompactar as pastas, depois colar as DLL's na pasta DLL(que está na variável de ambiente PATH)... Não sei mais o que pensar....
-
19/12/2011 11:35:14 | Vinícius Godoy de Mendonça

Você baixou as versões devel para mingw32?
Cuidado para não baixar os redistributables (sem ser o devel). Eu mesmo vivo baixando errado por engano.
-
19/12/2011 11:39:26 |187.48.157.xxx| Rafael - Pronto, deu certo !!

Ahhhh. viajei...
Tinha esquecido de configurar o caminho para as "includes" e "libs" das features do SDL... quanta noobice... mas é assim mesmo, a gente aprende com os erros. Mais uma vez, obrigado e parabéns pelo site.
-
19/12/2011 11:51:15 |187.48.157.xxx| Rafael - Denovo...

Malz ai pela pertubação...
agoratá dando esse erro:C:\DevJogos\CivilWar\CivilWar\main.cpp||In function `void setup(int, int, int, bool)':|
C:\DevJogos\CivilWar\CivilWar\main.cpp|10|error: `runtime_error' is not a member of `std'|
C:\DevJogos\CivilWar\CivilWar\main.cpp|18|error: `runtime_error' is not a member of `std'|
||=== Build finished: 2 errors, 0 warnings ===|obs.: Só fiz copiar e colar do exemplo acima...
-
19/12/2011 12:39:25 |187.48.157.xxx| Rafael - Denovo e denovo...

Tá rodando, mas tá dando um erro... tá entrnado no catch da main(return(1)); O q pode ser?
-
19/12/2011 13:17:06 |187.48.157.xxx| Rafael

O erro de lá foi burrice minha, não copiei as includes, ai digitei e esqueci da stdexcept, ai coloquei e não deu mais erro. Só que agora, no runtime, não aparece a janelinha normal, aparece só uma dizendo:
"
Process returned 1 (0x1) execution time : 0.030s
Press any key to continue
"
ou eja, tá entrnaod no catch da função main....
Não sei o porquê disso.
-
19/12/2011 13:23:51 |187.48.157.xxx| Rafael - A janela apareceu....

Pronto, não sei o que é. Parece até que o IDE tem medo de vc, quando mando a pergunta, ele funciona logo depois... sei não viu, isso que é moral kkkkkkkkkkkkkkkkk.
Só fiz copiar tudo denovo, compilei, rodei e apareceu a janelinha que eu disse e depois, a janelinha configurada...
Vlw, pela rapidez nas respostas...
[]'s
-
19/12/2011 13:28:34 | Vinícius Godoy de Mendonça

Provavelmente faltava era um "Rebuild all".

Ou o meu olhar assassino mesmo. hehehehe[]s e bons estudos!

Qualquer dúvida é só perguntar.
E obrigado pelos elogios em relação ao site. Trabalhamos duro pra ter sempre inserção de conteúdo, e temos um critério mínimo de qualidade, assim garantimos que você só lê material de primeira.Nada de gambi ou de tutoriais "copy&paste" sem explicações nesse site aqui.
-
12/02/2012 14:01:55 |187.114.113.xxx| Fabiano Vasconcelos

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.
-
12/02/2012 15:39:05 | Vinícius Godoy de Mendonça - Mapas de bits

Olá Fabiano.
Usar um único inteiro para representar um conjunto de flags é um truque bastante comum em programação C.
Digamos que você tenha 3 valores booleanos e queira combina-los. Você poderia criar três constantes, assim:
int VALOR1 = 1; //001 em binário
int VALOR2 = 2; //010 em binário
int VALOR3 = 4; //100 em binárioAgora, alguém que quisesse usar ao mesmo tempo o VALOR1 e o VALOR3 poderia faze-lo assim:
int flags = VALOR1 | VALOR3;Essa operação faz um OU, bit a bit. Ou seja, se um bit de um número contiver 0 e o outro 1, o resultado será 1. Caso contrário, o valor naquele bit será 0.
Portanto:
001
100 |
--------
101
A SDL utiliza essa técnica, pois há um conjunto de flags que podem ser definidas na inicialização. O comando
flags = flags | SDL_FULLSCREEN;está simplesmente adicionado a flag fullscreen ao conjunto de flags já existente (no caso, a SDL_SWSURFACE).
Para uma explicação detalhada, veja também:
http://www.guj.com.br/java/207435-mapa-de-bits-alguem-se-habilita-#105 3869











Legal, seu tuto.
Esperando um sobre animação de sprite com SDL.
Estou meio confuso com isso.