Super Thiagout (Breakout) - O Jogo
Publicado por Thiago Henrique Hüpner (última atualização em 10/11/2014)
[ Hits: 4.119 ]
Homepage:
Hey pessoas, hoje trago-lhes um joguinho que fiz em SDL, fui desafiado pelo Samuel L e consegui fazer o jogo, mas para evitar zoações (cara, o título já é ridículo e você não quer ser alvo de zoações!?), pedi para o Sam dar uma verificada e corrigir eventuais erros.
Se desejarem, posso fazer um artigo sobre esse joguinho e até mesmo fazer um artigo sobre esse joguinho usando OpenGL (se desejarem).
Ou ainda fazer esse joguinho com um menu.
Seta para direita ou esquerda move a raquete e inicia o jogo.
Bom divertimento.
Obs.: fui desafiado a colocar "aquele" nome.
[]'s
T+
#include <iostream> // Entrada e Saida #include <cstdlib> // EXIT_SUCCESS e EXIT_FAILURE #include <SDL/SDL.h> // SDL #include <ctime> // Rand() #define LARGURA 390 #define ALTURA 300 #define pLARGURA 13 #define pALTURA 6 #define TAMANHO 10 #define VELOCIDADE 4 // tem que ser menor que metade do TAMANHO using namespace std; bool colisao(SDL_Rect a,SDL_Rect b); bool colisao(int x, int y, SDL_Rect b); struct Tijolo{ Tijolo(){ emJogo = true; retangulo.x = 0; retangulo.y = 0; retangulo.w = (3*TAMANHO); retangulo.h = TAMANHO * 1.5; cor = 0x00; } SDL_Rect retangulo; bool emJogo; Uint32 cor; }; struct Parede{ Parede(){ construaParede(); } void construaParede ( ){ tijolosEmJogo = 0; int i,j; for(i=0;i<pALTURA;i++){ for(j=0;j<pLARGURA;j++){ tijolo[i][j].retangulo.x = (j*(tijolo[i][j].retangulo.w)); tijolo[i][j].retangulo.y = (i*(tijolo[i][j].retangulo.h)); tijolosEmJogo++; } } } Tijolo tijolo[pALTURA][pLARGURA]; int tijolosEmJogo; }; struct Raquete{ Raquete(){ retangulo.x = (LARGURA-70)/2; retangulo.y = ALTURA-(2*TAMANHO); retangulo.w = 70; retangulo.h = TAMANHO; defineTamanhoBorda(2); atualizaPosicaoBorda(); velX = 0; cor = 0x00; } void defineTamanhoBorda ( int t ){ if (t <= 0) return; // borda de cima borda[0].w = retangulo.w; borda[0].h = t; // borda da direita borda[1].w = borda[0].h; borda[1].h = retangulo.h; // borda de baixo borda[2].w = borda[0].w; borda[2].h = borda[0].h; // borda da esquerda borda[3].w = borda[0].h; borda[3].h = retangulo.h; } void atualizaPosicaoBorda(){ // borda de cima borda[0].x = retangulo.x, borda[0].y = retangulo.y; // borda da direita borda[1].x = borda[0].x + borda[0].w - borda[0].h; borda[1].y = borda[0].y; // borda de baixo borda[2].x = borda[0].x; borda[2].y = borda[0].y + retangulo.h - borda[0].h; // borda da esquerda borda[3].x = borda[0].x, borda[3].y = borda[0].y; } void reiniciaPosicao(){ retangulo.x = (LARGURA-70)/2; retangulo.y = ALTURA-(2*TAMANHO); retangulo.w = 70; retangulo.h = TAMANHO; velX = 0; } void mover(){ retangulo.x = retangulo.x + velX; if(retangulo.x >= LARGURA - retangulo.w){ retangulo.x = LARGURA - retangulo.w; }else if(retangulo.x <= 0){ retangulo.x = 0; }else{ retangulo.x = retangulo.x; } atualizaPosicaoBorda(); } SDL_Rect retangulo; SDL_Rect borda[4]; Uint32 cor; Uint32 cor_borda; int velX; }; struct Bola{ Bola(){ retangulo.x = rand() % LARGURA; retangulo.y = ALTURA / 2 - (3*TAMANHO); retangulo.w = TAMANHO; retangulo.h = TAMANHO; velX = 0; velY = 0; estaParada = true; cor = 0x00; vida = 5; } void reiniciaPosicao(){ retangulo.x = rand() % (LARGURA - TAMANHO); retangulo.y = ALTURA / 2 - (3*TAMANHO); retangulo.w = TAMANHO; retangulo.h = TAMANHO; velX = 0; velY = 0; } void mover(Parede &parede,Raquete &raquete,Bola &bola){ if(!estaParada && vida > -1){ retangulo.x += velX; if(retangulo.x >= LARGURA - retangulo.w){ retangulo.x = LARGURA - retangulo.w; velX = -VELOCIDADE; }else if(retangulo.x <= 0){ retangulo.x = 0; velX = VELOCIDADE; } retangulo.y += velY; if(retangulo.y >= ALTURA - retangulo.h){ estaParada = true; reiniciaPosicao(); raquete.reiniciaPosicao(); (vida <= 0)?vida = -1:--vida; cout << "Vidas Restantes : " << vida << endl; }else if(retangulo.y <= 0){ retangulo.y = 0; velY = VELOCIDADE; } if(colisao(retangulo,raquete.retangulo)){ velY = -VELOCIDADE; // move a bola para fora da raquete retangulo.y = raquete.retangulo.y - retangulo.h; } if (colideComTijolo(parede) > -1){ parede.tijolosEmJogo--; if (parede.tijolosEmJogo <= 0){ cout << "FIM DO JOGO\n"; reiniciaPosicao(); raquete.reiniciaPosicao(); } } } } int colideComTijolo ( Parede & parede ){ int i, j; int x, y; for(i = 0;i<pALTURA;i++){ for(j = 0;j<pLARGURA;j++){ if(parede.tijolo[i][j].emJogo){ // meio da lateral superior x = retangulo.x + retangulo.w / 2; y = retangulo.y; if (colisao(x, y, parede.tijolo[i][j].retangulo)){ parede.tijolo[i][j].emJogo = false; velY = VELOCIDADE; retangulo.y = parede.tijolo[i][j].retangulo.y + parede.tijolo[i][j].retangulo.h; return 0; } // meio da lateral direita x = retangulo.x + retangulo.w; y = retangulo.y + retangulo.h / 2; if (colisao(x, y, parede.tijolo[i][j].retangulo)){ parede.tijolo[i][j].emJogo = false; velX = -VELOCIDADE; retangulo.x = parede.tijolo[i][j].retangulo.x - retangulo.w; return 1; } // meio da lateral inferior x = retangulo.x + retangulo.w / 2; y = retangulo.y + retangulo.h; if (colisao(x, y, parede.tijolo[i][j].retangulo)){ parede.tijolo[i][j].emJogo = false; velY = -VELOCIDADE; retangulo.y = parede.tijolo[i][j].retangulo.y - retangulo.h; return 2; } // meio da lateral esquerda x = retangulo.x; y = retangulo.y + retangulo.h / 2; if (colisao(x, y, parede.tijolo[i][j].retangulo)){ parede.tijolo[i][j].emJogo = false; velX = VELOCIDADE; retangulo.x = parede.tijolo[i][j].retangulo.x + parede.tijolo[i][j].retangulo.w; return 3; } } } } return -1; } SDL_Rect retangulo; Uint32 cor; int velX; int velY; int vida; bool estaParada; }; bool colisao(SDL_Rect a,SDL_Rect b){ if(a.y <= b.y+b.h && a.y+a.h >= b.y){ if(a.x <= b.x+b.w && a.x+a.w >= b.x){ return true; } } return false; } bool colisao(int x, int y, SDL_Rect b){ if (y >= b.y && y <= b.y + b.h){ if (x >= b.x && x <= b.x + b.w){ return true; } } return false; } bool controlaFPS ( Uint32 tempo_agora ){ static Uint32 fps = 1000/60; tempo_agora = SDL_GetTicks() - tempo_agora; if (tempo_agora < fps){ SDL_Delay(fps - tempo_agora); return true; } return false; } void desenhaNaTela(Parede &parede,Bola &bola,Raquete &raquete,SDL_Surface * tela){ int i,j; SDL_FillRect(tela,NULL,SDL_MapRGB(tela->format,255,255,255)); SDL_FillRect(tela,&bola.retangulo,SDL_MapRGB(tela->format,255,0,0)); SDL_FillRect(tela,&raquete.retangulo,SDL_MapRGB(tela->format,255,255,0)); for (i = 0; i < 4; i++) SDL_FillRect(tela, &raquete.borda[i], raquete.cor_borda); for(i = 0;i<pALTURA;i++){ for(j = 0;j<pLARGURA;j++){ if(parede.tijolo[i][j].emJogo) SDL_FillRect(tela,&parede.tijolo[i][j].retangulo,parede.tijolo[i][j].cor); } } } int main(){ srand((unsigned)time(NULL)); if(SDL_Init(SDL_INIT_EVERYTHING) != 0){ cout << "Erro : " << SDL_GetError() << endl; SDL_Quit(); return EXIT_FAILURE; } SDL_Event evento; SDL_Surface * tela = SDL_SetVideoMode(LARGURA,ALTURA,0,SDL_SWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT); if(tela == NULL){ cout << "Erro : " << SDL_GetError() << endl; SDL_Quit(); return EXIT_FAILURE; } SDL_WM_SetCaption("Super Thiagout - by Thihup.", NULL); Parede parede; Raquete raquete; Bola bola; bool estaRodando = true; int i,j; for(i = 0;i<pALTURA;i++){ for(j = 0;j<pLARGURA;j++){ parede.tijolo[i][j].cor = (SDL_MapRGB(tela->format,rand() % 256,rand() % 256,rand() % 256)); } } bola.cor = (SDL_MapRGB(tela->format,255,0,0)); raquete.cor = (SDL_MapRGB(tela->format,255,255,0)); raquete.cor_borda = (SDL_MapRGB(tela->format,0,0,0)); int teclaEsq = 0, teclaDir = 0; Uint32 tempo_agora; while(estaRodando){ tempo_agora = SDL_GetTicks(); while(SDL_PollEvent(&evento)){ switch(evento.type){ case SDL_QUIT: estaRodando = false; break; case SDL_KEYUP: switch(evento.key.keysym.sym){ case SDLK_LEFT: teclaEsq = 0; break; case SDLK_RIGHT: teclaDir = 0; break; default: break; } break; case SDL_KEYDOWN: switch(evento.key.keysym.sym){ case SDLK_ESCAPE: estaRodando = false; break; case SDLK_RIGHT: if(bola.vida != -1) { teclaDir = 1; if(bola.estaParada){ bola.estaParada = false; bola.velX = VELOCIDADE; bola.velY = VELOCIDADE; } } else teclaDir = 0; break; case SDLK_LEFT: if(bola.vida != -1) { teclaEsq = 1; if(bola.estaParada){ bola.estaParada = false; bola.velX = VELOCIDADE; bola.velY = VELOCIDADE; } } else teclaEsq = 0; break; default: break; } break; default: break; } } // se aperta tecla esquerda if (teclaEsq) raquete.velX = -VELOCIDADE; else if (teclaDir)// se aperta tecla direita raquete.velX = VELOCIDADE; else raquete.velX = 0; if (controlaFPS(tempo_agora)){ if(!bola.estaParada){ bola.mover(parede,raquete,bola); raquete.mover(); } desenhaNaTela(parede,bola,raquete,tela); SDL_Flip(tela); } } SDL_Quit(); return EXIT_SUCCESS; }
Boletim Escolar Com Manipulação de Arquivo
simples gerador de numeros primos
Nenhum comentário foi encontrado.
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
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (7)