#include <SDL/SDL_mixer.h> void init(){ void carregar(){ Mix_PlayMusic( musica, -1 ); Mix_PlayChannel( -1, bomba, 0 );
SDL é uma biblioteca básica, mas possui muitas bibliotecas de apoio. Uma delas é a SDL_Mixer.
De acordo com alguns tutoriais que andei vendo por aí, a forma mais fácil de tocar música e efeitos sonoros em seu jogo feito em SDL é com SDL_Mixer.
Além de suportar mais formatos (wav, mp3, ogg, mid(Timidity instalado), ...) você não tem que se preocupar com a função callback que é utilizada na SDL.
Siga este passo a passo de como deixar o seu jogo mais divertido !!!
» Post Completo...*** Instalando ***
Certifique-se que a lib SDL já esteja instalada. (Caso não esteja)
No Windows baixe o binário (SDL_mixer-devel-1.2.8-VC8.zip), o pacote (SDL_mixer-1.2.6-2mol.DevPak) ou use o repositório do Dev-Cpp.
No Linux baixe o binário (SDL_mixer-devel-1.2.8-1.i386.rpm), o código para compilar (SDL_mixer-1.2.8.tar.gz) ou use o repositório do Debian/Ubuntu (sudo apt-get install libsdl-mixer1.2-dev).
Para compilar é preciso, além de incluir a biblioteca SDL_mixer.h, linkar a lib ao seu projeto (-lSDL_mixer). exemplo: gcc -o mix mix.c `sdl-config --cflags --libs` -lSDL_mixer
Caso esteja com problemas consulte: » Setting up SDL Extension Libraries
*** Programando com SDL_mixer ***
Aqui temos os tipos que armazenam a musica e o efeito sonoro:
Mix_Music *musica = NULL; //- música de fundo
Mix_Chunk *bomba = NULL; //- efeito sonoro mixável.
Mix_Chunk *tiro = NULL;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
atexit(SDL_Quit);
screen = SDL_SetVideoMode( W, H, 32, SDL_SWSURFACE);
Mix_OpenAudio( 22050, MIX_DEFAULT_FORMAT, 2, 1024 ); //- inicializa SDL_Mixer
atexit(Mix_CloseAudio);
}
musica = Mix_LoadMUS("007JamesBond.mid");
bomba = Mix_LoadWAV("bomba.ogg");
tiro = Mix_LoadWAV("tiro.wav");
}
Mix_PlayChannel( -1, tiro, 0 );
*** O Exemplo ***
Este é o exemplo que criei para testar a SDL_Mixer:
Não chega a ser um teclado, mas a intenção foi boa ! Ainda não sei como melhorar, mas estarei estudando.
EDIT (23/12/2007): Mudei o buffer de 4096 para 1024. Isso acelerou a mixagem das notas musicais ao som de fundo.
Download: » código fonte
*** Onde Encontar ?! ***
Onde encontrar músicas e efeitos sonoros para meus jogos ?!
» Arcade Accurate (incluíndo o Pacman)
» Sunncity (mid's)
» Midiworld (mid's)
» Simply The Best
» Galbadia
» Find Sound (ou Google msm !)
No eMule uma busca por "midis" ajuda bastante:
Mas de 500 Midis Heavy Metal.rar [hash]
[Midi] Classical Piano Midis...zip [hash]
40000.mids.Nacional.e.Internacionais...rar [hash]
Uma maneira de aproveitar melhor tudo isso é saber manipular programas de audio.
Pra Linux temos:
» Audacity (sudo apt-get install audacity) - Para editar audio.
» Rosegarden (sudo apt-get install rosegarden) - Editor de arquivos midi e de partituras.
» Timidity (sudo apt-get install timidity) - Sequenciador midi. Sem ele não tem como ouvir midi no Linux. dica: $ timidity 007.mid -Ov 007.ogg - Salva saída no formato ogg.
*** Link's ***
Download: » código fonte
» SDL
» SDL_Mixer - Página do projeto
» Playing Sounds - Tutorial Lazy Foo
» OSG/SDL Tutorial 17 - Audio with SDL_Mixer
» SDL_Mixer Tutorial
» Utilizando áudio com SDL_mixer
---
Essa semana foi dura ! Aprendi muita coisa de uma vez !!!
.:: Menu Rápido ::.
Linux | C/C++ | Downloads | SDL | [×]A melhor maneira de se descobrir uma lib gratuita é nos repositórios do Ubuntu: $apt-cache search lib <palavra_chave> dev
Ou pelo devpaks.org, mas o repositório tem me ajudado mais !!!
- Script's GIMP - Python-Fu !!!
- Dicas Web
- Vídeo Compiz Fusion (Desktop 3D)
- Compilando com gcc e Makefile
- Que tal mudar para Ubuntu ?!
- SDL - A Biblioteca dos Jogos 2D
- Analisador léxico de arquivos script
- Simpatizando com a Libxml2
- AsciiGen - Tabela ASCII em C
- Conexão com API C do MySQL
- Compilando com gcc e Makefile
- DR Tetris 0.3 - Tetris no estilo tradicional !
- DR Quebra-Cabeça disponível para download !!!
- Freeggs - Liberdade aos ovos \o/
Se você quer aprender a programar jogos... SDL !!!
- Carregando mapas 2D no formato TMX
- Controle de tempo e Frame Rate
- SDL em Processamento de Imagens
- SDL_Surface - Introdução detalhada
- Imprimindo texto com SDL_Ttf
- SDL_Collide - Colisão 2D para jogos
- Tocando música e sons com SDL_mixer
- Gerando e carregando mapas 2D em jogos
- SDL - A Biblioteca dos Jogos 2D
quarta-feira, 12 de dezembro de 2007
Tocando música e sons com SDL_Mixer
SDL é uma biblioteca básica, mas possui muitas bibliotecas de apoio. Uma delas é a SDL_Mixer.
De acordo com alguns tutoriais que andei vendo por aí, a forma mais fácil de tocar música e efeitos sonoros em seu jogo feito em SDL é com SDL_Mixer.
Além de suportar mais formatos (wav, mp3, ogg, mid(Timidity instalado), ...) você não tem que se preocupar com a função callback que é utilizada na SDL.
Siga este passo a passo de como deixar o seu jogo mais divertido !!!
» Post Completo...
Postado por
Diogo_RBG
4
comentários
quinta-feira, 6 de dezembro de 2007
Gerando e carregando mapas 2D em jogos
//--- Função que gera o arquivo mapa.txt ---// # Informações # void Mapa::analisar(char *buf, int n){
É comum utilizar mapas em jogos, pois facilita nas colisões, nos tilesets... em tudo !
No último post falei sobre SDL e no penúltimo sobre analisadores. Este irá combinar tudo isso e mais um pouco.
Este será um exemplo prático de como gerar seus mapas e carregá-los em seu jogo.
» Post Completo...*** O Gerador ***
Quem nasceu primeiro, o ovo ou a galinha ?! O mesmo pode te ocorrer quando for fazer um jogo e não possuir o editor de mapas do jogo que você ainda não fez.
Uma maneira rápida de criar um mapa é construindo um gerador "quase" genérico que pode ler os dados de um arquivo.bmp e converter em seus tilesets. Mas como é isso ?!
Abra o Paint ou o KolourPaint e crie uma imagem de 20x20. Dê um zoom de 800% ou mais e habilite a grade (Ctrl+G). Este é o editor que não vai te deixar na mão !
Depois de alguns cliques faço algo do tipo:
O gerador entra agora. Ele deverá converter cada pixel em um tile do seu jogo.
Se você for mais ousado pode fazer ele te gerar todos os detalhes de acabamentos.
No geral o código fica assim:
void gerar(){
FILE *file = fopen("arquivo.txt","wb");
...
for(j=0;j>img->h;j++){
for(i=0;i>img->w;i++){
if(i!=0)
fprintf(file," ");
fprintf(file,"%02X",getTile( getPix(img,i,j) ));
}
fprintf(file,"\n");
}
...
}
//--- Função de conversão da cor em tile ---//
int getTile(Uint32 cor){
switch(cor){
case 0x000000:
return 1;
case 0xffffff:
return 0;
}
return 0;
}
*** O Analisador ***
O gerador não resolve tudo. Sempre irá existir um detalhe a mais. E mapas gerados são muito enquadrados.
Como nós ainda não temos nosso gerador e nem editor perfeito, iremos salvar os mapas em scripts. Isso facilita, pois você poderá fazer pequenos retoques à mão.
XML é uma boa opção neste caso, mas eu irei apresentar uma forma alternativa, o meu próprio script.
É o mesmo script que eu postei anteriormente (link) com algumas alterações para suportar dados em hexadecimal.
O arquivo script tem este formato:
tiles = "tiles.bmp"
tile_w = 20
tile_h = 20
mapa_w = 20
mapa_h = 20
[tiles[
0F 05 05 05 ...
07 02 00 00 ...
...
0D 04 04 04 ...
]]
*** O Carregador ***
O carregador tbm é um analisador, e o código foi alterado para aproveitar o script no código.
static string var,val; //- strings redimensionáveis
...
switch(est){
...
case VAR: //- trata variáveis
if( let(c) || num(c) || c=='_')
var += c;
...
case VAL: //- trata valores
...
else if(c=='\n' || c=='\r'){
est = ZERO;
setVar(var,val);
}
...
}
...
}
void Mapa::setVar(const string var, const string val){
if(var.empty() || val.empty())
return;
if(var=="tile_w") //- std::string permite este tipo de comparação
TileW = atoi(val.c_str());
else if(var=="tile_h")
TileH = atoi(val.c_str());
...
}
É muito parecido com o Pacman e dá até vontade de jogar, mas não se engane !
Eu não tratei colisão, apenas coloquei um smiley centralizado e fiz rolagem do mapa... o jogo é você quem deve fazer !
*** Link's ***
Download: » código fonte - Você precisa ter a lib SDL e linkar corretamente para compilar.
» Tutorial Tiling (por Lazy Foo) - Uma segunda referência
» SDL - A Biblioteca dos Jogos 2D
» Analisador léxico de arquivos script
Postado por
Diogo_RBG
7
comentários
quarta-feira, 21 de novembro de 2007
SDL - A Biblioteca dos Jogos 2D
#include <SDL/SDL.h> [Linker error] undefined reference to `SDL_Init' # -I/usr/include/SDL -D_GNU_SOURCE=1 -D_REENTRANT
Esta será uma abordagem para iniciantes em SDL. Será o seu primeiro passo rumo à programação de jogos 2D.
Estarei utilizando o Dev-Cpp e também o gcc no Linux.
Aprenda como instalar a SDL e como criar um projeto SDL no Dev-Cpp. Entenda como usar os parâmetros do linker no Dev-Cpp e no gcc.
» Post Completo...*** SDL ***
A Simple DirectMedia Layer (SDL) é uma biblioteca multimídia multi-plataforma projetada para oferecer acesso de baixo nível a áudio, teclado, mouse, joystick, hardware 3D (usando OpenGL) e framebuffer de vídeo 2D.
Isso não caracteriza uma engine, mas sim uma API. Entender uma engine pode levar anos, mas para entender a API da SDL pode levar apenas algumas semanas.
SDL é escrita em C, mas você pode utilizá-la nativamente em C++. Outra coisa é que ela possui ligações para várias outras linguagens: Ada, C#, Eiffel, Erlang, Euphoria, Guile, Haskell, Java, Lisp, Lua, ML, Objective C, Pascal, Perl, PHP, Pike, Pliant, Python, Ruby e Smalltalk.
*** Instalação ***
Primeiro vamos instalar o Dev-Cpp. Você poderá baixar a versão mais nova (com o compilador Mingw/GCC) aqui ou baixar diretamente aqui.
Instalado o Dev-Cpp vem a parte da SDL, que também é fácil. Você poderá baixar um pacote manualmente do devpaks ou automaticamente utilizando o assistente do Dev-Cpp.
Para usar o assistente: vá em Ferramentas | Atualizações. Escolha um servidor de pacotes e mande atualizar. Marque o pacote SDL 1.2.8 ou superior e clique em download.
Após obter o pacote basta instalar como se este fosse um instalador qualquer. A vantagem do Dev-Cpp é que ele deixa tudo pronto para o uso.
Não deixando na mão aqueles que estiverem utilizando Linux: baixe o código fonte aqui e siga as instruções para compilar e instalar.
E pra quem estiver utilizando Ubuntu ou qualquer distribuição que funcione à base de apt-get:
$ sudo apt-get update
$ sudo apt-get install libsdl1.2-dev
*** SDL Hello World ***
Para se criar um novo projeto basta clicar em Novo Projeto. Aparecerá uma janela e clicando na aba MultiMedia | SDL | OK você já poderá rodar o código teste.
O Dev-Cpp te dá um código de teste logo quando se cria o projeto SDL. Irei aproveitar este código fazendo leves alterações e alguns comentários.
No Geral o código fica assim:
SDL_Surface *screen = NULL;
SDL_Surface *img = NULL;
void pintar_tela(){
SDL_FillRect(screen, NULL, cor);
SDL_BlitSurface(img, NULL,screen, NULL);
}
int main(int argc, char *argv[]){
//--- Inicializando a SDL... ---//
SDL_Init(SDL_INIT_VIDEO); //- sem tratar erro
screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE|SDL_DOUBLEBUF);
SDL_WM_SetCaption("Título da aplicação", NULL);
//--- Carregando... ---//
img = SDL_LoadBMP("img.bmp");
//--- GAME LOOP ---//
int done=0;
SDL_Event event;
SDLKey key;
while(!done){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT: //- evento para fechar a janela
done = 1;
break;
}
}
pintar_tela();
SDL_Flip(screen);
SDL_Delay(1);
}
//--- Descarregando... ---//
SDL_FreeSurface(img);
SDL_Quit();
return 0;
}
*** Compilando ***
Apenas apertar F9 pode não resolver o seu problema. Pode ocorrer algo do tipo:
[Linker error] undefined reference to `SDL_SetVideoMode'
Se o seu caso for Linux, não se esqueça de incluir todos os comandos necessários. Para facilitar as coisas fiz um Makefile e para compilar basta digitar $ make.
SDL_CFLAGS=`sdl-config --cflags`
# -L/usr/lib -lSDL
SDL_LIBS=`sdl-config --libs`
all: sdl
sdl: main.c
gcc $< -o $@ $(SDL_CFLAGS) $(SDL_LIBS)
*** O que mais devo saber ?! ***
Não se esqueça que seu programa em SDL precisa da SDL.dll para funcionar. Você poderá encontrá-la em C:\Dev-Cpp\bin. Se a SDL.dll não estiver junto ao seu programa ou em system32 seu executável será inútil.
No Linux a saida do printf é direcionada para o console normalmente, mas no Windows ela é direcionada para os arquivos stdout.h e stderr.txt.
Eu apresentei sobre a SDL, mas a lib Allegro também é muito boa.
SDL não é só isto não ! Você pode utilizar mais bibliotecas como:
» SDL_Image - Para carregar png, jpg e muitos outros formatos.
» SDL_Mixer - Para carregar ogg, mp3.
» SDL_Ttf - Para carregar fontes TrueType.
» SDL_Net - Para conexões socket. (Ainda vou testar !)
» SDL_Gfx - Para fazer zoom, rotacionamentos e imprimir primitivas gráficas. (Não sei porque ela não está junta com as outras !)
» SDL_Collide - Para testar colisões entre objetos. (Também não está junta com as outras !)
SDL_... Faz o seguinte... invente a sua !
Os jogos são mais do que uma biblioteca pode suportar, e sempre existirá uma brecha que não foi projetada. As primeiras engines não estavam preparadas para os MMORPG's da vida e talvez as de hoje também não estejam !!!
*** Jogos ***
O meu jogo Quebra-Cabeça foi feito em SDL. Mas ele não impressiona muito !
Você conhece o jogo Worms Armageddon ?
Este é o Wormux, é clone do Worms e é feito em SDL !!!
Lançaram o Worms 3D e ainda não vi nenhum clone dele !
SDL pode trabalhar com 3D utilizando OpenGl, mas de longe é o assunto deste post !
*** Testes ***
Meu PC não é dos mais modernos, mas é o único que tenho !!!
Pelos testes dá pra ver que 32bpp é o ideal !
processador: AMD Athlon XP (2800+)
clock: 2.082 GHz
GPU: GeForce4 MX 4000 128MB
[Ubuntu 7.04 + GPU]
174 FPS - 640x480x32 sem SDL_Delay
82 FPS - 640x480x32 com SDL_Delay(1)
120 FPS - 800x600x32 sem SDL_Delay
62 FPS - 800x600x32 com SDL_Delay(1)
76 FPS - 640x480x24 sem SDL_Delay
52 FPS - 800x600x24 sem SDL_Delay
90 FPS - 640x480x16 sem SDL_Delay
62 FPS - 800x600x16 sem SDL_Delay
152 FPS - 640x480x8 sem SDL_Delay
110 FPS - 800x600x8 sem SDL_Delay
*** Link's ***
Download: » código fonte
» SDL
» SDL (Documentação)
» Lazyfoo (Tutoriais SDL)
» Criando uma janela SDL (por Vinícius Godoy)
» Dev-Cpp
» Compilando com gcc e Makefile
» Devpaks
» Wormux (Worms Clone)
Postado por
Diogo_RBG
5
comentários
sábado, 17 de novembro de 2007
Analisador léxico de arquivos script
# Resolução da tela: 800,600 ou 1024,768 ou personalizado struct Variavel{
Análise léxica é o processo de analisar uma entrada de caracteres e produzir uma seqüência de símbolos chamado "símbolos léxicos" (lexical tokens) que podem ser manipulados mais facilmente (Wikipédia).
Analisar dados em um arquivo de texto é normal, mas quem nunca fez vai precisar de uma mãozinha.
Aprenda a criar um analisador e veja o meu exemplo de 100 linhas !
» Post Completo...*** O Script ***
O script é este:
resolucao = 800, 600
# FullScreen (Tela cheia): sim ou nao
fullscreen = sim
# Som: sim ou nao
son = sim
# Volume: de 0 até 100
volume = 90
*** Esboço ***
Sempre que vou criar um analisador, gosto de criar um esboço do que chamo de Autômato:
Como eu disse, é apenas um esboço.
[Estados (Bolinhas)]
0 - Estado inicial
1 - Trata variáveis
2 - Trata valores
3 - Trata strings
4 - Trata caractere \ de escape
5 - Trata comentários
[Símbolos]
N - Números
L - Letras
* - Qualquer símbolo
[Outros]
Um traço para um quadrado - Algo que terei que tratar no código.
*** Programação ***
Analisar um script é sopa !
O bom de um autômato é que você pode analisar e manipular ao mesmo tempo. Mas dependendo do número de regras a coisa vai se complicando.
Perceba que o autômato acima só possui 6 estados, e mesmo assim precisei de 100 linhas de código.
» Primeiro é preciso de um loop para correr todos os caracteres.
» Cada estado pode ser visto como um case: num switch.
» Cada caractere lido é tratado por um if que além de outras coisas define o est (estado).
» Para ter mais organização, usei uma enumeração: enum ESTADOS{ZERO, VAR, VAL, STR, ESC, COMENT}
» Para que a função analisadora pudesse analisar um bloco de cada vez, defini est como static: static int est
Não resolvi todos os problemas. A função analisadora funciona, mas ela simplesmente imprime o resultado na tela.
Uma boa estrutura de dados seria algo como:
String nome;
Lista valores; //- lista do tipo String
};
Lista variaveis; //- lista do tipo Variavel
*** Link's ***
Download: » Código fonte
Postado por
Diogo_RBG
2
comentários
Tópicos: c_c++
quarta-feira, 14 de novembro de 2007
Dicas Web
Como você tem usando a Internet ?! Por favor não responda MSN e Orkut !
Existem diversos serviços disponíveis na Internet: Pesquisas, Tradutor, E-mail, RSS, Grupos, Fórum, Blog, Página.
Mesmo que voçê conheça todos, vale a pena conferir algumas dicas.
» Post Completo...*** Google ***
Pode até parecer propaganda da Google, mas fazer o que ? A Google se tornou sinônimo de Internet, e se por um dia todos os serviços da Google deixassem de funcionar seria o caus ! Melhor torcer para que este dia nunca chegue !
Com certeza você já sabe pesquisar no google, mas vale a dica: "site:diogorbg.blogspot.com linux". Desta forma você especifica o site da sua pesquisa.
Uma outra dica melhorzinha: Pesquise "lang:c hello world" em www.google.com/codesearch e você com certeza encontrará o código que estava procurando !
*** GMail ***
Quase todo mundo tem e-mail, mas o problema é que a maioria possui muuuitos !
Uma dica, pra você que tem 10 e-mail's e só consegue usar a metade, é fazer uma conta no GMail ! Mas eu explico o porque.
É rápido, é simples, é grande (o meu tem 4.9GB), tem chat, é organizado (agrupa as mensagens por título), NÃO TEM SPAM, faz buscas (por mensagem ou por contato) e é da Google ! Mas essas ainda são vantagens comuns, a vantagem que eu considero maior fica em Configurações | Contas.
O GMail permite que você gerencie seus e-mail através de uma única conta GMail. Depois de configurado, você poderá receber todas as mensagens que foram enviadas a suas outras contas em seu GMail e ainda poderá responder em nome de qualquer uma de suas contas.
» Primeiro passo: Vá em Configurações | Contas e clique em Adicionar um outro endereço de e-mail e adicione seu nome e e-mail(outra@conta.com).
» Segundo passo: Confirmação de e-mail. Apenas mande enviar a confirmação e confirme de seu outro e-mail.
» Ultimo Passo: No final ele irá pedir algumas configuração, que dependendo do caso você vai ter que se virar pra consegui !
No caso de uma conta GMail: Servidor POP:smtp.gmail.com porta:995
No caso de uma conta WebMail(UFT): Servidor POP:webmail.uft.edu.br porta:110
Crie marcadores a seu gosto ! Eles servem para organizar suas mensagens. Dê uma olhada também em Marcadores, Filtros e Encaminhamento POP
*** RSS ***
» RSS Portal C++
» RSS CACCOMP
» RSS Alma do Negócio
» RSS BR-Linux.org
» RSS INFO Online
Como você faria para acompanhar todos estes sites de notícias ?! O jeito mais fácil é ter um leitor RSS e cadastrá-los. Se você já tem uma conta da Google basta usar o reader. Além de organizar as notícias você poderá fazer uma seleção e torná-la pública: RSS WebSite.
*** Blog e Página ***
Assim como eu criei meu Blog e minha Página, você também poderá criar gratuitamente.
Aqui vai meu convite: Faça um blog ou página e o torne seu currículo online.
Ajude a mudar a escassez de material de estudo (realidade do Brasil) contribuindo um pouquinho, uma vez ou outra.
Se um material já existe, comente, dê um link do mesmo e contribua com algum exemplo que ainda não foi explorado pelo autor.
A muito tempo eu venho querendo fazer isso (Portal C++ 04/02/2006) e encontrei no Blog e Pages as ferramentas adequadas para isto. Não comentei sobre o WordPress, mas também é muito bom.
*** Mais Link's ***
» Wikipédia - Enciclopédia Digital
» HowStuffWorks - Como funciona
» HackerTeen - Profissionalizando jovens para o bem. gibi.
O objetivo da Internet não é de alienar as pessoas como a TV tem feito e nem de proporcionar um ambiente virtual de fraudes e roubos. Desfrute com sabedoria !
---
Pode até serem dicas fraquinhas, mas é bom que todos saibam !
Se você conhece um site legal contribua com um comentário ;)
Postado por
Diogo_RBG
0
comentários
Tópicos: dicas
