Super Thiagout (Breakout) - O Jogo
Publicado por Thiago Henrique Hüpner (última atualização em 10/11/2014)
[ Hits: 4.122 ]
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; }
Testar o melhor método de organização C (inserção, bolha e shell-sort)
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? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)
Pendrive não formata de jeito nenhum (4)