Jogo Windows Invaders (com gráficos)
Publicado por Samuel Leonardo 19/01/2009
[ Hits: 9.941 ]
Homepage: localhost
Download Windows_Invaders.tar.gz
Fiz esse jogo baseado num banner da Red Bug que vi no VivaOLinux :).
No site da RedBug chama-se HD Invaders, mas decidi renomeá-lo para Windows Invaders. Para quem não conhece as imagens do HD Invaders são do jogo Galaga do NES e não do Space Invaders, outro jogo bem antigo.
OBS: faça antes o download das imagens do jogo, acompanha um versão pré-compilada.
Para compilar:
gcc -o windows_invaders windows_invaders.c -lSDL
Para executar:
./windows_invaders
t+!!!
/* ##feito em 18/01/2009 ####Jogo Windows Invaders (com graficos) ####Fiz esse jogo baseado num banner da Red Bug que vi no VivaOLinux :). ####No site da RedBug chama-se HD Invaders, mas decidi renomeá-lo para Windows Invaders. ####Para quem não conhece as imagens do HD Invaders são do jogo Galaga do NES e não do Space Invaders ####outro jogo bem antigo. ####OBS: faça antes o download das imagens do jogo, acompanha um versão pré-compilada. #### ####Para compilar: #### gcc -o windows_invaders windows_invaders.c -lSDL ####Para executar: #### ./windows_invaders #### #### t+!!! */ #include <stdio.h> #include <SDL/SDL.h> #define LIN_INVADERS 4 #define COL_INVADERS 10 #define VAZIO '.' #define WIN 'a' #define VELOCIDADE_NAVE 3 #define VELOCIDADE_BALA 6 #define VELOCIDADE_INVA 2 #define LARGURA 640 #define ALTURA 480 #define BPP 16 #define FLAGS (SDL_SWSURFACE | SDL_HWSURFACE | SDL_ANYFORMAT | SDL_SRCCOLORKEY | SDL_DOUBLEBUF) #define DELAY 15 SDL_Surface *screen, *nave, *windows, *bala, *espaco; SDL_Rect destino, projetil; int atirar = 0, velo_invaders = 2; int move_hor = 2, move_ver = 0;//move os invaders horizontal e verticalmente char mapa_invaders[LIN_INVADERS][COL_INVADERS] = { {"aaaaaaaaaa"}, {"aaaaaaaaaa"}, {"aaaaaaaaaa"}, {"aaaaaaaaaa"}, }; void Controla_FPS(int tempo) { tempo = SDL_GetTicks() - tempo; if(tempo < DELAY) SDL_Delay(DELAY - tempo); } //converte imagens no formato do screen SDL_Surface * FuncLoad(const char *loc_file) { SDL_Surface *tmp, *surf; tmp = SDL_LoadBMP(loc_file); if(!tmp) { printf("ERROR: %s\n",SDL_GetError()); return NULL; } surf = SDL_DisplayFormat(tmp); SDL_FreeSurface(tmp); SDL_SetColorKey(surf, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(surf->format, 0,0,0)); return surf; } void FuncUnload(void) { //descarrega imagens SDL_FreeSurface(windows); SDL_FreeSurface(nave); SDL_FreeSurface(bala); //finaliza a SDL SDL_Quit(); } //Função retirada da SDL_collid int Colisao(SDL_Rect *a, SDL_Rect *b) { if(a->x > b->x + b->w) return 0; if(a->x + a->w < b->x) return 0; if(b->y > a->y + a->h) return 0; if(b->y + b->h < a->y) return 0; return 1; } void BlitInvaders(SDL_Surface *img, int y, int x, int desloc_hor, int desloc_ver) { SDL_Rect posi; posi.y = img->h*y + desloc_ver; posi.x = img->w*x + desloc_hor; SDL_BlitSurface(img, NULL, screen, &posi); } void MoveInvaders(void) { int linha, coluna; // muda a direção dos invaders e move eles sobre o screen if(move_hor < 0) { velo_invaders = VELOCIDADE_INVA; move_ver = move_ver + windows->h/2; } else if(move_hor > (LARGURA - COL_INVADERS*windows->w)) { velo_invaders = -VELOCIDADE_INVA; move_ver = move_ver + windows->h/2; } move_hor = move_hor + velo_invaders; //blit dos invaders junto com o deslocamento vertical e horizontal for(linha = 0; linha < LIN_INVADERS; linha++) { for(coluna = 0; coluna < COL_INVADERS; coluna++) { switch(mapa_invaders[linha][coluna]) { case VAZIO: break; case WIN: BlitInvaders(windows, linha, coluna, move_hor, move_ver); break; } } } } //usar quando atirar for verdadeiro void DestroiInvaders(void) { SDL_Rect posicao; int linha, coluna; if(projetil.y - VELOCIDADE_BALA < 0) { atirar = 0; } for(linha = 0; linha < LIN_INVADERS; linha++) { posicao.y = windows->h*linha + move_ver; for(coluna = 0; coluna < COL_INVADERS; coluna++) { posicao.x = windows->w*coluna + move_hor; switch(mapa_invaders[linha][coluna]) { case VAZIO: break; case WIN: posicao.w = windows->w - 4; posicao.h = windows->h - 2; if(Colisao(&projetil, &posicao)) { mapa_invaders[linha][coluna] = VAZIO; atirar = 0; } break; } } } } int ControlaNave(int *x) { Uint8 *keyboard; SDL_PumpEvents(); keyboard = SDL_GetKeyState(0); /* Se user apertar seta Direita... */ if(keyboard[SDLK_RIGHT]) { /* ...Então faça velocidade da nave positiva. */ *x = VELOCIDADE_NAVE; } /* Se user apertar seta Esquerda... */ if(keyboard[SDLK_LEFT]) { /* ...Então faça velocidade da nave negativa */ *x = -VELOCIDADE_NAVE; } /* Se user apertar Barra de ESPAÇO e atirar for falso(nulo)... */ if((keyboard[SDLK_SPACE]) && (!atirar)) { /* ...Então faça, posicione a bala de acordo com a posição da nave e faça atirar verdadeiro(isso evita que ela desapareça do nada quando apertar mais de uma vez a Barra de espaço) */ projetil.y = destino.y + bala->h/2; projetil.x = destino.x + bala->w/2; atirar = 1; } return keyboard[SDLK_ESCAPE]; } //Função de scrolling, falta ajustar void FuncScroll(int x, int y) { SDL_Rect fonte; fonte.x = x; fonte.y = y; SDL_BlitSurface(espaco, NULL, screen, &fonte); } void MainLoop(void) { int fim = 0; int velocidade; //controle de velocidade da nave int scroll_x = 0, scroll_y = 0; int tempo_agora; SDL_WM_SetCaption("Windows_Invaders - by Sam L.", NULL); SDL_Event evento; while(!fim) { tempo_agora = SDL_GetTicks(); //para poder usar o botão fechar da janela, sem isso não funcionaria while(SDL_PollEvent(&evento)) if(evento.type == SDL_QUIT) fim = 1; //se user não estiver apertando esquerda ou direita, a velocidade será sempre 0 //ou seja a nave estará parada velocidade = 0; //ControleNave() retorna 0 se tecla ESC não for precionada, caso contrario retorna não nulo fim = ControlaNave(&velocidade); //move nave destino.x = destino.x + velocidade; //pinta o screen de preto, é meio inútil mas é necessário SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format,0,0,0)); //põe o fundo na tela e move ele scroll_y = scroll_y + 2; if(scroll_y >= espaco->h) { scroll_y = 0; } FuncScroll(scroll_x, scroll_y - espaco->h); FuncScroll(scroll_x, scroll_y); //move as imagens dos invaders(windows) MoveInvaders(); if(atirar) { projetil.y = projetil.y - VELOCIDADE_BALA; SDL_BlitSurface(bala, NULL, screen, &projetil); DestroiInvaders();//verifica se a bala acertou em algum dos invaders } SDL_BlitSurface(nave, NULL, screen, &destino); SDL_Flip(screen); Controla_FPS( tempo_agora ); } } int main(int argc, char *argv[]) { SDL_Init(SDL_INIT_VIDEO); //configura o video screen = SDL_SetVideoMode(LARGURA, ALTURA, BPP, FLAGS); if(!screen) { printf("\nERROR: %s\n",SDL_GetError()); SDL_Quit(); return 1; } //carrega as imagens nave = FuncLoad("Imagens/nave.bmp"); windows = FuncLoad("Imagens/windows.bmp"); espaco = FuncLoad("Imagens/espaco.bmp"); bala = FuncLoad("Imagens/bala.bmp"); //posicionando a nave na tela, posição inicial destino.x = (screen->w - nave->w/2)/2; destino.y = (screen->h - nave->h*2); //Loop principal MainLoop(); //Descarregar as imagens e finalizar a SDL FuncUnload(); return 0; }
Árvore de busca binária com frequência de consultas
Fibbonacci com Memoization - O(n)
Rotina para controle de portas paralelas em C. (biblioteca LP.h)
Arquivos utilizados no artigo: "Desenvolvendo um plugin para o XMMS"
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Problemas ao instalar o PHP (8)
Linux não é para todo mundo (12)