Ajude a sustentar a Wikipédia e outros projetos, sem colocar a mão no bolso, e concorra a um Eee PC!
…e também a pen drives, card drives, camisetas geeks, livros e mais! O BR-Linux e o Efetividade lançaram uma campanha para ajudar a Wikimedia Foundation e outros mantenedores de projetos que usamos no dia-a-dia on-line. Se você puder doar diretamente, ou contribuir de outra forma, são sempre melhores opções. Mas se não puder, veja as regras da promoção e participe - quanto mais divulgação, maior será a doação do BR-Linux e do Efetividade, e você ainda concorre a diversos brindes!
Como o texto da promoção sugere, você pode participar ou ajudar de muitas formas. Ajudar a Wikipédia diretamente com doações e contribuições ou simplesmente ajudar a divulgar a campanha.
---
É claro que não deixaria de participar desta promoção... e você ? já tá participando ?!
Em breve terei um artigo original, como mencionado por Augusto Campos no BR-Linux, e será muito interessante (pra felicidade de todos !).
.:: 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
segunda-feira, 7 de julho de 2008
Ajude a Wikipédia e concorra a um Eee PC!
Postado por
Diogo_RBG
0
comentários
Tópicos: dicas
segunda-feira, 23 de junho de 2008
Controle de tempo e Frame Rate
int t1,t2, delay; void logica(int t1){ class Timer {
Uma das primeiras preocupações quando se vai trabalhar em um jogo é com a taxa de FPS. (Frames per second ou Frame Rate)
Não há segredo algum em limitar a taxa de FPS, e isto pode ser feito facilmente caso seja o desejado.
» Post Completo....:: Limitar ou não ::.
Limitar a taxa de frames pode servir apenas para não desgastar o processador.
É claro que pode servir para sincronizar o tempo no jogo, mas isso não pode influenciar na jogabilidade. Digo que você pode querer usar os frames para controlar a animação e os estados do jogo e que pode até funcionar se seu jogo for bem simples.
Uma implementação por frames trás resultados negativos em algumas ocasiões:
» Quando o PC é muito lento e não consegue processar a quantidade de frames que você previa. O jogador não perde nenhum detalhe da animação, mas o jogo fica lento.
» Tudo no seu jogo será medido em frames e você terá dificuldades em aumentar ou diminuir o frame rate.
» Em algumas ocasiões um só frame não será suficiente e você terá que contá-los. Acredite, nesta ocasião o controle por tempo ganha em disparado de incrementos por interação.
.:: Frame Rate em SDL ::.
Em SDL usamos a função SDL_GetTicks() para saber quantos milissegundos se passaram. SDL_GetTicks() começa a contar assim que a SDL é inicializada. Você só não pode esquecer de inicializar a SDL passando SDL_INIT_TIMER para SDL_Init().
Para limitar a taxa de frames eu só preciso saber o tempo antes (t1) e depois (t2) da execução da lógica do jogo e logo depois esperar o restante do tempo com SDL_Delay().
delay = 25; //- 1000/25 = 40 FPS
t1 = SDL_GetTicks();
while(bLoop){
while(SDL_PollEvent(&sdlEvent)){
//- loop de eventos
}
logica();
//- calcula os milissegundos passados
t2 = SDL_GetTicks() - t1;
if(t2 < delay){
//- espera o resto do tempo
SDL_Delay(delay - t2);
}
t1 = SDL_GetTicks();
SDL_Flip(screen);
}
A tela é atualizada com SDL_Flip() que entra na contagem como sendo do próximo frame. Faço isso para não perder nenhum milissegundo.
.:: Trabalhando com tempo ::.
O tempo é algo que não pode ser simulado em uma só interação ! E caso você não concorde comigo eu explico melhor.
Eu posso percorrer todos os valores de uma variável em um loop e gerar meu resultado de uma só vez. Mas se minha variável for um valor de tempo seria inútil fazer isto. Pois não quero um resultado gerado todo de uma só vez... eu não teria movimento !
A regra pra se programar um jogo é "Tudo ao seu tempo". E embora eu já esteja filosofando demais, eu gostaria que você tivesse isto em mente. Tente imaginar este outro ponto de vista, pois é muito importante.
O tempo entre cada frame de um jogo costuma ser constante, mas isso não significa que a animação também deverá ser. Movimento acelerado é um truque escondido na manga, e pode dar uma impressão realista de movimento como se fosse mágica.
As funções seno e cosseno podem ajudar muito neste momento:
SDL_Rect ret, xy;
float f;
// Limpando a tela e criando o piso.
SDL_FillRect(screen, NULL, 0x000000);
ret = (SDL_Rect){0, 300+img->h, 640, 32};
SDL_FillRect(screen, &ret, 0x008000);
// Usando o tempo para encontrar um valor para o deslocamento x
f = cos(t1/1000.0);
xy.x = f*250.0 + 304;
// Usando o tempo para encontrar um valor positivo para o deslocamento y
f = cos(t1/750.0);
if(f<0) f = -f;
xy.y = -f*200.0 + 300;
SDL_BlitSurface(img,0,screen,&xy);
}
Imagem de todas as posições assumidas por nosso smiley.
Usar tempo em um jogo é um pouco mais complexo.
Nosso smiley não estaria pulando o tempo todo. Ele estaria em repouso e quando fosse dado o comando para pular faríamos:
» Mudar o estado para pulando.
» Pegar o startTicks. Que é o instante em que foi dado o comando.
» Deslocar nosso smiley em função do tempo. SDL_GetTicks() - startTicks.
» Mudar o estado de volta para repouso quando ele estiver em terra firme.
.:: Controle de tempo ::.
Acho que agora você já entendeu o porque de usar tempo e já deve estar pensando de forma diferente. Mas para que você possa fazer isso sem traumas é preciso de uma classe assistente.
O que aconteceria se você tivesse que pausar o jogo ? Como fazer isso sem ter que tratar o tempo pausado em todos os seus objetos e personagens animados ?! Para isso iremos trabalhar com um objeto timer... o nosso cronometro.
Assim como uma música, que você pode tocar(start), pausar(pause) e parar(stop) é o funcionamento do Timer.
Este timer foi totalmente baseada na classe Timer do Lazy Foo'.
A classe Timer:
private:
int startTicks; // Tempo quando o Timer recebeu start().
int pausedTicks; // Tempo passado quando o Timer recebeu stop().
bool paused; // Ativo quando o Timer estiver em pausa.
bool started; // Ativo quando o Timer estiver ativo.
public:
Timer(); // Construtor
~Timer(); // Destrutor
void start(); // Iniciar a contagem do timer.
void stop(); // Parar a contagem.
void pause(); // Pausar a contagem.
void unPause(); // Continuar contagem.
int getTicks(); // Informa o tempo contado.
bool isStarted(); // Verifica se o Timer está rodando.
bool isPaused(); // Verifica se o Timer está pausado.
};
A classe timer trabalha internamente com SDL_GetTicks(), mas apenas quando chamamos por funções como: start(), pause() e getTicks(). Ela usa os atributos startTicks e pausedTicks para se localizar no tempo e não depende de alimentação por interações.
Você irá encontrar três bons exemplos de tudo que foi comentado aqui no arquivo "código fonte" disponível para download:
Exemplo1: Controle do Frame Rate.
Exemplo2: Um exemplo de animação usando um smiley e funções seno e cosseno.
Exemplo3: Código fonte da classe Timer. Junto com um exemplo e documentação.
.:: Link's ::.
Download: » código fonte
» Advanced Timers (Lazy Foo')
--
Depois de dois meses sem postar, estou aos poucos, retomando meu blog !
Postado por
Diogo_RBG
0
comentários
Tópicos: sdl
quinta-feira, 10 de abril de 2008
[Mini-curso] Programação de jogos 2D com SDL
Por incentivo do CACComp e do interesse de expansão do GrupoJ, estarei apresentando o mini-curso: Programação de jogos 2D com SDL.
Trata-se de aulas práticas e teóricas sobre como programar jogos 2D utilizando a biblioteca SDL e a linguagem C/C++.
Datas: 19/04, 26/04 e 03/05
Horário: 14:00 às 17:40
Local: Labin 09, Bloco III - UFT
Inscrição: R$ 3,00
Para fazer as inscrições procure o CACComp no Bloco III e corra porque as inscrições são limitadas.
» Post Completo....:: Ementa ::.
1 Introdução (19/04)
1.1 O que é e como surgiu
* Simple DirectMedia Layer
1.2 O que pode fazer
* Vídeo
* Eventos
* Áudio
* CD-ROM áudio
* instancias
* Timers
* Independência na ordenação da memória
1.3 Como e onde funciona.
* Linux
* Win32
* BeOS
1.4 Bibliotecas estensivas
* Imagem
* Textos
* Processamento Gráfico e Geometria
* Som
2 Trabalhando com SDL
2.1 Instalando e configurando o ambiente de programação
* Instalação pelo devpaks
* Instalação por código fonte no linux
* Configuração do projeto e compilação no Dev-Cpp (Windows)
* Configuração do projeto e compilação make e gcc (Linux)
2.2 Escrevendo o primeiro código
* Exemplo básico proposto pelo Dev-Cpp
2.3 Explicações mais detalhada da API da SDL (26/04)
* inicialização
* Modo de vídeo
* Manipulação de imagens
* Manipulação de eventos
* Atualização da tela e controle de FPS
2.4 API's extensivas
* SDL_Image (imagem)
* SDL_Ttf (texto)
* SDL_Gfx (Processamento Gráfico e Geometria)
* SDL_Mix (Som)
2.5 Exemplos e soluções para jogos
* A problemática dos jogos e algumas soluções
2.6 Apresentação da Implementação (03/05)
* Apresentação dos trabalhos desenvolvidos pelos alunos
.:: Downloads ::.
» Slides
» Slides 2
» Slides 3
» Código Fonte do primeiro dia
» Código da classe Sprite
» Código do jogo da velha
Postado por
Diogo_RBG
8
comentários
quinta-feira, 27 de março de 2008
SDL em Processamento de Imagens
Depois de muito tempo sem postar, estou de volta.
Desta vez não vou falar de teoria ou documentação, mas apenas de um exemplo prático de como utilizar SDL em Processamento de Imagens.
SDL não tem componentes gráficas, caixa de diálogo ou funções de acesso ao pixel, mas a gente pode improvisar.
Em SDL trabalhar com pixels é muito fácil e rápido.
Imagem 2D é com a SDL mesmo !
Download: » código fonte
Postado por
Diogo_RBG
4
comentários
quinta-feira, 7 de fevereiro de 2008
SDL_Surface - Introdução detalhada
typedef struct SDL_Surface { #include <SDL/SDL.h> SDL_Surface *img = NULL; SDL_Surface *aux, *img; int SDL_BlitSurface( SDL_BlitSurface(img, NULL, screen, NULL); SDL_Rect xy = {x,y,0,0}; SDL_Rect ret = {retx, rety, retw, reth};
Este post deveria ter vindo logo depois do primeiro sobre SDL (SDL - A Biblioteca dos Jogos 2D). Se você estava meio perdido esta leitura é recomendada.
A abordagem começa com os pixels e se estende até o blit completo ou parcial.
» Post Completo...*** SDL_Surface ***
É uma superfície gráfica (área de memória) que armazena uma imagem do tipo raster (ou bitmap, que significa mapa de bits).
A cada pixel (menor unidade de uma imagem) é atribuído uma cor. Para representar uma cor no padrão RGB pode-se utilizar um número variável de bits: 8bpp (8 bits por pixel), 16bpp, 24bpp ou 32bpp. Isto interfere diretamente na quantidade de cores que serão apresentadas e no tamanho do arquivo.
Esta é a estrutura da SDL_Surface:
Uint32 flags;
SDL_PixelFormat *format;
int w, h;
Uint16 pitch;
void *pixels;
SDL_Rect clip_rect;
int refcount;
} SDL_Surface;
Todos estes valores são apenas para leitura, exceto pixels. Nem sempre pixels está disponível para escrita, neste caso você deve usar SDL_LockSurface() e SDL_UnlockSurface() para ter acesso direto aos dados.
Uma curiosidade é saber como os pixels estão dispostos exatamente em *pixels. Uma imagem 3x3 de 24bpp possui pitch=12 e pixels[36]. w*h*bpp = 3*3*3 = 27, mas não é dessa forma que as coisas funcionam.
Observe a imagem:
Pode existir lixo no final de cada linha quando ela não for multipla de 32 bits (4 bytes), mas isto não é um bug, é apenas uma otimização. Logo o cálculo fica: pitch*h = 36
*** Screen ***
É através da SDL_Surface que tudo será apresentado ao usuário, e usualmente eu nomeio a superfície da tela como screen:
SDL_Surface *screen = NULL; //- Tela
int main(int argc, char *argv[]){
//- Inicializa a SDL -//
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER);
//- Inicializa a tela -//
screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE);
//- título da janela -//
SDL_WM_SetCaption("Aplicação SDL em 3 segundos !!!", NULL);
//- Atualiza a tela -//
SDL_Flip(screen);
//- Pausa de 3 segundos -//
SDL_Delay(3000);
//- Finaliza a SDL -//
SDL_Quit();
return 0;
}
» Incluí a biblioteca SDL. (Ela deve estar instalada)
» Criei um ponteiro para armazenar a superfície da tela (screen).
» Minha função main da maneira correta, exatamente como a SDL a espera.
» Inicializo a SDL
» Inicializo a tela. 640x480 e 32bpp é criada na memória.
» Define "Aplicação SDL em 3 segundos !!!" como título da janela.
» Mostra a superfície no vídeo. Se você estiver utilizando SDL_DOUBLEBUF esta função terá o papel crucial.
» Como ainda não estamos tratando eventos do teclado fiz uma pausa de 3 segundos para que a janela possa ser visualizada.
» Devemos inicializar e também finalizar a SDL.
» Retornar 0 indica que tudo ocorreu bem.
*** Imagens ***
Com SDL é fácil carregar (SDL_LoadBMP) e salvar (SDL_SaveBMP) imagens no formato BMP. Pena que o formato BMP não suporta mais que 24bpp, e isto nos limita a usar cor de transparência, já que não podemos carregar imagens com alpha. O formato PNG suporta alpha, mas não se pode carregar PNG com a função SDL_LoadBMP(), para isto devemos utilizar a lib SDL_Image (veremos mais à frente).
Trecho de código:
...
int main(int argc, char *argv[]){
//- Inicializa a SDL -//
...
//- carrega imagem -//
img = SDL_LoadBMP("img/imagem.bmp");
//- pinta imagem na em outra screen -//
SDL_BlitSurface(img,0,screen,0);
//- salvando a tela -//
SDL_SaveBMP(screen,"img/screen.bmp");
//- Atualiza a tela -//
SDL_Flip(screen);
//- Pausa de 3 segundos -//
SDL_Delay(3000);
//- limpando memória -//
SDL_FreeSurface( img );
//- Finaliza a SDL -//
SDL_Quit();
return 0;
}
» Em main inicializamos a SDL.
» Carregamos "img/imagem.bmp" com a função SDL_LoadBMP e guardamos seu ponteiro em img. Usar / é o mesmo que usar \\ e funciona no Windows e Linux. Caso a imagem não seja carregada verifique se seu nome está correto ou se o programa está sendo executado do local correto. system("pwd") ou system("dir") podem esclarecer o que digo.
» SDL_BlitSurface é capaz de pintar uma superfície sobre outra. Desta maneira a imagem será pintada completamente nas coordenadas 0x0 da imagem de destino.
» Com SDL_SaveBMP é fácil gravar uma screenshot do seu jogo !
» SDL_Flip e SDL_Delay para visualizarmos a janela.
» SDL_FreeSurface é utilizada para limpar a memória da imagem carregada.
» Por fim SDL_Quit e return 0;
Se você quiser ganhar performance em seu jogo não trabalhe com diferentes formatos de superfície (não estou falando dos formatos de arquivo). Toda vez que blita uma superfície de 24bpp em outra de 32bpp há uma conversão em tempo de blitagem, e para ganhar performance temos que deixar todas as superfícies convertidas em um único formato, o formato do display (nossa tela).
aux = SDL_LoadBMP("smiley.bmp");
SDL_SetColorKey(aux, SDL_SRCCOLORKEY, SDL_MapRGB(aux->format,0xff,0,0xff) );
img = SDL_DisplayFormatAlpha(aux);
SDL_FreeSurface(aux);
» O rosa 0xff00ff é setado como cor de transparência. (faça antes de converter pro display)
» SDL_DisplayFormatAlpha é chamado e converte a imagem para 32bpp e transforma a cor de transparência em uma camada de transparência.
» aux deve ser limpada, pois SDL_DisplayFormat cria uma nova superfície.
*** SDL_BlitSurface ***
Até agora só trabalhamos com SDL_BlitSurface em sua forma mais simples (imagem, NULL, imagem, NULL). Esta função tem diversas utilidades, tais como imprimir apenas parte de uma imagem em outra.
Analisando cuidadosamente temos:
SDL_Surface *src, //- Imagem de origem (imagem a pintar)
SDL_Rect *srcrect, //- Retângulo de corte. permite pintar
// parte dela.
SDL_Surface *dst, //- Imagem de destino (imagem modificada)
SDL_Rect *dstrect //- Coordenadas da imagem de origem.
);
A forma mais simples de uso é onde uma imagem é toda impressa em outra nas coordenadas de origem:
SDL_BlitSurface(img, NULL, screen, &xy);
SDL_Rect xy = {x,y,0,0};
SDL_BlitSurface(img, &ret, screen, &xy);
» Uma imagem não precisa estar realmente cortada para que se possa imprimir parte dela.
» A imagem de destino nunca irá mudar de tamanho para acomodar a imagem de origem.
» Só serão aproveitados o x e y do retângulo de destino, logo ele só servirá para posicionar onde a imagem será impressa.
» Você não poderá redimensionar ou rotacionar imagens com SDL_BlitSurface. Para isto use SDL_Gfx.
*** Link's ***
Download: » código fonte
» Surface Loading and Blitting
» Documentação da SDL (online)
Postado por
Diogo_RBG
5
comentários
